From 7841b59eefb59224a35dfe0f41d879ce6570b511 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 2 Nov 2022 17:35:19 +1000 Subject: [PATCH] Introduce ai2asm --- Makefile | 60 +- README.md | 134 +- ld/gamefiles.ntsc-final.inc | 4 +- ld/pd.ld | 50 + src/{game => ailists}/gailists.c | 84 +- src/ailists/mp_setupame.c | 46 + src/ailists/mp_setuparch.c | 38 + src/ailists/mp_setuparec.c | 153 + src/ailists/mp_setupark.c | 42 + src/ailists/mp_setupash.c | 46 + src/ailists/mp_setupate.c | 39 + src/ailists/mp_setupazt.c | 46 + src/ailists/mp_setupcat.c | 38 + src/ailists/mp_setupcave.c | 38 + src/ailists/mp_setupcrad.c | 145 + src/ailists/mp_setupcryp.c | 140 + src/ailists/mp_setupdam.c | 48 + src/ailists/mp_setupdepo.c | 38 + src/ailists/mp_setupdest.c | 38 + src/ailists/mp_setupdish.c | 38 + src/ailists/mp_setupear.c | 48 + src/ailists/mp_setupeld.c | 48 + src/ailists/mp_setupimp.c | 46 + src/ailists/mp_setupjun.c | 139 + src/ailists/mp_setuplam.c | 39 + src/ailists/mp_setuplee.c | 48 + src/ailists/mp_setuplen.c | 47 + src/ailists/mp_setuplip.c | 46 + src/ailists/mp_setuplue.c | 46 + src/ailists/mp_setupmp1.c | 171 + src/ailists/mp_setupmp10.c | 144 + src/ailists/mp_setupmp11.c | 159 + src/ailists/mp_setupmp12.c | 213 + src/ailists/mp_setupmp13.c | 124 + src/ailists/mp_setupmp14.c | 47 + src/ailists/mp_setupmp15.c | 172 + src/ailists/mp_setupmp16.c | 46 + src/ailists/mp_setupmp17.c | 55 + src/ailists/mp_setupmp18.c | 48 + src/ailists/mp_setupmp19.c | 48 + src/ailists/mp_setupmp2.c | 54 + src/ailists/mp_setupmp20.c | 48 + src/ailists/mp_setupmp3.c | 162 + src/ailists/mp_setupmp4.c | 136 + src/ailists/mp_setupmp5.c | 145 + src/ailists/mp_setupmp6.c | 46 + src/ailists/mp_setupmp7.c | 48 + src/ailists/mp_setupmp8.c | 48 + src/ailists/mp_setupmp9.c | 136 + src/ailists/mp_setupoat.c | 147 + src/ailists/mp_setupold.c | 39 + src/ailists/mp_setuppam.c | 48 + src/ailists/mp_setuppete.c | 63 + src/ailists/mp_setupref.c | 146 + src/ailists/mp_setuprit.c | 48 + src/ailists/mp_setuprun.c | 52 + src/ailists/mp_setupsev.c | 39 + src/ailists/mp_setupsevb.c | 39 + src/ailists/mp_setupsevx.c | 38 + src/ailists/mp_setupsho.c | 38 + src/ailists/mp_setupsilo.c | 39 + src/ailists/mp_setupstat.c | 38 + src/ailists/mp_setuptra.c | 38 + src/ailists/mp_setupuff.c | 46 + src/ailists/mp_setupwax.c | 46 + src/ailists/setupame.c | 4172 +++++++++++++++ src/ailists/setuparch.c | 39 + src/ailists/setuparec.c | 48 + src/ailists/setupark.c | 3179 ++++++++++++ src/ailists/setupash.c | 46 + src/ailists/setupate.c | 584 +++ src/ailists/setupazt.c | 2145 ++++++++ src/ailists/setupcat.c | 38 + src/ailists/setupcave.c | 4405 ++++++++++++++++ src/ailists/setupcrad.c | 40 + src/ailists/setupcryp.c | 39 + src/ailists/setupdam.c | 2952 +++++++++++ src/ailists/setupdepo.c | 3149 ++++++++++++ src/ailists/setupdest.c | 39 + src/ailists/setupdish.c | 6048 ++++++++++++++++++++++ src/ailists/setupear.c | 3394 ++++++++++++ src/ailists/setupeld.c | 3260 ++++++++++++ src/ailists/setupimp.c | 4092 +++++++++++++++ src/ailists/setupjun.c | 40 + src/ailists/setuplam.c | 39 + src/ailists/setuplee.c | 3953 ++++++++++++++ src/ailists/setuplen.c | 40 + src/ailists/setuplip.c | 5036 ++++++++++++++++++ src/ailists/setuplue.c | 3400 +++++++++++++ src/ailists/setupmp1.c | 39 + src/ailists/setupmp10.c | 41 + src/ailists/setupmp11.c | 39 + src/ailists/setupmp12.c | 39 + src/ailists/setupmp13.c | 39 + src/ailists/setupmp14.c | 39 + src/ailists/setupmp15.c | 39 + src/ailists/setupmp16.c | 39 + src/ailists/setupmp17.c | 39 + src/ailists/setupmp18.c | 39 + src/ailists/setupmp19.c | 39 + src/ailists/setupmp2.c | 39 + src/ailists/setupmp20.c | 39 + src/ailists/setupmp3.c | 46 + src/ailists/setupmp4.c | 46 + src/ailists/setupmp5.c | 39 + src/ailists/setupmp6.c | 39 + src/ailists/setupmp7.c | 38 + src/ailists/setupmp8.c | 42 + src/ailists/setupmp9.c | 39 + src/ailists/setupold.c | 44 + src/ailists/setuppam.c | 4811 ++++++++++++++++++ src/ailists/setuppete.c | 3305 ++++++++++++ src/ailists/setupref.c | 41 + src/ailists/setuprit.c | 4142 +++++++++++++++ src/ailists/setuprun.c | 39 + src/ailists/setupsev.c | 1967 +++++++ src/ailists/setupsevb.c | 39 + src/ailists/setupsevx.c | 39 + src/ailists/setupsevxb.c | 39 + src/ailists/setupsho.c | 3968 +++++++++++++++ src/ailists/setupsilo.c | 39 + src/ailists/setupstat.c | 1394 +++++ src/ailists/setuptra.c | 3910 ++++++++++++++ src/ailists/setupuff.c | 39 + src/ailists/setupwax.c | 2248 ++++++++ src/game/chrai.c | 8204 +----------------------------- src/game/chraiasm.s | 39 + src/game/chraicommands.c | 4423 +++++++++++++++- src/game/mplayer/mpaicommands.c | 7 - src/game/setup.c | 33 +- src/game/stagetable.c | 241 +- src/include/commands.h | 694 +-- src/include/constants.h | 6 - src/include/game/challenge.h | 1 - src/include/game/chrai.h | 1 - src/include/lib/ailist.h | 1 - src/include/types.h | 3 + src/lib/ailist.c | 614 --- src/lib/main.c | 12 +- src/lib/mema.c | 9 - src/setups/mp_setupame.c | 11 +- src/setups/mp_setuparch.c | 7 +- src/setups/mp_setuparec.c | 26 +- src/setups/mp_setupark.c | 7 +- src/setups/mp_setupash.c | 11 +- src/setups/mp_setupate.c | 7 +- src/setups/mp_setupazt.c | 11 +- src/setups/mp_setupcat.c | 7 +- src/setups/mp_setupcave.c | 7 +- src/setups/mp_setupcrad.c | 27 +- src/setups/mp_setupcryp.c | 25 +- src/setups/mp_setupdam.c | 6 +- src/setups/mp_setupdepo.c | 7 +- src/setups/mp_setupdest.c | 7 +- src/setups/mp_setupdish.c | 7 +- src/setups/mp_setupear.c | 11 +- src/setups/mp_setupeld.c | 11 +- src/setups/mp_setupimp.c | 11 +- src/setups/mp_setupjun.c | 23 +- src/setups/mp_setuplam.c | 7 +- src/setups/mp_setuplee.c | 11 +- src/setups/mp_setuplen.c | 11 +- src/setups/mp_setuplip.c | 11 +- src/setups/mp_setuplue.c | 11 +- src/setups/mp_setupmp1.c | 29 +- src/setups/mp_setupmp10.c | 29 +- src/setups/mp_setupmp11.c | 20 +- src/setups/mp_setupmp12.c | 34 +- src/setups/mp_setupmp13.c | 18 +- src/setups/mp_setupmp14.c | 7 +- src/setups/mp_setupmp15.c | 28 +- src/setups/mp_setupmp16.c | 15 +- src/setups/mp_setupmp17.c | 23 +- src/setups/mp_setupmp18.c | 16 +- src/setups/mp_setupmp19.c | 16 +- src/setups/mp_setupmp2.c | 19 +- src/setups/mp_setupmp20.c | 16 +- src/setups/mp_setupmp3.c | 27 +- src/setups/mp_setupmp4.c | 27 +- src/setups/mp_setupmp5.c | 26 +- src/setups/mp_setupmp6.c | 15 +- src/setups/mp_setupmp7.c | 16 +- src/setups/mp_setupmp8.c | 16 +- src/setups/mp_setupmp9.c | 15 +- src/setups/mp_setupoat.c | 22 +- src/setups/mp_setupold.c | 7 +- src/setups/mp_setuppam.c | 11 +- src/setups/mp_setuppete.c | 6 +- src/setups/mp_setupref.c | 23 +- src/setups/mp_setuprit.c | 11 +- src/setups/mp_setuprun.c | 20 +- src/setups/mp_setupsev.c | 7 +- src/setups/mp_setupsevb.c | 7 +- src/setups/mp_setupsevx.c | 7 +- src/setups/mp_setupsho.c | 6 +- src/setups/mp_setupsilo.c | 7 +- src/setups/mp_setupstat.c | 7 +- src/setups/mp_setuptra.c | 7 +- src/setups/mp_setupuff.c | 11 +- src/setups/mp_setupwax.c | 11 +- src/setups/setupame.c | 3104 +---------- src/setups/setuparch.c | 2 +- src/setups/setuparec.c | 16 +- src/setups/setupark.c | 2624 +--------- src/setups/setupash.c | 11 +- src/setups/setupate.c | 503 +- src/setups/setupazt.c | 1699 +------ src/setups/setupcat.c | 2 +- src/setups/setupcave.c | 3671 +------------ src/setups/setupcrad.c | 2 +- src/setups/setupcryp.c | 2 +- src/setups/setupdam.c | 2301 +-------- src/setups/setupdepo.c | 2646 +--------- src/setups/setupdest.c | 2 +- src/setups/setupdish.c | 5631 +------------------- src/setups/setupear.c | 2525 +-------- src/setups/setupeld.c | 2500 +-------- src/setups/setupimp.c | 3534 +------------ src/setups/setupjun.c | 2 +- src/setups/setuplam.c | 2 +- src/setups/setuplee.c | 3284 +----------- src/setups/setuplen.c | 2 +- src/setups/setuplip.c | 3941 +------------- src/setups/setuplue.c | 2538 +-------- src/setups/setupmp1.c | 2 +- src/setups/setupmp10.c | 2 +- src/setups/setupmp11.c | 2 +- src/setups/setupmp12.c | 2 +- src/setups/setupmp13.c | 7 +- src/setups/setupmp14.c | 2 +- src/setups/setupmp15.c | 2 +- src/setups/setupmp16.c | 2 +- src/setups/setupmp17.c | 7 +- src/setups/setupmp18.c | 2 +- src/setups/setupmp19.c | 2 +- src/setups/setupmp2.c | 2 +- src/setups/setupmp20.c | 7 +- src/setups/setupmp3.c | 14 +- src/setups/setupmp4.c | 11 +- src/setups/setupmp5.c | 2 +- src/setups/setupmp6.c | 2 +- src/setups/setupmp7.c | 2 +- src/setups/setupmp8.c | 2 +- src/setups/setupmp9.c | 2 +- src/setups/setupoat.c | 171 +- src/setups/setupold.c | 6 +- src/setups/setuppam.c | 4079 +-------------- src/setups/setuppete.c | 2806 +--------- src/setups/setupref.c | 2 +- src/setups/setuprit.c | 3601 +------------ src/setups/setuprun.c | 2 +- src/setups/setupsev.c | 1081 +--- src/setups/setupsevb.c | 7 +- src/setups/setupsevx.c | 2 +- src/setups/setupsevxb.c | 2 +- src/setups/setupsho.c | 3471 +------------ src/setups/setupsilo.c | 2 +- src/setups/setupstat.c | 1096 +--- src/setups/setuptra.c | 3294 +----------- src/setups/setupuff.c | 2 +- src/setups/setupwax.c | 1226 +---- tools/ai2asm/ai2asm.py | 2008 ++++++++ tools/ai2asm/commands.py | 345 ++ 263 files changed, 89079 insertions(+), 71659 deletions(-) rename src/{game => ailists}/gailists.c (99%) create mode 100644 src/ailists/mp_setupame.c create mode 100644 src/ailists/mp_setuparch.c create mode 100644 src/ailists/mp_setuparec.c create mode 100644 src/ailists/mp_setupark.c create mode 100644 src/ailists/mp_setupash.c create mode 100644 src/ailists/mp_setupate.c create mode 100644 src/ailists/mp_setupazt.c create mode 100644 src/ailists/mp_setupcat.c create mode 100644 src/ailists/mp_setupcave.c create mode 100644 src/ailists/mp_setupcrad.c create mode 100644 src/ailists/mp_setupcryp.c create mode 100644 src/ailists/mp_setupdam.c create mode 100644 src/ailists/mp_setupdepo.c create mode 100644 src/ailists/mp_setupdest.c create mode 100644 src/ailists/mp_setupdish.c create mode 100644 src/ailists/mp_setupear.c create mode 100644 src/ailists/mp_setupeld.c create mode 100644 src/ailists/mp_setupimp.c create mode 100644 src/ailists/mp_setupjun.c create mode 100644 src/ailists/mp_setuplam.c create mode 100644 src/ailists/mp_setuplee.c create mode 100644 src/ailists/mp_setuplen.c create mode 100644 src/ailists/mp_setuplip.c create mode 100644 src/ailists/mp_setuplue.c create mode 100644 src/ailists/mp_setupmp1.c create mode 100644 src/ailists/mp_setupmp10.c create mode 100644 src/ailists/mp_setupmp11.c create mode 100644 src/ailists/mp_setupmp12.c create mode 100644 src/ailists/mp_setupmp13.c create mode 100644 src/ailists/mp_setupmp14.c create mode 100644 src/ailists/mp_setupmp15.c create mode 100644 src/ailists/mp_setupmp16.c create mode 100644 src/ailists/mp_setupmp17.c create mode 100644 src/ailists/mp_setupmp18.c create mode 100644 src/ailists/mp_setupmp19.c create mode 100644 src/ailists/mp_setupmp2.c create mode 100644 src/ailists/mp_setupmp20.c create mode 100644 src/ailists/mp_setupmp3.c create mode 100644 src/ailists/mp_setupmp4.c create mode 100644 src/ailists/mp_setupmp5.c create mode 100644 src/ailists/mp_setupmp6.c create mode 100644 src/ailists/mp_setupmp7.c create mode 100644 src/ailists/mp_setupmp8.c create mode 100644 src/ailists/mp_setupmp9.c create mode 100644 src/ailists/mp_setupoat.c create mode 100644 src/ailists/mp_setupold.c create mode 100644 src/ailists/mp_setuppam.c create mode 100644 src/ailists/mp_setuppete.c create mode 100644 src/ailists/mp_setupref.c create mode 100644 src/ailists/mp_setuprit.c create mode 100644 src/ailists/mp_setuprun.c create mode 100644 src/ailists/mp_setupsev.c create mode 100644 src/ailists/mp_setupsevb.c create mode 100644 src/ailists/mp_setupsevx.c create mode 100644 src/ailists/mp_setupsho.c create mode 100644 src/ailists/mp_setupsilo.c create mode 100644 src/ailists/mp_setupstat.c create mode 100644 src/ailists/mp_setuptra.c create mode 100644 src/ailists/mp_setupuff.c create mode 100644 src/ailists/mp_setupwax.c create mode 100644 src/ailists/setupame.c create mode 100644 src/ailists/setuparch.c create mode 100644 src/ailists/setuparec.c create mode 100644 src/ailists/setupark.c create mode 100644 src/ailists/setupash.c create mode 100644 src/ailists/setupate.c create mode 100644 src/ailists/setupazt.c create mode 100644 src/ailists/setupcat.c create mode 100644 src/ailists/setupcave.c create mode 100644 src/ailists/setupcrad.c create mode 100644 src/ailists/setupcryp.c create mode 100644 src/ailists/setupdam.c create mode 100644 src/ailists/setupdepo.c create mode 100644 src/ailists/setupdest.c create mode 100644 src/ailists/setupdish.c create mode 100644 src/ailists/setupear.c create mode 100644 src/ailists/setupeld.c create mode 100644 src/ailists/setupimp.c create mode 100644 src/ailists/setupjun.c create mode 100644 src/ailists/setuplam.c create mode 100644 src/ailists/setuplee.c create mode 100644 src/ailists/setuplen.c create mode 100644 src/ailists/setuplip.c create mode 100644 src/ailists/setuplue.c create mode 100644 src/ailists/setupmp1.c create mode 100644 src/ailists/setupmp10.c create mode 100644 src/ailists/setupmp11.c create mode 100644 src/ailists/setupmp12.c create mode 100644 src/ailists/setupmp13.c create mode 100644 src/ailists/setupmp14.c create mode 100644 src/ailists/setupmp15.c create mode 100644 src/ailists/setupmp16.c create mode 100644 src/ailists/setupmp17.c create mode 100644 src/ailists/setupmp18.c create mode 100644 src/ailists/setupmp19.c create mode 100644 src/ailists/setupmp2.c create mode 100644 src/ailists/setupmp20.c create mode 100644 src/ailists/setupmp3.c create mode 100644 src/ailists/setupmp4.c create mode 100644 src/ailists/setupmp5.c create mode 100644 src/ailists/setupmp6.c create mode 100644 src/ailists/setupmp7.c create mode 100644 src/ailists/setupmp8.c create mode 100644 src/ailists/setupmp9.c create mode 100644 src/ailists/setupold.c create mode 100644 src/ailists/setuppam.c create mode 100644 src/ailists/setuppete.c create mode 100644 src/ailists/setupref.c create mode 100644 src/ailists/setuprit.c create mode 100644 src/ailists/setuprun.c create mode 100644 src/ailists/setupsev.c create mode 100644 src/ailists/setupsevb.c create mode 100644 src/ailists/setupsevx.c create mode 100644 src/ailists/setupsevxb.c create mode 100644 src/ailists/setupsho.c create mode 100644 src/ailists/setupsilo.c create mode 100644 src/ailists/setupstat.c create mode 100644 src/ailists/setuptra.c create mode 100644 src/ailists/setupuff.c create mode 100644 src/ailists/setupwax.c create mode 100644 src/game/chraiasm.s create mode 100755 tools/ai2asm/ai2asm.py create mode 100644 tools/ai2asm/commands.py diff --git a/Makefile b/Makefile index af796ac4b..ca93850d6 100644 --- a/Makefile +++ b/Makefile @@ -55,9 +55,9 @@ PAL = 0 # If any value is not big enough, the build system will tell you which one needs # to be changed and what to change it to. -ROMALLOCATION_DATA = 0x015000 -ROMALLOCATION_LIB = 0x038800 -ROMALLOCATION_GAME = 0x100000 +ROMALLOCATION_DATA = 0x00e000 +ROMALLOCATION_LIB = 0x024000 +ROMALLOCATION_GAME = 0x0d0000 # ROM_SIZE - The desired ROM size in megabytes. # @@ -227,6 +227,45 @@ O_FILES := \ $(LANG_O_FILES) \ $(PADS_O_FILES) \ $(TILES_O_FILES) \ + $(B_DIR)/ailists/gailistsasm.o \ + $(B_DIR)/ailists/setupdishasm.o \ + $(B_DIR)/ailists/setupameasm.o \ + $(B_DIR)/ailists/setupearasm.o \ + $(B_DIR)/ailists/setuparkasm.o \ + $(B_DIR)/ailists/setupeldasm.o \ + $(B_DIR)/ailists/setuppeteasm.o \ + $(B_DIR)/ailists/setupdepoasm.o \ + $(B_DIR)/ailists/setuplueasm.o \ + $(B_DIR)/ailists/setuplipasm.o \ + $(B_DIR)/ailists/setuptraasm.o \ + $(B_DIR)/ailists/setupcaveasm.o \ + $(B_DIR)/ailists/setupritasm.o \ + $(B_DIR)/ailists/setupaztasm.o \ + $(B_DIR)/ailists/setupdamasm.o \ + $(B_DIR)/ailists/setuppamasm.o \ + $(B_DIR)/ailists/setupimpasm.o \ + $(B_DIR)/ailists/setupleeasm.o \ + $(B_DIR)/ailists/setupshoasm.o \ + $(B_DIR)/ailists/setupwaxasm.o \ + $(B_DIR)/ailists/setupsevasm.o \ + $(B_DIR)/ailists/setupstatasm.o \ + $(B_DIR)/ailists/setupateasm.o \ + $(B_DIR)/ailists/mp_setuparecasm.o \ + $(B_DIR)/ailists/mp_setupcradasm.o \ + $(B_DIR)/ailists/mp_setupcrypasm.o \ + $(B_DIR)/ailists/mp_setupjunasm.o \ + $(B_DIR)/ailists/mp_setupmp1asm.o \ + $(B_DIR)/ailists/mp_setupmp3asm.o \ + $(B_DIR)/ailists/mp_setupmp4asm.o \ + $(B_DIR)/ailists/mp_setupmp5asm.o \ + $(B_DIR)/ailists/mp_setupmp9asm.o \ + $(B_DIR)/ailists/mp_setupmp10asm.o \ + $(B_DIR)/ailists/mp_setupmp11asm.o \ + $(B_DIR)/ailists/mp_setupmp12asm.o \ + $(B_DIR)/ailists/mp_setupmp13asm.o \ + $(B_DIR)/ailists/mp_setupmp15asm.o \ + $(B_DIR)/ailists/mp_setupoatasm.o \ + $(B_DIR)/ailists/mp_setuprefasm.o \ $(B_DIR)/assets/animations.o \ $(B_DIR)/assets/copyrightZ.o \ $(B_DIR)/assets/files/list.o \ @@ -715,6 +754,18 @@ $(B_DIR)/assets/files/%.o: $(B_DIR)/assets/files/% $(B_DIR)/assets/files/%.bin: $(B_DIR)/assets/files/%.elf $(TOOLCHAIN)-objcopy $< $@ -O binary +################################################################################ +# AI lists + +$(B_DIR)/ailists/%.elf: $(B_DIR)/ailists/%.o + TOOLCHAIN=$(TOOLCHAIN) tools/mksimpleelf $< $@ + +$(B_DIR)/ailists/%.bin: $(B_DIR)/ailists/%.elf + $(TOOLCHAIN)-objcopy $< $@ -O binary + +$(B_DIR)/ailists/%asm.s: $(B_DIR)/ailists/%.bin + tools/ai2asm/ai2asm.py $< > $@ + ################################################################################ # Miscellaneous @@ -769,6 +820,9 @@ $(B_DIR)/%.o: src/%.s @mkdir -p $(dir $@) cpp -P -Wno-trigraphs -I include -I include/PR -I src/include $(C_DEFINES) -D_LANGUAGE_ASSEMBLY -D_MIPSEB $< | $(AS) $(ASFLAGS) -o $@ +$(B_DIR)/ailists/%.o: $(B_DIR)/ailists/%.s + cpp -P -Wno-trigraphs -I include -I include/PR -I src/include $(C_DEFINES) -D_LANGUAGE_ASSEMBLY -D_MIPSEB $< | $(AS) $(ASFLAGS) -G 0 -o $@ + $(B_DIR)/assets/%.o: $(A_DIR)/%.c $(RECOMP_FILES) @mkdir -p $(dir $@) $(CC) -c $(CFLAGS) -o $@ $< diff --git a/README.md b/README.md index 761232d06..3bea72bed 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,52 @@ Nintendo's library contains several dozen video mode configurations, but only fo Camdraw code contains mostly unused code. They are functions for editing Perfect Head photos. Removing them frees up more memory. +## AI bytecode and interpreter replaced with ASM + +The retail game implements AI using a bytecode system as described: + +* Byte data representing AI commands is included in the stage's setup file (decomp implements this with C macros). +* The game engine interprets the bytecode at runtime, using bitwise operations to read each command's type and then execute a handler function based on the type. +* The handler function typically reads its parameters by doing further bitwise operations, before executing its action. +* Each handler moves a global "aioffset" forward by the size of the command. + +PDHP does the following: + +* The AI list macros are separated from the setup files. +* The AI list macros are compiled into the same bytecode as before. +* A new Python script called ai2asm then reads the compiled bytecode and converts them into assembly statements. +* The assembly statements are then compiled into machine code. +* The stage's machine code file is loaded into memory during stage load. +* When a character's AI is executed, the machine code is executed directly. + +Here's an example of original macros: + + u8 ailist_0009[] = { + set_action(MA_NORMAL, FALSE) + set_returnlist(CHR_SELF, GAILIST_IDLE_0009) + stop_chr + + label(0x0c) + yield + goto_first(0x0c) + + endlist + }; + +And here's the ASM of the same ailist that it now produces during the build process (prior to assembler reordering): + + glabel ailist_0009 + li $a0, 0x01 + li $a1, 0 + jal aiSetAction + li $a0, 0xfd + li $a1, 0x0009 + jal aiSetReturnList + jal aiStop + .L0009_0c_00: + jal aiYield + b .L0009_0c_00 + ## Room preloading The retail game loads room graphics data on the fly, based on rooms near the player and the direction they're looking. These rooms are then unloaded when not needed. When loading a room, the game uses a blocking DMA call which results in a lag frame (or a few if loading several rooms). There's extra processing associated with this as well, such as unzipping the graphics data and scanning the display lists. @@ -48,93 +94,7 @@ Some stages have a bytecode script that overrides room visibility based on which PDHP removes the scripting entirely and implements the custom visibility logic directly in C. -## AI: dprint command removed - -All AI commands have a fixed-length, with the exception of the dprint command. The dprint command takes a variable-length string and prints it to the developer's console. - -PDHP removes all uses of the command, which allows it to optimise the "how long is this command" function. In fact it's no longer a function at all, but a direct lookup into an array. - -## AI: Pointers for AI offsets - -Characters keep track of where they are in their AI processing by storing a pointer to their current AI "list", as well as an integer byte offset within that list. These have to be added together to read their current command, and then again for the next commnd and so on. - -PDHP changes the aioffset value to be a pointer as well so it can be read directly, thus skipping the addition on each command invocation. - -## AI: Preprocessing gotos and labels - -In the retail game, AI command lists have a "label" command which is just a marker in the command list. Other commands can conditionally or unconditionally jump to a label. To implement this, the C engine has to iterate through the commands to find the label. - -PDHP changes this so the goto statements specify a byte offset instead, and the labels are removed. When taking a branch, the C engine can now jump directly to the offset instead of searching for the label. This is achieved by preprocessing and rewriting each AI list during stage load. - -## AI: Excessive reads and writes to g_Vars properties removed - -In the retail game, the AI execution engine looks somewhat like this (simplified): - - while (g_Vars.ailist) { - u8 *cmd = g_Vars.ailist + g_Vars.aioffset; - s32 type = cmd[0] << 8 | cmd[1]; - - yielding = g_CommandHandlers[type](); - - if (yielding) { - break; - } - } - -And a minimal handler looks like this: - - bool aiSomeHandler(void) - { - u8 *cmd = g_Vars.ailist + g_Vars.aioffset; - - // do something with cmd here - - g_Vars.aioffset += 2; // or more if command has parameters - - return false; - } - -PDHP does a few improvements in this area: - -* The handlers now accept an argument which is a pointer to the command being processed. -* The handlers increment the given command pointer and return it without writing it back to g_Vars. - * Unless the handler wants to yield, in which case it returns NULL. -* The loop code reuses the command pointer from the previous invocation. -* The loop code removes the unnecessary test on `g_Vars.ailist`. - -The new loop runner code looks like this: - - u8 *cmd = g_Vars.aioffset; - - do { - s32 type = (cmd[0] << 8) | cmd[1]; - cmd = g_CommandPointers[type](cmd); - } while (cmd); - -And a new handler looks like this: - - u8 *aiSomeHandler(u8 *cmd) - { - // do something with cmd here - - cmd += 2; // or more if command has parameters - - return cmd; - } - -## AI: Single byte command IDs - -The AI loop typically has to load two bytes (two lbu instructions) from the command pointer and bitwise-or them together to get the command type/ID. It can't use a single load-half instruction because the data is not aligned. - -PDHP improves this by issuing new IDs to all the commands. All commands have been categorised into into critical and non-critical commands based on the number of usages and whether they occur during main gameplay (as opposed to during cutscenes or level startup). PDHP makes it so critical commands can be identified by the first byte only, while non-critical commands will have 0xff as the first byte and then use the second byte to identify them. What this means is that the vast majority of commands that are run during gameplay are identified and executed using a single lbu instruction, which is almost as good as having single-byte command IDs. - -Additionally, commands which are not used or are unreachable have been completely removed. - -## AI: Inlined handlers - -PDHP moves all AI command handler functions in the same file as the AI loop, adds the `static` keyword on all of the handler functions, and implements them as a switch rather than a lookup array. The compiler (gcc) inlines them into the main AI loop. - -## AI: Timer comparisons changed to integers +## AI Timer comparisons changed to integers Each character maintains a timer which can be used for AI purposes. The timer is stored as an integer, where each unit is one 60th of a second. When AI scripting wants to set or check the timer, it specifies an integer value in 60ths of a second as well. diff --git a/ld/gamefiles.ntsc-final.inc b/ld/gamefiles.ntsc-final.inc index b722e84c0..0893b06d5 100644 --- a/ld/gamefiles.ntsc-final.inc +++ b/ld/gamefiles.ntsc-final.inc @@ -88,6 +88,8 @@ build/ROMID/game/body.o (section); \ build/ROMID/game/chraction.o (section); \ build/ROMID/game/chrai.o (section); \ + build/ROMID/game/chraiasm.o (section); \ + build/ROMID/game/chraicommands.o (section); \ build/ROMID/game/prop.o (section); \ build/ROMID/game/propobj.o (section); \ build/ROMID/game/propobjbss.o (section); \ @@ -147,7 +149,7 @@ build/ROMID/game/debug.o (section); \ build/ROMID/game/debug3.o (section); \ build/ROMID/game/stubs/game_11eff0.o (section); \ - build/ROMID/game/gailists.o (section); \ + build/ROMID/ailists/gailistsasm.o (section); \ build/ROMID/game/modeldata/general.o (section); \ build/ROMID/game/modeldata/basic.o (section); \ build/ROMID/game/modeldata/chrgun.o (section); \ diff --git a/ld/pd.ld b/ld/pd.ld index 3fc7755d1..2fc25e78a 100644 --- a/ld/pd.ld +++ b/ld/pd.ld @@ -58,6 +58,17 @@ } \ END_SEG(font##name) +#define AILISTS_SEG(name) \ + __rampos = _gameSegmentEnd; \ + BEGIN_SEG(name) \ + { \ + build/ROMID/ailists/name.o (.text); \ + build/ROMID/ailists/name.o (.data); \ + build/ROMID/ailists/name.o (.rodata); \ + . = ALIGN(0x10); \ + } \ + END_SEG(name) + /** * Placeholder segments are used to mark the * locations where zipped content will go. @@ -282,6 +293,45 @@ SECTIONS __rompos = _inflateSegmentRomEnd + ROMALLOCATION_GAME; + AILISTS_SEG(setupdishasm) + AILISTS_SEG(setupameasm) + AILISTS_SEG(setupearasm) + AILISTS_SEG(setuparkasm) + AILISTS_SEG(setupeldasm) + AILISTS_SEG(setuppeteasm) + AILISTS_SEG(setupdepoasm) + AILISTS_SEG(setuplueasm) + AILISTS_SEG(setuplipasm) + AILISTS_SEG(setuptraasm) + AILISTS_SEG(setupcaveasm) + AILISTS_SEG(setupritasm) + AILISTS_SEG(setupaztasm) + AILISTS_SEG(setupdamasm) + AILISTS_SEG(setuppamasm) + AILISTS_SEG(setupimpasm) + AILISTS_SEG(setupleeasm) + AILISTS_SEG(setupshoasm) + AILISTS_SEG(setupwaxasm) + AILISTS_SEG(setupsevasm) + AILISTS_SEG(setupstatasm) + AILISTS_SEG(setupateasm) + AILISTS_SEG(mp_setuparecasm) + AILISTS_SEG(mp_setupcradasm) + AILISTS_SEG(mp_setupcrypasm) + AILISTS_SEG(mp_setupjunasm) + AILISTS_SEG(mp_setupmp1asm) + AILISTS_SEG(mp_setupmp3asm) + AILISTS_SEG(mp_setupmp4asm) + AILISTS_SEG(mp_setupmp5asm) + AILISTS_SEG(mp_setupmp9asm) + AILISTS_SEG(mp_setupmp10asm) + AILISTS_SEG(mp_setupmp11asm) + AILISTS_SEG(mp_setupmp12asm) + AILISTS_SEG(mp_setupmp13asm) + AILISTS_SEG(mp_setupmp15asm) + AILISTS_SEG(mp_setupoatasm) + AILISTS_SEG(mp_setuprefasm) + /*************************************************************************** * garbage * ------------------------------------------------------------------------- diff --git a/src/game/gailists.c b/src/ailists/gailists.c similarity index 99% rename from src/game/gailists.c rename to src/ailists/gailists.c index a85721389..cba37e677 100644 --- a/src/game/gailists.c +++ b/src/ailists/gailists.c @@ -15,6 +15,8 @@ * guard combat. */ +struct ailist *tmp = g_GlobalAilists; + /** * @ailist GAILIST_IDLE */ @@ -2778,7 +2780,7 @@ u8 func0007_alerted[] = { label(LABEL_TARGETGONE) set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00002000) stop_chr - if_chr_deadish(CHR_SELF, /*goto*/ 0x16) + if_chr_deadish(CHR_SELF, /*goto*/ 0x0a) if_can_see_target(/*goto*/ 0x13) set_alertness(0) set_self_flag_bankx(CHRFLAG1_SEARCHSAMEROOM, BANK_1) @@ -3021,62 +3023,47 @@ u8 func000d_init_combat[] = { * @ailist GAILIST_COMBAT_WITH_TARGET */ u8 func000c_combat_with_target_chr[] = { + label(0xbb) if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x16) label(0x13) -#endif if_target_is_player(/*goto*/ 0x13) goto_next(0x16) label(0x13) if_stage_is_not(STAGE_WAR, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_DEEPSEA, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_DEFENSE, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_WAR, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_ESCAPE, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_ATTACKSHIP, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_CRASHSITE, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) // Solo mode, or co-op/counter-op on any other stage @@ -3119,13 +3106,10 @@ u8 func000c_combat_with_target_chr[] = { label(0x13) if_num_times_shot_lt(1, /*goto*/ 0xb2) if_just_injured(CHR_SELF, /*goto*/ 0x16) -#if VERSION >= VERSION_NTSC_1_0 if_has_gun(CHR_SELF, /*goto*/ 0xb2) set_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) -#endif goto_next(0xb2) - // Injured label(0x16) restart_timer @@ -3140,9 +3124,7 @@ u8 func000c_combat_with_target_chr[] = { label(0x16) if_chr_stopped(/*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_timer_gt(180, /*goto*/ 0x13) -#endif endloop(0x1d) label(0x13) @@ -3179,59 +3161,43 @@ u8 func000c_combat_with_target_chr[] = { label(0xb3) if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16) -#if VERSION >= VERSION_NTSC_1_0 label(0x13) -#endif if_target_is_player(/*goto*/ 0x13) goto_next(0x16) label(0x13) if_stage_is_not(STAGE_WAR, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_DEEPSEA, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_DEFENSE, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_WAR, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_ESCAPE, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_ATTACKSHIP, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) if_stage_is_not(STAGE_CRASHSITE, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_num_human_players_lt(2, /*goto*/ 0x13) -#endif goto_next(0x16) label(0x13) @@ -3306,6 +3272,9 @@ u8 func000c_combat_with_target_chr[] = { if_chr_in_view(/*goto*/ 0xbb) goto_first(0xb4) + label(0xbb) + goto_first(0xbb) + label(0xb5) restart_timer try_run_to_target(/*goto*/ 0xbc) @@ -3316,14 +3285,10 @@ u8 func000c_combat_with_target_chr[] = { goto_next(0xc0) label(0x13) -#if VERSION >= VERSION_NTSC_1_0 if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x13) -#endif if_can_see_attack_target(/*goto*/ 0xbf) -#if VERSION >= VERSION_NTSC_1_0 label(0x13) -#endif if_timer_gt(120, /*goto*/ 0xc0) endloop(0xbc) @@ -3438,7 +3403,6 @@ u8 func000c_combat_with_target_chr[] = { say_quip(CHR_BOND, QUIP_ATTACK3, 0x19, 0x02, 0xff, BANK_0, 0x00, 0x00) say_quip(CHR_BOND, QUIP_ATTACK4, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) -#if VERSION >= VERSION_NTSC_1_0 beginloop(0xe2) if_chr_deadish(CHR_TARGET, /*goto*/ 0xc1) if_chrpresets_target_is_different(/*goto*/ 0x16) @@ -3447,15 +3411,6 @@ u8 func000c_combat_with_target_chr[] = { label(0x16) if_chr_stopped(/*goto*/ 0xc1) endloop(0xe2) -#else - if_chr_deadish(CHR_TARGET, /*goto*/ 0xc1) - if_chrpresets_target_is_different(/*goto*/ 0xe2) - goto_next(0xc1) - - beginloop(0xe2) - if_chr_stopped(/*goto*/ 0xc1) - endloop(0xe2) -#endif label(0x13) restart_timer @@ -3538,39 +3493,25 @@ u8 func000c_combat_with_target_chr[] = { goto_next(0xc5) label(0x13) -#if VERSION >= VERSION_NTSC_1_0 if_enemy_distance_lt_and_los(400, /*goto*/ 0x15) if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x13) -#else - if_enemy_distance_lt_and_los(400, /*goto*/ 0x13) -#endif if_can_see_attack_target(/*goto*/ 0xca) -#if VERSION >= VERSION_NTSC_1_0 label(0x13) -#endif if_timer_gt(200, /*goto*/ 0x16) endloop(0xc9) label(0x16) -#if VERSION >= VERSION_NTSC_1_0 -#endif goto_first(0xb3) -#if VERSION >= VERSION_NTSC_1_0 label(0x15) -#else - label(0x13) -#endif goto_first(0xb5) label(0xa3) goto_first(0xc1) label(0xca) -#if VERSION >= VERSION_NTSC_1_0 restart_timer -#endif if_chr_is_skedar(CHR_SELF, /*goto*/ 0x16) goto_next(0x17) @@ -3579,9 +3520,7 @@ u8 func000c_combat_with_target_chr[] = { label(0x17) try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0xcb) -#if VERSION >= VERSION_NTSC_1_0 goto_next(0x16) -#endif label(0xcb) say_quip(CHR_BOND, QUIP_ATTACK3, 0x19, 0x02, 0xff, BANK_0, 0x00, 0x00) @@ -3617,9 +3556,6 @@ u8 func000c_combat_with_target_chr[] = { label(0x13) if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x13) -#if VERSION < VERSION_NTSC_1_0 - set_target_to_enemy_on_same_floor(/*goto*/ 0x16) -#endif label(0x13) goto_next(0xcf) @@ -3670,12 +3606,10 @@ u8 func000c_combat_with_target_chr[] = { label(0xcf) if_self_flag_bankx_eq(CHRFLAG0_CAMP, FALSE, BANK_0, /*goto*/ 0x13) -#if VERSION >= VERSION_NTSC_1_0 if_target_is_player(/*goto*/ 0x16) goto_next(0x13) label(0x16) -#endif return label(0x13) @@ -4720,6 +4654,7 @@ u8 func001d_search_for_player[] = { * @ailist GAILIST_RELATED_TO_SPAWNING */ u8 func001f_related_to_spawning[] = { + label(0x23) if_chr_deadish(CHR_SELF, /*goto*/ 0x13) goto_next(0x16) @@ -4775,6 +4710,9 @@ u8 func001f_related_to_spawning[] = { label(0x16) goto_first(0x1a) + label(0x23) + goto_first(0x23) + label(0x1e) say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) diff --git a/src/ailists/mp_setupame.c b/src/ailists/mp_setupame.c new file mode 100644 index 000000000..5b4e86f0e --- /dev/null +++ b/src/ailists/mp_setupame.c @@ -0,0 +1,46 @@ +// +// Defection +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuparch.c b/src/ailists/mp_setuparch.c new file mode 100644 index 000000000..2478e6ed1 --- /dev/null +++ b/src/ailists/mp_setuparch.c @@ -0,0 +1,38 @@ +// +// Stage ID 0x18 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuparec.c b/src/ailists/mp_setuparec.c new file mode 100644 index 000000000..42a668fff --- /dev/null +++ b/src/ailists/mp_setuparec.c @@ -0,0 +1,153 @@ +// +// Ravine (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + tag(0x00, 1) + lift(0x0100, MODEL_RAVINELIFT, PAD_AREC_00BC, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00bc, 0x00bb, 0x00ba, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + weapon(0x0200, MODEL_ROOFGUN, PAD_AREC_00BD, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00C7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00C8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0200, 0x0000, PAD_AREC_00BE, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00C9, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00CA, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0200, 0x0000, PAD_AREC_00BF, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00CB, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00CC, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_AREC_00C0, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00CD, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00CE, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_AREC_00C1, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00CF, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D0, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_AREC_00C2, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D1, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D2, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_AREC_00C3, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D3, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D4, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_AREC_00C4, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D5, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D6, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_AREC_00C5, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_AREC_00C6, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00D9, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_AREC_00DA, OBJFLAG_00000001, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00DB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00DD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00DE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00DF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00EB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00EC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00ED, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AREC_00EE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_AREC_00B0) + spawn(PAD_AREC_00B1) + spawn(PAD_AREC_00B2) + spawn(PAD_AREC_00B3) + spawn(PAD_AREC_00B4) + spawn(PAD_AREC_00B5) + spawn(PAD_AREC_00B6) + spawn(PAD_AREC_00B7) + spawn(PAD_AREC_00B8) + spawn(PAD_AREC_00B9) + hill(0x0066) + hill(0x008d) + hill(0x0071) + hill(0x007c) + hill(0x005c) + case(0, 0x009a) + case_respawn(0, 0x0094) + case_respawn(0, 0x0096) + case_respawn(0, 0x0097) + case_respawn(0, 0x0099) + case_respawn(0, 0x0098) + case_respawn(0, 0x0095) + case(1, 0x00a1) + case_respawn(1, 0x009b) + case_respawn(1, 0x009c) + case_respawn(1, 0x009d) + case_respawn(1, 0x009e) + case_respawn(1, 0x009f) + case_respawn(1, 0x00a0) + case(2, 0x00a8) + case_respawn(2, 0x00a2) + case_respawn(2, 0x00a3) + case_respawn(2, 0x00a4) + case_respawn(2, 0x00a5) + case_respawn(2, 0x00a6) + case_respawn(2, 0x00a7) + case(3, 0x00af) + case_respawn(3, 0x00a9) + case_respawn(3, 0x00aa) + case_respawn(3, 0x00ab) + case_respawn(3, 0x00ac) + case_respawn(3, 0x00ad) + case_respawn(3, 0x00ae) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_start_lift[] = { + activate_lift(1, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_1b30[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1b30, 0x1000 }, + { func1001_start_lift, 0x1001 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupark.c b/src/ailists/mp_setupark.c new file mode 100644 index 000000000..84ad2af2d --- /dev/null +++ b/src/ailists/mp_setupark.c @@ -0,0 +1,42 @@ +// +// Extraction +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupash.c b/src/ailists/mp_setupash.c new file mode 100644 index 000000000..db9d59704 --- /dev/null +++ b/src/ailists/mp_setupash.c @@ -0,0 +1,46 @@ +// +// Stage ID 0x2e +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupate.c b/src/ailists/mp_setupate.c new file mode 100644 index 000000000..62c256ce5 --- /dev/null +++ b/src/ailists/mp_setupate.c @@ -0,0 +1,39 @@ +// +// Duel +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupazt.c b/src/ailists/mp_setupazt.c new file mode 100644 index 000000000..a6e6379dc --- /dev/null +++ b/src/ailists/mp_setupazt.c @@ -0,0 +1,46 @@ +// +// Crash Site +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupcat.c b/src/ailists/mp_setupcat.c new file mode 100644 index 000000000..d4be4efe4 --- /dev/null +++ b/src/ailists/mp_setupcat.c @@ -0,0 +1,38 @@ +// +// Stage ID 0x28 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupcave.c b/src/ailists/mp_setupcave.c new file mode 100644 index 000000000..55509d349 --- /dev/null +++ b/src/ailists/mp_setupcave.c @@ -0,0 +1,38 @@ +// +// Air Base +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupcrad.c b/src/ailists/mp_setupcrad.c new file mode 100644 index 000000000..c91bca4ff --- /dev/null +++ b/src/ailists/mp_setupcrad.c @@ -0,0 +1,145 @@ +// +// Pipes (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_CRAD_00E2, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00EC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00ED, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E3, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00EE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00EF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E4, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E5, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F2, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F3, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E6, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E7, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E8, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00F9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00E9, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00FA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00FB, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00EA, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00FC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00FD, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRAD_00EB, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00FE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_CRAD_00FF, OBJFLAG_00000001, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_CRAD_0100, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + tag(0x01, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_CRAD_0104, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0104, 0x0103, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000005b0, 0x00050000, 0x00000000) + endprops +}; + +s32 intro[] = { + spawn(PAD_CRAD_00CD) + spawn(PAD_CRAD_00CE) + spawn(PAD_CRAD_00CF) + spawn(PAD_CRAD_00D0) + spawn(PAD_CRAD_00D1) + spawn(PAD_CRAD_00D2) + spawn(PAD_CRAD_00D3) + spawn(PAD_CRAD_00D4) + spawn(PAD_CRAD_00D5) + spawn(PAD_CRAD_00D6) + spawn(PAD_CRAD_00D7) + spawn(PAD_CRAD_00D8) + spawn(PAD_CRAD_00D9) + spawn(PAD_CRAD_00DA) + spawn(PAD_CRAD_00DB) + spawn(PAD_CRAD_00DC) + spawn(PAD_CRAD_00DD) + spawn(PAD_CRAD_00DE) + spawn(PAD_CRAD_00DF) + spawn(PAD_CRAD_00E0) + spawn(PAD_CRAD_00E1) + hill(0x0019) + hill(0x009e) + hill(0x0007) + hill(0x001b) + hill(0x001f) + case(0, 0x00b7) + case_respawn(0, 0x00b1) + case_respawn(0, 0x00b2) + case_respawn(0, 0x00b3) + case_respawn(0, 0x00b4) + case_respawn(0, 0x00b5) + case_respawn(0, 0x00b6) + case(1, 0x00be) + case_respawn(1, 0x00b8) + case_respawn(1, 0x00b9) + case_respawn(1, 0x00ba) + case_respawn(1, 0x00bb) + case_respawn(1, 0x00bc) + case_respawn(1, 0x00bd) + case(2, 0x00c5) + case_respawn(2, 0x00bf) + case_respawn(2, 0x00c0) + case_respawn(2, 0x00c1) + case_respawn(2, 0x00c2) + case_respawn(2, 0x00c3) + case_respawn(2, 0x00c4) + case(3, 0x00cc) + case_respawn(3, 0x00c6) + case_respawn(3, 0x00c7) + case_respawn(3, 0x00c8) + case_respawn(3, 0x00c9) + case_respawn(3, 0x00ca) + case_respawn(3, 0x00cb) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_start_lift[] = { + activate_lift(1, 0x01) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_14e0[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_14e0, 0x1000 }, + { func1001_start_lift, 0x1001 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupcryp.c b/src/ailists/mp_setupcryp.c new file mode 100644 index 000000000..2f0cde66f --- /dev/null +++ b/src/ailists/mp_setupcryp.c @@ -0,0 +1,140 @@ +// +// G5 Building (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_CRYP_00B2, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00BC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00BD, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B3, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00BE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00BF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B4, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B5, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C2, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C3, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B6, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B7, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B8, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00C9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00B9, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00CA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00CB, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00BA, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00CC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00CD, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_CRYP_00BB, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00CE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_CRYP_00CF, OBJFLAG_00000001, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_CRYP_009D) + spawn(PAD_CRYP_009E) + spawn(PAD_CRYP_009F) + spawn(PAD_CRYP_00A0) + spawn(PAD_CRYP_00A1) + spawn(PAD_CRYP_00A2) + spawn(PAD_CRYP_00A3) + spawn(PAD_CRYP_00A4) + spawn(PAD_CRYP_00A5) + spawn(PAD_CRYP_00A6) + spawn(PAD_CRYP_00A7) + spawn(PAD_CRYP_00A8) + spawn(PAD_CRYP_00A9) + spawn(PAD_CRYP_00AA) + spawn(PAD_CRYP_00AB) + spawn(PAD_CRYP_00AC) + spawn(PAD_CRYP_00AD) + spawn(PAD_CRYP_00AE) + spawn(PAD_CRYP_00AF) + spawn(PAD_CRYP_00B0) + spawn(PAD_CRYP_00B1) + case(0, 0x0087) + case_respawn(0, 0x0081) + case_respawn(0, 0x0082) + case_respawn(0, 0x0083) + case_respawn(0, 0x0084) + case_respawn(0, 0x0085) + case_respawn(0, 0x0086) + case(1, 0x0088) + case_respawn(1, 0x0089) + case_respawn(1, 0x008a) + case_respawn(1, 0x008b) + case_respawn(1, 0x008c) + case_respawn(1, 0x008d) + case_respawn(1, 0x008e) + case(2, 0x0095) + case_respawn(2, 0x008f) + case_respawn(2, 0x0090) + case_respawn(2, 0x0091) + case_respawn(2, 0x0092) + case_respawn(2, 0x0093) + case_respawn(2, 0x0094) + case(3, 0x009c) + case_respawn(3, 0x0096) + case_respawn(3, 0x0097) + case_respawn(3, 0x0098) + case_respawn(3, 0x0099) + case_respawn(3, 0x009a) + case_respawn(3, 0x009b) + hill(0x0033) + hill(0x004d) + hill(0x0056) + hill(0x001a) + hill(0x0066) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_13d4[] = { + set_wind_speed(11) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_13e0[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_13e0, 0x1000 }, + { func1001_13d4, 0x1001 }, + { NULL, 0 }, +}; + + + diff --git a/src/ailists/mp_setupdam.c b/src/ailists/mp_setupdam.c new file mode 100644 index 000000000..355b8faa2 --- /dev/null +++ b/src/ailists/mp_setupdam.c @@ -0,0 +1,48 @@ +// +// Pelagic II +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +char *text_stagename = "B Y E L O M O R Y E D A M\n"; +char *text_briefing1 = "mi6 has confirmed the existence of a secret chemical warfare facility at the arkhangelsk dam, ussr. its heavily guarded location and workings are a cause for major concern. nerve gas produced there has been turning up in the hands of hostile regimes around the world and deals with international terrorists have been rumoured. this facility should be destroyed without prejudice.\n"; +char *text_briefing2 = "the area around the dam is well defended against a full scale military attack but they won't be expecting a lone agent. i've looked at the recon reports and decided that the easiest way to gain entrance to the weapons factory will be to bungee jump down the face of the dam. safe and simple. just throw yourself off the top and remember to look before you leap old chap.\n"; +char *text_briefing3 = "information concerning shipping and contacts is stored on a computer system in a secret ops room within the dam.with this covert modem connected to their satellite link we can intercept this data when a backup is carried out.\n"; +char *text_briefing4 = "hardly a lover's leap, james. be careful though, i hate to think of you falling for anyone else.\n"; +char *text_objective1 = "neutralize all alarms\n"; +char *text_objective2 = "install covert modem\n"; +char *text_objective3 = "intercept data backup\n"; +char *text_objective4 = "bungee jump from platform\n"; +char *text_objective5 = "Byelomorye Dam, Archangel, USSR\n"; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; diff --git a/src/ailists/mp_setupdepo.c b/src/ailists/mp_setupdepo.c new file mode 100644 index 000000000..1648f80f0 --- /dev/null +++ b/src/ailists/mp_setupdepo.c @@ -0,0 +1,38 @@ +// +// G5 Building +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupdest.c b/src/ailists/mp_setupdest.c new file mode 100644 index 000000000..4c403f233 --- /dev/null +++ b/src/ailists/mp_setupdest.c @@ -0,0 +1,38 @@ +// +// Stage ID 0x1a +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupdish.c b/src/ailists/mp_setupdish.c new file mode 100644 index 000000000..0f397dbc8 --- /dev/null +++ b/src/ailists/mp_setupdish.c @@ -0,0 +1,38 @@ +// +// CI Training +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupear.c b/src/ailists/mp_setupear.c new file mode 100644 index 000000000..1a6da36d0 --- /dev/null +++ b/src/ailists/mp_setupear.c @@ -0,0 +1,48 @@ +// +// Investigation +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_UNARMED, -1) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_004c[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupeld.c b/src/ailists/mp_setupeld.c new file mode 100644 index 000000000..09acb1b31 --- /dev/null +++ b/src/ailists/mp_setupeld.c @@ -0,0 +1,48 @@ +// +// Villa +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_UNARMED, -1) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_004c[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupimp.c b/src/ailists/mp_setupimp.c new file mode 100644 index 000000000..ed405a95b --- /dev/null +++ b/src/ailists/mp_setupimp.c @@ -0,0 +1,46 @@ +// +// Defense +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupjun.c b/src/ailists/mp_setupjun.c new file mode 100644 index 000000000..81d72e78d --- /dev/null +++ b/src/ailists/mp_setupjun.c @@ -0,0 +1,139 @@ +// +// Temple (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_JUN_0093, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_009D, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_009E, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_0094, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_009F, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A0, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_0095, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A1, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A2, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_0096, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A3, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A4, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_0097, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A5, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A6, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_0098, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_0099, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00AA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00A9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_009A, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00AB, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00AC, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_009B, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00AD, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00AE, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_JUN_009C, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00AF, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_JUN_00B0, OBJFLAG_00000001, 0, 0, 1000) + door(0x0100, MODEL_TDOOR, PAD_JUN_008D, OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x0000551e, 0x00002aaa, 0x00002aaa, 0x000000da, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00001000) + door(0x0100, MODEL_TDOOR, PAD_JUN_008E, OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x0000551e, 0x00002aaa, 0x00002aaa, 0x000000da, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00001000) + door(0x0100, MODEL_TDOOR, PAD_JUN_008F, OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x0000551e, 0x00002aaa, 0x00002aaa, 0x000000da, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00001000) + door(0x0100, MODEL_TDOOR, PAD_JUN_0090, OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x0000551e, 0x00002aaa, 0x00002aaa, 0x000000da, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00001000) + door(0x0100, MODEL_TDOOR, PAD_JUN_0091, OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x0000551e, 0x00002aaa, 0x00002aaa, 0x000000da, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00001000) + door(0x0100, MODEL_TDOOR, PAD_JUN_0092, OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x0000551e, 0x00002aaa, 0x00002aaa, 0x000000da, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00001000) + endprops +}; + +s32 intro[] = { + spawn(PAD_JUN_001C) + spawn(PAD_JUN_001D) + spawn(PAD_JUN_001E) + spawn(PAD_JUN_001F) + spawn(PAD_JUN_0020) + spawn(PAD_JUN_0021) + spawn(PAD_JUN_0022) + spawn(PAD_JUN_0023) + spawn(PAD_JUN_0024) + spawn(PAD_JUN_0025) + spawn(PAD_JUN_0026) + spawn(PAD_JUN_0027) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0014) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0013) + case(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + case_respawn(3, 0x001b) + hill(0x0072) + hill(0x005a) + hill(0x0080) + hill(0x007a) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + endlist +}; + +u8 func1000_1898[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1898, 0x1000 }, + { NULL, 0 }, +}; + + + + diff --git a/src/ailists/mp_setuplam.c b/src/ailists/mp_setuplam.c new file mode 100644 index 000000000..d5624157a --- /dev/null +++ b/src/ailists/mp_setuplam.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x50 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuplee.c b/src/ailists/mp_setuplee.c new file mode 100644 index 000000000..69fb20617 --- /dev/null +++ b/src/ailists/mp_setuplee.c @@ -0,0 +1,48 @@ +// +// Attack Ship +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_UNARMED, -1) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_004c[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuplen.c b/src/ailists/mp_setuplen.c new file mode 100644 index 000000000..66b44ceda --- /dev/null +++ b/src/ailists/mp_setuplen.c @@ -0,0 +1,47 @@ +// +// Stage ID 0x36 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_003c[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuplip.c b/src/ailists/mp_setuplip.c new file mode 100644 index 000000000..6fe213064 --- /dev/null +++ b/src/ailists/mp_setuplip.c @@ -0,0 +1,46 @@ +// +// Rescue +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuplue.c b/src/ailists/mp_setuplue.c new file mode 100644 index 000000000..12b495cee --- /dev/null +++ b/src/ailists/mp_setuplue.c @@ -0,0 +1,46 @@ +// +// Infiltration +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp1.c b/src/ailists/mp_setupmp1.c new file mode 100644 index 000000000..3a2cf25b2 --- /dev/null +++ b/src/ailists/mp_setupmp1.c @@ -0,0 +1,171 @@ +// +// Base (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP1_002C, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0036, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0037, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_002D, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0038, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0039, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_002E, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_003A, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_003B, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_002F, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_003C, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_003D, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_0030, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_003E, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_003F, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_0031, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0040, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0041, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_0032, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0042, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0043, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_0033, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0044, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0045, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_0034, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0046, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0047, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP1_0035, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0048, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP1_0049, OBJFLAG_00000001, 0, 0, 1000) + tag(0x01, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP1_004C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x004c, 0x004d, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001555, 0x00320000, 0x00000000) + tag(0x02, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP1_004B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x004b, 0x004a, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001555, 0x00320000, 0x00000000) + door(0x0100, MODEL_DD_LABDOOR, PAD_MP1_004E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_MP1_004F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_MP1_0051, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_MP1_0050, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_MP1_0052, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0053, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0054, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0055, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0056, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0057, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0058, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0059, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_005A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_005B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_005C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_005D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_005E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_005F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0060, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0061, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0062, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0063, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0064, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0065, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0066, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0067, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0068, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_0069, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_MP1_006A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP1_001C) + spawn(PAD_MP1_001D) + spawn(PAD_MP1_001E) + spawn(PAD_MP1_001F) + spawn(PAD_MP1_0020) + spawn(PAD_MP1_0021) + spawn(PAD_MP1_0022) + spawn(PAD_MP1_0023) + spawn(PAD_MP1_0024) + spawn(PAD_MP1_0025) + spawn(PAD_MP1_0026) + spawn(PAD_MP1_0027) + spawn(PAD_MP1_0028) + spawn(PAD_MP1_0029) + spawn(PAD_MP1_002A) + spawn(PAD_MP1_002B) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0014) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0013) + case(3, 0x001b) + case_respawn(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + hill(0x00db) + hill(0x00f0) + hill(0x00aa) + hill(0x00b7) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_start_lifts[] = { + activate_lift(1, 0x01) + activate_lift(2, 0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_21d4[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_21d4, 0x1000 }, + { func1001_start_lifts, 0x1001 }, + { NULL, 0 }, +}; + + + + + + diff --git a/src/ailists/mp_setupmp10.c b/src/ailists/mp_setupmp10.c new file mode 100644 index 000000000..a8363ee98 --- /dev/null +++ b/src/ailists/mp_setupmp10.c @@ -0,0 +1,144 @@ +// +// Sewers (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP10_0099, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A3, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A4, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_009A, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A5, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A6, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_009B, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_009C, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00A9, OBJFLAG_00000008, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00AA, OBJFLAG_00000008, 0, 0, 1000) + stdobject(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B9, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_009D, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00AB, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00AC, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_009E, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00AD, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00AE, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_009F, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00AF, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B0, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_00A0, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B1, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B2, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_00A1, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B3, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B4, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP10_00A2, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B5, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP10_00B6, OBJFLAG_00000001, 0, 0, 1000) + tag(0x00, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP10_006A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x006a, 0x006b, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001c71, 0x0074aaaa, 0x00000000) + tag(0x01, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP10_006C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x006c, 0x006d, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001c71, 0x0074aaaa, 0x00000000) + tag(0x02, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP10_006E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x006e, 0x006f, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001c71, 0x0074aaaa, 0x00000000) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP10_008C) + spawn(PAD_MP10_008D) + spawn(PAD_MP10_008E) + spawn(PAD_MP10_008F) + spawn(PAD_MP10_0090) + spawn(PAD_MP10_0091) + spawn(PAD_MP10_0092) + spawn(PAD_MP10_0093) + spawn(PAD_MP10_0094) + spawn(PAD_MP10_0095) + spawn(PAD_MP10_0096) + spawn(PAD_MP10_0097) + spawn(PAD_MP10_0098) + case(0, 0x0070) + case_respawn(0, 0x0071) + case_respawn(0, 0x0072) + case_respawn(0, 0x0073) + case_respawn(0, 0x0074) + case_respawn(0, 0x0075) + case_respawn(0, 0x0076) + case(1, 0x0077) + case_respawn(1, 0x0078) + case_respawn(1, 0x0079) + case_respawn(1, 0x007a) + case_respawn(1, 0x007b) + case_respawn(1, 0x007c) + case_respawn(1, 0x007d) + case(2, 0x007e) + case_respawn(2, 0x007f) + case_respawn(2, 0x0080) + case_respawn(2, 0x0081) + case_respawn(2, 0x0082) + case_respawn(2, 0x0083) + case_respawn(2, 0x0084) + case(3, 0x008b) + case_respawn(3, 0x0085) + case_respawn(3, 0x0086) + case_respawn(3, 0x0087) + case_respawn(3, 0x0088) + case_respawn(3, 0x0089) + case_respawn(3, 0x008a) + hill(0x005f) + hill(0x002d) + hill(0x003a) + hill(0x002a) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_start_lifts[] = { + activate_lift(1, 0x00) + activate_lift(2, 0x01) + activate_lift(3, 0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_1680[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1680, 0x1000 }, + { func1001_start_lifts, 0x1001 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupmp11.c b/src/ailists/mp_setupmp11.c new file mode 100644 index 000000000..da1c2cd2e --- /dev/null +++ b/src/ailists/mp_setupmp11.c @@ -0,0 +1,159 @@ +// +// Felicity (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP11_0028, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0032, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0033, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_0029, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0034, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0035, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_002A, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0036, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0037, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_002B, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0038, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0039, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_002C, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_003A, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_003B, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_002D, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_003C, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_003D, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_002E, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_003E, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_003F, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_002F, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0040, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0041, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_0030, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0043, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0042, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP11_0031, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0044, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP11_0045, OBJFLAG_00000001, 0, 0, 1000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0046, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0047, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0048, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0049, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_004A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_004B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_004C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + +#if VERSION >= VERSION_NTSC_1_0 + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0062, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) +#else + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0062, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x012c0258) +#endif + + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0063, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0064, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0065, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0066, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0067, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0068, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP11_0069, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_004D, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_004E, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_004F, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0050, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0051, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0052, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0053, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0054, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0055, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0056, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0058, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_MP11_0057, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x00640000, 0x03e80000, 0x01f40000, 0x01f40000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000800) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP11_001C) + spawn(PAD_MP11_001D) + spawn(PAD_MP11_001E) + spawn(PAD_MP11_001F) + spawn(PAD_MP11_0020) + spawn(PAD_MP11_0021) + spawn(PAD_MP11_0022) + spawn(PAD_MP11_0023) + spawn(PAD_MP11_0024) + spawn(PAD_MP11_0025) + spawn(PAD_MP11_0026) + spawn(PAD_MP11_0027) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0014) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0013) + case(3, 0x001b) + case_respawn(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + hill(0x0091) + hill(0x008b) + hill(0x0071) + hill(0x009f) + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_26fc[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_26fc, 0x1000 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupmp12.c b/src/ailists/mp_setupmp12.c new file mode 100644 index 000000000..09c91e65e --- /dev/null +++ b/src/ailists/mp_setupmp12.c @@ -0,0 +1,213 @@ +// +// Fortress (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP12_01A7, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01A8, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C2, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C3, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01A9, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01AA, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01AB, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01C9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01AC, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01CA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01CB, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01AD, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01CC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01CD, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01AE, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01CE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01CF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01AF, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B0, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D2, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D3, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B1, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B2, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B3, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01D9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B4, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01DA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01DB, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B5, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01DC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01DD, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B6, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01DE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01DF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B7, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B8, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E3, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E2, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01B9, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01BA, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01BB, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01E9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01BC, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01EA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01EB, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01BD, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01EC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01ED, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01BE, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01EE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01EF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP12_01BF, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01F0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00b3, MODEL_MULTI_AMMO_CRATE, PAD_MP12_01F1, OBJFLAG_00000001, 0, 0, 1000) + tag(0x01, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01F2, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01f2, 0x01f3, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x02, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01F4, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01f4, 0x01f5, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x03, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01F6, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01f6, 0x01f7, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x04, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01F8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01f8, 0x01f9, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x05, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01FA, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01fa, 0x01fb, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x06, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01FC, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01fc, 0x01fd, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x07, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_01FE, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x01fe, 0x01ff, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + tag(0x08, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP12_0200, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0200, 0x0201, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000011c7, 0x00040000, 0x00000000) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_019E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000b4, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_019F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A0, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000b4, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_019B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000b4, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_019C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_019D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000b4, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A5, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP12_01A6, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00280000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP12_018F) + spawn(PAD_MP12_0190) + spawn(PAD_MP12_0191) + spawn(PAD_MP12_0192) + spawn(PAD_MP12_0193) + spawn(PAD_MP12_0194) + spawn(PAD_MP12_0195) + spawn(PAD_MP12_0196) + spawn(PAD_MP12_0197) + spawn(PAD_MP12_0198) + spawn(PAD_MP12_0199) + spawn(PAD_MP12_019A) + case(0, 0x0188) + case_respawn(0, 0x0189) + case_respawn(0, 0x018a) + case_respawn(0, 0x018b) + case_respawn(0, 0x018c) + case_respawn(0, 0x018d) + case_respawn(0, 0x018e) + case(1, 0x0179) + case_respawn(1, 0x0178) + case_respawn(1, 0x0177) + case_respawn(1, 0x0176) + case_respawn(1, 0x0175) + case_respawn(1, 0x0174) + case_respawn(1, 0x0173) + case(2, 0x017a) + case_respawn(2, 0x017b) + case_respawn(2, 0x017c) + case_respawn(2, 0x017d) + case_respawn(2, 0x017e) + case_respawn(2, 0x017f) + case_respawn(2, 0x0180) + case(3, 0x0187) + case_respawn(3, 0x0186) + case_respawn(3, 0x0185) + case_respawn(3, 0x0184) + case_respawn(3, 0x0183) + case_respawn(3, 0x0182) + case_respawn(3, 0x0181) + hill(0x0009) + hill(0x0029) + hill(0x00f8) + hill(0x00b4) + hill(0x009a) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_start_lifts[] = { + activate_lift(1, 0x01) + activate_lift(2, 0x02) + activate_lift(3, 0x03) + activate_lift(4, 0x04) + activate_lift(5, 0x05) + activate_lift(6, 0x06) + activate_lift(7, 0x07) + activate_lift(8, 0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_3cc8[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_3cc8, 0x1000 }, + { func1001_start_lifts, 0x1001 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupmp13.c b/src/ailists/mp_setupmp13.c new file mode 100644 index 000000000..ae04dcb2c --- /dev/null +++ b/src/ailists/mp_setupmp13.c @@ -0,0 +1,124 @@ +// +// Villa (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP13_00BD, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00C7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00C8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00BE, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00C9, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00CA, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00BF, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00CB, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00CC, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C0, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00CD, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00CE, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C1, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00CF, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D0, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C2, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D1, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D2, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C3, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D3, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D4, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C4, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D5, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D6, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C5, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP13_00C6, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00D9, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP13_00DA, OBJFLAG_00000001, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + spawn(PAD_MP13_001C) + spawn(PAD_MP13_001D) + spawn(PAD_MP13_001E) + spawn(PAD_MP13_001F) + spawn(PAD_MP13_0020) + spawn(PAD_MP13_0021) + spawn(PAD_MP13_0022) + spawn(PAD_MP13_0023) + spawn(PAD_MP13_0024) + spawn(PAD_MP13_0025) + spawn(PAD_MP13_0026) + spawn(PAD_MP13_0027) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0013) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0014) + case(3, 0x001b) + case_respawn(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + hill(0x004c) + hill(0x008e) + hill(0x00aa) + hill(0x0043) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_1368[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1368, 0x1000 }, + { NULL, 0 }, +}; + + + diff --git a/src/ailists/mp_setupmp14.c b/src/ailists/mp_setupmp14.c new file mode 100644 index 000000000..4ed802a11 --- /dev/null +++ b/src/ailists/mp_setupmp14.c @@ -0,0 +1,47 @@ +// +// Stage ID 0x46 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp15.c b/src/ailists/mp_setupmp15.c new file mode 100644 index 000000000..3bf4ae759 --- /dev/null +++ b/src/ailists/mp_setupmp15.c @@ -0,0 +1,172 @@ +// +// Grid (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP15_00AC, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00B7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00B8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00AD, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00B9, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00BA, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00AE, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00BB, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00BC, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00AF, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00BD, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00BE, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00B0, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00BF, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C0, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00B1, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C1, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C2, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00B3, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C5, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C6, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00B4, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C7, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C8, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00B5, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00C9, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00CA, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP15_00B6, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00CB, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP15_00CC, OBJFLAG_00000001, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_MP15_00D9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0000, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0001, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0002, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0003, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0004, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0005, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0006, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0007, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_GLASS_FLOOR, PAD_MP15_0008, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0080, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000258, 0x00000000, 0x00000001, 0x00000000) +#else + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0080, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x00000000, 0x00000001, 0x00000300) +#endif + + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0081, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000258, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0082, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0083, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0084, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_0085, 0, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x00000000, 0x00000000, 0x00000300) + tag(0x01, 1) + lift(0x0100, MODEL_MATRIX_LIFT, PAD_MP15_00CE, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00ce, 0x00cf, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_007C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001200) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_007D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_007E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001200) + door(0x0100, MODEL_DOOR2A_G5, PAD_MP15_007F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP15_00A2) + spawn(PAD_MP15_00A3) + spawn(PAD_MP15_00A4) + spawn(PAD_MP15_00A5) + spawn(PAD_MP15_00A6) + spawn(PAD_MP15_00A7) + spawn(PAD_MP15_00A8) + spawn(PAD_MP15_00A9) + spawn(PAD_MP15_00AA) + spawn(PAD_MP15_00AB) + case(0, 0x0086) + case_respawn(0, 0x0087) + case_respawn(0, 0x0088) + case_respawn(0, 0x0089) + case_respawn(0, 0x008a) + case_respawn(0, 0x008b) + case_respawn(0, 0x008c) + case(1, 0x0093) + case_respawn(1, 0x008d) + case_respawn(1, 0x008e) + case_respawn(1, 0x008f) + case_respawn(1, 0x0090) + case_respawn(1, 0x0091) + case_respawn(1, 0x0092) + case(2, 0x009a) + case_respawn(2, 0x0094) + case_respawn(2, 0x0095) + case_respawn(2, 0x0096) + case_respawn(2, 0x0097) + case_respawn(2, 0x0098) + case_respawn(2, 0x0099) + case(3, 0x00a1) + case_respawn(3, 0x009b) + case_respawn(3, 0x009c) + case_respawn(3, 0x009d) + case_respawn(3, 0x009e) + case_respawn(3, 0x009f) + case_respawn(3, 0x00a0) + hill(0x0073) + hill(0x0013) + hill(0x006b) + hill(0x0060) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_start_lift[] = { + activate_lift(1, 0x01) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_2400[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_2400, 0x1000 }, + { func1001_start_lift, 0x1001 }, + { NULL, 0 }, +}; + + + + + + diff --git a/src/ailists/mp_setupmp16.c b/src/ailists/mp_setupmp16.c new file mode 100644 index 000000000..deb474881 --- /dev/null +++ b/src/ailists/mp_setupmp16.c @@ -0,0 +1,46 @@ +// +// Stage ID 0x48 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp17.c b/src/ailists/mp_setupmp17.c new file mode 100644 index 000000000..b5a35afd9 --- /dev/null +++ b/src/ailists/mp_setupmp17.c @@ -0,0 +1,55 @@ +// +// Stage ID 0x49 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_0038[] = { + set_wind_speed(130) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_0044[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0044, 0x1000 }, + { func1001_0038, 0x1001 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp18.c b/src/ailists/mp_setupmp18.c new file mode 100644 index 000000000..4ee06e743 --- /dev/null +++ b/src/ailists/mp_setupmp18.c @@ -0,0 +1,48 @@ +// +// Stage ID 0x4a +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_0038[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0038, 0x1000 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp19.c b/src/ailists/mp_setupmp19.c new file mode 100644 index 000000000..aaa6b4b2f --- /dev/null +++ b/src/ailists/mp_setupmp19.c @@ -0,0 +1,48 @@ +// +// Stage ID 0x4b +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_0038[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0038, 0x1000 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp2.c b/src/ailists/mp_setupmp2.c new file mode 100644 index 000000000..bf2e43ea0 --- /dev/null +++ b/src/ailists/mp_setupmp2.c @@ -0,0 +1,54 @@ +// +// Stage ID 0x3a +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + endlist +}; + +u8 unregistered_func2[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp20.c b/src/ailists/mp_setupmp20.c new file mode 100644 index 000000000..a806de67b --- /dev/null +++ b/src/ailists/mp_setupmp20.c @@ -0,0 +1,48 @@ +// +// Stage ID 0x4c +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_0038[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0038, 0x1000 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp3.c b/src/ailists/mp_setupmp3.c new file mode 100644 index 000000000..1cd892079 --- /dev/null +++ b/src/ailists/mp_setupmp3.c @@ -0,0 +1,162 @@ +// +// Area 52 (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP3_0028, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0032, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0033, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_0029, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0034, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0035, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_002A, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0036, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0037, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_002B, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0038, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0039, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_002C, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_003A, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_003B, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_002D, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_003C, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_003D, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_002E, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_003E, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_003F, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_002F, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0040, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0041, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_0030, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0042, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0043, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP3_0031, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0044, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP3_0045, OBJFLAG_00000001, 0, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_0046, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_0047, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_0048, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_0049, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_004A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_004B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_004C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_MP3_004D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_005A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000021c, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_005B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_005C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000168, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_005D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000348, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_005E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000168, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_005F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_0060, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP3_0061, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_MP3_004F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_MP3_004E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_MP3_0051, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_MP3_0050, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_MP3_0053, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_MP3_0052, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_MP3_0055, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_MP3_0054, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_MP3_0057, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_MP3_0056, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_MP3_0059, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_MP3_0058, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00320000, 0x00085555, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + spawn(PAD_MP3_001C) + spawn(PAD_MP3_001D) + spawn(PAD_MP3_001E) + spawn(PAD_MP3_001F) + spawn(PAD_MP3_0020) + spawn(PAD_MP3_0021) + spawn(PAD_MP3_0022) + spawn(PAD_MP3_0023) + spawn(PAD_MP3_0024) + spawn(PAD_MP3_0025) + spawn(PAD_MP3_0026) + spawn(PAD_MP3_0027) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0013) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0014) + case(3, 0x001b) + case_respawn(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + hill(0x010d) + hill(0x0106) + hill(0x00e4) + hill(0x00da) + hill(0x011c) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_27e0[] = { + set_wind_speed(15) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_27ec[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_27ec, 0x1000 }, + { func1001_27e0, 0x1001 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupmp4.c b/src/ailists/mp_setupmp4.c new file mode 100644 index 000000000..78d9999ed --- /dev/null +++ b/src/ailists/mp_setupmp4.c @@ -0,0 +1,136 @@ +// +// Warehouse (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP4_0167, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0171, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0172, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_0168, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0173, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0174, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_0169, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0175, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0176, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_016A, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0177, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0178, OBJFLAG_00000001, 0, 0, 1000) + stdobject(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0185, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_016B, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0179, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_017A, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_016C, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_017B, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_017C, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_016D, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_017D, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_017E, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_016E, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_017F, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0180, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_016F, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0181, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0182, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP4_0170, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0183, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP4_0184, OBJFLAG_00000001, 0, 0, 1000) + hover_prop(0x0100, MODEL_A51_CRATE2, PAD_MP4_0186, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE, 1000, 0x02010000) + hover_prop(0x0100, MODEL_HOVERCRATE1, PAD_MP4_0187, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE, 1000, 0x02010000) + hover_prop(0x0100, MODEL_A51_CRATE2, PAD_MP4_0188, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE, 1000, 0x02010000) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP4_015B) + spawn(PAD_MP4_015C) + spawn(PAD_MP4_015D) + spawn(PAD_MP4_015E) + spawn(PAD_MP4_015F) + spawn(PAD_MP4_0160) + spawn(PAD_MP4_0161) + spawn(PAD_MP4_0162) + spawn(PAD_MP4_0163) + spawn(PAD_MP4_0164) + spawn(PAD_MP4_0165) + spawn(PAD_MP4_0166) + case(0, 0x013f) + case_respawn(0, 0x0140) + case_respawn(0, 0x0141) + case_respawn(0, 0x0142) + case_respawn(0, 0x0143) + case_respawn(0, 0x0144) + case_respawn(0, 0x0145) + case(1, 0x014c) + case_respawn(1, 0x0146) + case_respawn(1, 0x0147) + case_respawn(1, 0x0148) + case_respawn(1, 0x0149) + case_respawn(1, 0x014a) + case_respawn(1, 0x014b) + case(2, 0x0153) + case_respawn(2, 0x014e) + case_respawn(2, 0x014f) + case_respawn(2, 0x0150) + case_respawn(2, 0x0151) + case_respawn(2, 0x0152) + case_respawn(2, 0x014d) + case(3, 0x015a) + case_respawn(3, 0x0154) + case_respawn(3, 0x0155) + case_respawn(3, 0x0156) + case_respawn(3, 0x0157) + case_respawn(3, 0x0158) + case_respawn(3, 0x0159) + hill(0x011c) + hill(0x0087) + hill(0x006a) + hill(0x00ec) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_1590[] = { + set_wind_speed(22) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_159c[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_159c, 0x1000 }, + { func1001_1590, 0x1001 }, + { NULL, 0 }, +}; + + + + + diff --git a/src/ailists/mp_setupmp5.c b/src/ailists/mp_setupmp5.c new file mode 100644 index 000000000..6d2a63fa1 --- /dev/null +++ b/src/ailists/mp_setupmp5.c @@ -0,0 +1,145 @@ +// +// Car Park (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP5_0116, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0120, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0121, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_0117, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0122, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0123, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_0118, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0124, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0125, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_0119, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0126, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0127, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_011A, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0128, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0129, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_011B, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_012A, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_012B, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_011C, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_012C, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_012D, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_011D, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_012E, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_012F, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_011E, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0130, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0131, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP5_011F, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0132, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x00cc, MODEL_MULTI_AMMO_CRATE, PAD_MP5_0133, OBJFLAG_00000001, 0, 0, 1000) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_010A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_010B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_010C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_010D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_010E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_010F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_0110, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_0111, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_0112, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_0113, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_0114, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_MP5_0115, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00003333, 0x00014000, 0x00004000, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x000000f0, 0x00000000, 0x00000000, 0x00000a00) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + spawn(PAD_MP5_001C) + spawn(PAD_MP5_001D) + spawn(PAD_MP5_001E) + spawn(PAD_MP5_001F) + spawn(PAD_MP5_0020) + spawn(PAD_MP5_0021) + spawn(PAD_MP5_0022) + spawn(PAD_MP5_0023) + spawn(PAD_MP5_0024) + spawn(PAD_MP5_0025) + spawn(PAD_MP5_0026) + spawn(PAD_MP5_0027) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0014) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0013) + case(3, 0x001b) + case_respawn(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + hill(0x00c3) + hill(0x0075) + hill(0x00fa) + hill(0x0089) + hill(0x0048) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_1dc0[] = { + set_wind_speed(8) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_1dcc[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1dcc, 0x1000 }, + { func1001_1dc0, 0x1001 }, + { NULL, 0 }, +}; + + + + diff --git a/src/ailists/mp_setupmp6.c b/src/ailists/mp_setupmp6.c new file mode 100644 index 000000000..b5c2fcd14 --- /dev/null +++ b/src/ailists/mp_setupmp6.c @@ -0,0 +1,46 @@ +// +// Stage ID 0x3e +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp7.c b/src/ailists/mp_setupmp7.c new file mode 100644 index 000000000..d71ac84fd --- /dev/null +++ b/src/ailists/mp_setupmp7.c @@ -0,0 +1,48 @@ +// +// Stage ID 0x3f +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_0038[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0038, 0x1000 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp8.c b/src/ailists/mp_setupmp8.c new file mode 100644 index 000000000..eef5783b9 --- /dev/null +++ b/src/ailists/mp_setupmp8.c @@ -0,0 +1,48 @@ +// +// Stage ID 0x40 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_0038[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0038, 0x1000 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupmp9.c b/src/ailists/mp_setupmp9.c new file mode 100644 index 000000000..bfc5dc238 --- /dev/null +++ b/src/ailists/mp_setupmp9.c @@ -0,0 +1,136 @@ +// +// Ruins (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0100, 0x0000, PAD_MP9_0000, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_000C, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_000D, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0001, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_000E, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_000F, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0002, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0010, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0011, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0003, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0012, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0013, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0004, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0014, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0015, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0005, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0016, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0017, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0006, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0018, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0019, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0007, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_001A, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_001B, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0008, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_001C, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_001D, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_MP9_0009, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_001E, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_001F, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0020, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0021, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0022, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_MP9_0023, OBJFLAG_00000001, 0, 0, 1000) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B2, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B3, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B4, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B5, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B6, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B7, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B8, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_MP9_00B9, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00002aaa, 0x00002aaa, 0x000002c5, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + endprops +}; + +s32 intro[] = { + spawn(PAD_MP9_0040) + spawn(PAD_MP9_0041) + spawn(PAD_MP9_0042) + spawn(PAD_MP9_0043) + spawn(PAD_MP9_0044) + spawn(PAD_MP9_0045) + spawn(PAD_MP9_0046) + spawn(PAD_MP9_0047) + spawn(PAD_MP9_0048) + spawn(PAD_MP9_0049) + spawn(PAD_MP9_004A) + spawn(PAD_MP9_004B) + case(0, PAD_MP9_0024) + case_respawn(0, PAD_MP9_0025) + case_respawn(0, PAD_MP9_0026) + case_respawn(0, PAD_MP9_0027) + case_respawn(0, PAD_MP9_0028) + case_respawn(0, PAD_MP9_0029) + case_respawn(0, PAD_MP9_002A) + case(1, PAD_MP9_0031) + case_respawn(1, PAD_MP9_002B) + case_respawn(1, PAD_MP9_002C) + case_respawn(1, PAD_MP9_002D) + case_respawn(1, PAD_MP9_002E) + case_respawn(1, PAD_MP9_002F) + case_respawn(1, PAD_MP9_0030) + case(2, PAD_MP9_0038) + case_respawn(2, PAD_MP9_0032) + case_respawn(2, PAD_MP9_0033) + case_respawn(2, PAD_MP9_0034) + case_respawn(2, PAD_MP9_0035) + case_respawn(2, PAD_MP9_0036) + case_respawn(2, PAD_MP9_0037) + case(3, PAD_MP9_003F) + case_respawn(3, PAD_MP9_0039) + case_respawn(3, PAD_MP9_003A) + case_respawn(3, PAD_MP9_003B) + case_respawn(3, PAD_MP9_003C) + case_respawn(3, PAD_MP9_003D) + case_respawn(3, PAD_MP9_003E) + hill(PAD_MP9_009B) + hill(PAD_MP9_00B0) + hill(PAD_MP9_0064) + hill(PAD_MP9_005F) + hill(PAD_MP9_0053) + hill(PAD_MP9_0070) + hill(PAD_MP9_009B) + + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_1cf8[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1cf8, 0x1000 }, + { NULL, 0 }, +}; diff --git a/src/ailists/mp_setupoat.c b/src/ailists/mp_setupoat.c new file mode 100644 index 000000000..b47e7e5df --- /dev/null +++ b/src/ailists/mp_setupoat.c @@ -0,0 +1,147 @@ +// +// Skedar (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0200, 0x0000, PAD_OAT_00CD, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00DC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00DD, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0200, 0x0000, PAD_OAT_00CE, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00DE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00DF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0200, 0x0000, PAD_OAT_00CF, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_OAT_00D0, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E2, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E3, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_OAT_00D1, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_OAT_00D2, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D3, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00E9, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D4, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00EA, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00EB, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D5, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00EC, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00ED, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D6, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00EE, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00EF, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D7, OBJFLAG_00000001, 0, 0, 250) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F0, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F1, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D8, OBJFLAG_00000001, 0, 0, 251) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F2, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F3, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00D9, OBJFLAG_00000001, 0, 0, 252) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F4, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F5, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00DA, OBJFLAG_00000001, 0, 0, 253) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F6, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F7, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_OAT_00DB, OBJFLAG_00000001, 0, 0, 254) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F8, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_OAT_00F9, OBJFLAG_00000001, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_OAT_00A5) + spawn(PAD_OAT_00A6) + spawn(PAD_OAT_00A7) + spawn(PAD_OAT_00A8) + spawn(PAD_OAT_00A9) + spawn(PAD_OAT_00AA) + spawn(PAD_OAT_00AB) + spawn(PAD_OAT_00AC) + spawn(PAD_OAT_00AD) + spawn(PAD_OAT_00AE) + spawn(PAD_OAT_00AF) + spawn(PAD_OAT_00B0) + case(0, 0x00b1) + case_respawn(0, 0x00b2) + case_respawn(0, 0x00b3) + case_respawn(0, 0x00b4) + case_respawn(0, 0x00b5) + case_respawn(0, 0x00b6) + case_respawn(0, 0x00b7) + case(1, 0x00b8) + case_respawn(1, 0x00b9) + case_respawn(1, 0x00ba) + case_respawn(1, 0x00bb) + case_respawn(1, 0x00bc) + case_respawn(1, 0x00bd) + case_respawn(1, 0x00be) + case(2, 0x00bf) + case_respawn(2, 0x00c0) + case_respawn(2, 0x00c1) + case_respawn(2, 0x00c2) + case_respawn(2, 0x00c3) + case_respawn(2, 0x00c4) + case_respawn(2, 0x00c5) + case(3, 0x00c6) + case_respawn(3, 0x00c7) + case_respawn(3, 0x00c8) + case_respawn(3, 0x00c9) + case_respawn(3, 0x00ca) + case_respawn(3, 0x00cb) + case_respawn(3, 0x00cc) + hill(0x0093) + hill(0x00d5) + hill(0x008d) + hill(0x00da) + hill(0x0076) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + endlist +}; + +u8 func1000_1c08[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1c08, 0x1000 }, + { NULL, 0 }, +}; + + + diff --git a/src/ailists/mp_setupold.c b/src/ailists/mp_setupold.c new file mode 100644 index 000000000..6e18b3f0c --- /dev/null +++ b/src/ailists/mp_setupold.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x4e +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuppam.c b/src/ailists/mp_setuppam.c new file mode 100644 index 000000000..0b3cc37fa --- /dev/null +++ b/src/ailists/mp_setuppam.c @@ -0,0 +1,48 @@ +// +// Deep Sea +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_UNARMED, -1) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_004c[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuppete.c b/src/ailists/mp_setuppete.c new file mode 100644 index 000000000..885549b69 --- /dev/null +++ b/src/ailists/mp_setuppete.c @@ -0,0 +1,63 @@ +// +// Chicago +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +char *text_stagename = "S T . P E T E R S B U R G\n"; +char *text_briefing1 = "use the stolen tank to chase the car containing natalya. you are up against a time limit.\n"; +char *text_briefing2 = "\n"; +char *text_briefing3 = "\n"; +char *text_briefing4 = "\n"; +char *text_objective1 = "\n\n\n"; +char *text_objective2 = "\n\n\n"; +char *text_objective3 = "\n"; + +u32 props[] = { + briefing(0, 0x0020) + briefing(1, 0x0024) + briefing(2, 0x0028) + briefing(3, 0x002c) + briefing(4, 0x0030) + + beginobjective(0, 0x0034, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) + endobjective + + beginobjective(1, 0x0038, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) + endobjective + + beginobjective(2, 0x003c, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) + endobjective + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_PP9I, -1) + ammo(AMMOTYPE_PISTOL, 100) + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; diff --git a/src/ailists/mp_setupref.c b/src/ailists/mp_setupref.c new file mode 100644 index 000000000..7ea6ba73b --- /dev/null +++ b/src/ailists/mp_setupref.c @@ -0,0 +1,146 @@ +// +// Complex (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + weapon(0x0200, 0x0000, PAD_REF_002F, OBJFLAG_00000001, 0, 0, 240) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0039, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_003A, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0200, 0x0000, PAD_REF_0030, OBJFLAG_00000001, 0, 0, 241) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_003B, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_003C, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0200, 0x0000, PAD_REF_0031, OBJFLAG_00000001, 0, 0, 242) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_003D, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_003E, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_REF_0032, OBJFLAG_00000001, 0, 0, 243) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_003F, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0040, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_REF_0033, OBJFLAG_00000001, 0, 0, 244) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0041, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0042, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0133, 0x0000, PAD_REF_0034, OBJFLAG_00000001, 0, 0, 245) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0043, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0044, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_REF_0035, OBJFLAG_00000001, 0, 0, 246) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0045, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0046, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_REF_0036, OBJFLAG_00000001, 0, 0, 247) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0047, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0048, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_REF_0037, OBJFLAG_00000001, 0, 0, 248) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_0049, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_004A, OBJFLAG_00000001, 0, 0, 1000) + weapon(0x0100, 0x0000, PAD_REF_0038, OBJFLAG_00000001, 0, 0, 249) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_004B, OBJFLAG_00000001, 0, 0, 1000) + ammocratemulti(0x0099, MODEL_MULTI_AMMO_CRATE, PAD_REF_004C, OBJFLAG_00000001, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_REF_004F, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_REF_0050, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_REF_0051, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_REF_004D, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_REF_004E, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_REF_001C) + spawn(PAD_REF_001D) + spawn(PAD_REF_001E) + spawn(PAD_REF_001F) + spawn(PAD_REF_0020) + spawn(PAD_REF_0021) + spawn(PAD_REF_0022) + spawn(PAD_REF_0023) + spawn(PAD_REF_0024) + spawn(PAD_REF_0025) + spawn(PAD_REF_0026) + spawn(PAD_REF_0027) + spawn(PAD_REF_0028) + spawn(PAD_REF_0029) + spawn(PAD_REF_002A) + spawn(PAD_REF_002B) + spawn(PAD_REF_002C) + spawn(PAD_REF_002D) + spawn(PAD_REF_002E) + case(0, 0x0006) + case_respawn(0, 0x0000) + case_respawn(0, 0x0001) + case_respawn(0, 0x0002) + case_respawn(0, 0x0003) + case_respawn(0, 0x0004) + case_respawn(0, 0x0005) + case(1, 0x000d) + case_respawn(1, 0x0007) + case_respawn(1, 0x0008) + case_respawn(1, 0x0009) + case_respawn(1, 0x000a) + case_respawn(1, 0x000b) + case_respawn(1, 0x000c) + case(2, 0x0014) + case_respawn(2, 0x000e) + case_respawn(2, 0x000f) + case_respawn(2, 0x0010) + case_respawn(2, 0x0011) + case_respawn(2, 0x0012) + case_respawn(2, 0x0013) + case(3, 0x001b) + case_respawn(3, 0x0015) + case_respawn(3, 0x0016) + case_respawn(3, 0x0017) + case_respawn(3, 0x0018) + case_respawn(3, 0x0019) + case_respawn(3, 0x001a) + hill(0x0067) + hill(0x007b) + hill(0x00d5) + hill(0x0092) + hill(0x008b) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + endlist +}; + +u8 func1000_1598[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_1598, 0x1000 }, + { NULL, 0 }, +}; + + + + diff --git a/src/ailists/mp_setuprit.c b/src/ailists/mp_setuprit.c new file mode 100644 index 000000000..5c6cc4738 --- /dev/null +++ b/src/ailists/mp_setuprit.c @@ -0,0 +1,48 @@ +// +// Air Force One +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_UNARMED, -1) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_004c[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuprun.c b/src/ailists/mp_setuprun.c new file mode 100644 index 000000000..82431fc23 --- /dev/null +++ b/src/ailists/mp_setuprun.c @@ -0,0 +1,52 @@ +// +// Stage ID 0x23 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 unregistered_func1[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_func2[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupsev.c b/src/ailists/mp_setupsev.c new file mode 100644 index 000000000..6a6701faf --- /dev/null +++ b/src/ailists/mp_setupsev.c @@ -0,0 +1,39 @@ +// +// Maian SOS +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupsevb.c b/src/ailists/mp_setupsevb.c new file mode 100644 index 000000000..ec826f8f5 --- /dev/null +++ b/src/ailists/mp_setupsevb.c @@ -0,0 +1,39 @@ +// +// Retaking the Institute +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupsevx.c b/src/ailists/mp_setupsevx.c new file mode 100644 index 000000000..50770203a --- /dev/null +++ b/src/ailists/mp_setupsevx.c @@ -0,0 +1,38 @@ +// +// Stage IDs 0x24 and 0x2b +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupsho.c b/src/ailists/mp_setupsho.c new file mode 100644 index 000000000..d8b24c236 --- /dev/null +++ b/src/ailists/mp_setupsho.c @@ -0,0 +1,38 @@ +// +// Skedar Ruins +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + diff --git a/src/ailists/mp_setupsilo.c b/src/ailists/mp_setupsilo.c new file mode 100644 index 000000000..56837031d --- /dev/null +++ b/src/ailists/mp_setupsilo.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x14 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupstat.c b/src/ailists/mp_setupstat.c new file mode 100644 index 000000000..011df9f00 --- /dev/null +++ b/src/ailists/mp_setupstat.c @@ -0,0 +1,38 @@ +// +// WAR! +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setuptra.c b/src/ailists/mp_setuptra.c new file mode 100644 index 000000000..dea66e525 --- /dev/null +++ b/src/ailists/mp_setuptra.c @@ -0,0 +1,38 @@ +// +// Escape +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupuff.c b/src/ailists/mp_setupuff.c new file mode 100644 index 000000000..1c17ef24d --- /dev/null +++ b/src/ailists/mp_setupuff.c @@ -0,0 +1,46 @@ +// +// Stage ID 0x4d +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/mp_setupwax.c b/src/ailists/mp_setupwax.c new file mode 100644 index 000000000..d9b039d75 --- /dev/null +++ b/src/ailists/mp_setupwax.c @@ -0,0 +1,46 @@ +// +// Mr. Blonde's Revenge +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupame.c b/src/ailists/setupame.c new file mode 100644 index 000000000..56be7cb22 --- /dev/null +++ b/src/ailists/setupame.c @@ -0,0 +1,4172 @@ +// +// Defection +// + +#include "stagesetup.h" + +// Characters +#define CHR_CASS 0x24 +#define CHR_SECRETARY 0x25 +#define CHR_PROGRAMMER 0x26 + +// Objects +#define OBJ_NECKLACE 0x00 +#define OBJ_SECURITYHUB 0x03 +#define OBJ_EXTCOMMSHUB 0x04 +#define OBJ_PC 0x0c +#define OBJ_DOORSWITCH 0x0d +#define OBJ_OFFICEDOOR1 0x0e +#define OBJ_OFFICEDOOR2 0x0f +#define OBJ_LIGHTSWITCH 0x14 +#define OBJ_JUMPSHIP1 0x17 +#define OBJ_ROPE 0x18 +#define OBJ_BANNER1 0x19 +#define OBJ_BANNER2 0x1a +#define OBJ_JUMPSHIP2 0x1b +#define OBJ_HOVERTAXI1 0x1c +#define OBJ_HOVERTAXI2 0x1e +#define OBJ_HOVERCOP1 0x1f +#define OBJ_HOVERCOP2 0x20 +#define OBJ_HOVERCAR1 0x21 +#define OBJ_HOVERCAR2 0x22 +#define OBJ_HOVERMOTO1 0x23 +#define OBJ_HOVERMOTO2 0x24 +#define OBJ_HOVERTRUCK1 0x25 +#define OBJ_HOVERTRUCK2 0x26 +#define OBJ_HOVERCAB1 0x27 +#define OBJ_HOVERCAB2 0x28 +#define OBJ_HOVERCOP3 0x29 +#define OBJ_HOVERCAR3 0x2a +#define OBJ_HOVERMOTO3 0x2b +#define OBJ_HOVERCAB3 0x2c +#define OBJ_HOVERTRUCK3 0x2d +#define OBJ_LABLIFTDOOR1 0x2e +#define OBJ_LABLIFTDOOR2 0x2f +#define OBJ_POLICECAR 0x30 +#define OBJ_ECMMINE_BOND 0x31 +#define OBJ_DATAUPLINK_BOND 0x32 +#define OBJ_SECRETDOOR 0x33 +#define OBJ_ECMMINE_COOP 0x3e +#define OBJ_DATAUPLINK_COOP 0x3f +#define OBJ_LAPTOPGUNDOOR 0x40 +#define OBJ_LAPTOPGUN 0x43 +#define OBJ_LIFT1 0x4e +#define OBJ_LIFT2 0x4f +#define OBJ_CAMERA1 0x50 +#define OBJ_CAMERA2 0x51 +#define OBJ_CAMERA3 0x52 +#define OBJ_CAMERA4 0x53 +#define OBJ_CAMERA5 0x54 +#define OBJ_CAMERA6 0x55 +#define OBJ_LIFT1DOOR1 0x56 +#define OBJ_LIFT1DOOR2 0x57 +#define OBJ_LIFT1DOOR3 0x58 +#define OBJ_LIFT1DOOR4 0x59 +#define OBJ_LIFT2DOOR1 0x5a +#define OBJ_LIFT2DOOR2 0x5b +#define OBJ_LIFT2DOOR3 0x5c +#define OBJ_LIFT2DOOR4 0x5d +#define OBJ_FALCONSIL1 0x61 +#define OBJ_FALCONSIL2 0x62 +#define OBJ_PCMONITOR 0x63 + +// Stage flags +#define STAGEFLAG_TALKED_TO_PROGRAMMER 0x00000001 +#define STAGEFLAG_SECRETARY_SAW_COOP 0x00000002 +#define STAGEFLAG_STOP_INTRO 0x00000004 +#define STAGEFLAG_SECURITY_DISABLED 0x00000008 +#define STAGEFLAG_TRIGGER_INTRO 0x00000010 +#define STAGEFLAG_SECURITYHUB_COMPLETE 0x00000100 +#define STAGEFLAG_EXTCOMMSHUB_COMPLETE 0x00000200 +#define STAGEFLAG_SECURITYHUB_MINES_WASTED 0x00000400 +#define STAGEFLAG_EXTCOMMSHUB_MINES_WASTED 0x00000800 +#define STAGEFLAG_LIGHTS_OFF 0x00001000 +#define STAGEFLAG_CIVILIANS_KILLED 0x00002000 +#define STAGEFLAG_OFFICE_DOOR_UNLOCKED 0x00004000 +#define STAGEFLAG_PROGRAMMER_DEAD 0x00010000 +#define STAGEFLAG_PROGRAMMER_WALKING 0x00020000 +#define STAGEFLAG_DELETED_WITHOUT_DOWNLOAD 0x00040000 +#define STAGEFLAG_PROGRAMMER_LOGGED_IN 0x00080000 +#define STAGEFLAG_PROGRAMMER_RAN_TO_GUARD 0x00100000 +#define STAGEFLAG_PERSONALITY_DELETED 0x00200000 +#define STAGEFLAG_PROGRAMMER_INJURED 0x00400000 +#define STAGEFLAG_DOWNLOAD_COMPLETE 0x00800000 +#define STAGEFLAG_LAB_LIFT_LOCATED 0x02000000 +#define STAGEFLAG_PC_DESTROYED 0x04000000 +#define STAGEFLAG_SECURITYHUB_DESTROYED 0x08000000 +#define STAGEFLAG_EXTCOMMSHUB_DESTROYED 0x10000000 +#define STAGEFLAG_DOORSWITCH_DESTROYED 0x20000000 +#define STAGEFLAG_SECETARY_SAW_JO_OR_COOP 0x40000000 +#define STAGEFLAG_LAB_ELEVATOR_CLOSED 0x80000000 + +// AI Lists +#define AILIST_INIT_HOVERCAR 0x0404 +#define AILIST_CASS 0x040f +#define AILIST_INIT_CASS 0x0410 +#define AILIST_SECRETARY 0x0411 +#define AILIST_INIT_SECRETARY 0x0412 +#define AILIST_PROGRAMMER 0x0414 +#define AILIST_OUTRO 0x0416 +#define AILIST_INIT_DD_GUARD 0x0417 +#define AILIST_INIT_SHOCK_GUARD 0x0418 +#define AILIST_INTRO_0419 0x0419 +#define AILIST_INTRO_041A 0x041a +#define AILIST_INTRO_041B 0x041b +#define AILIST_INTRO_041C 0x041c +#define AILIST_INTRO_041E 0x041e +#define AILIST_INTRO_041F 0x041f +#define AILIST_INTRO_041D 0x041d +#define AILIST_INTRO_0420 0x0420 +#define AILIST_INTRO_0421 0x0421 +#define AILIST_INTRO 0x0422 +#define AILIST_INTRO_0423 0x0423 +#define AILIST_INTRO_0424 0x0424 +#define AILIST_INTRO_0425 0x0425 +#define AILIST_INTRO_0426 0x0426 +#define AILIST_INTRO_0427 0x0427 +#define AILIST_INTRO_0428 0x0428 +#define AILIST_INTRO_0429 0x0429 +#define AILIST_INTRO_042A 0x042a +#define AILIST_INTRO_042B 0x042b +#define AILIST_INTRO_042C 0x042c +#define AILIST_INTRO_042D 0x042d +#define AILIST_SURRENDERING_GUARD 0x042f +#define AILIST_INIT_FALCON_GUARD 0x0430 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_AME_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_AME_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_AME_002) + briefing(BRIEFINGTYPE_TEXT_A, L_AME_003) + + beginobjective(0, L_AME_016, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Disable internal security hub" + complete_flags(STAGEFLAG_SECURITYHUB_COMPLETE) + fail_flags(STAGEFLAG_SECURITYHUB_MINES_WASTED) + fail_flags(STAGEFLAG_SECURITYHUB_DESTROYED) + endobjective + + beginobjective(1, L_AME_017, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Obtain keycode necklace" + require_object_collected(OBJ_NECKLACE) + fail_flags(STAGEFLAG_DOORSWITCH_DESTROYED) + fail_flags(STAGEFLAG_CIVILIANS_KILLED) + endobjective + + beginobjective(2, L_AME_018, (DIFFBIT_PA | DIFFBIT_PD)) // "Download project files" + complete_flags(STAGEFLAG_DOWNLOAD_COMPLETE) + fail_flags(STAGEFLAG_PROGRAMMER_DEAD) + fail_flags(STAGEFLAG_DELETED_WITHOUT_DOWNLOAD) + fail_flags(STAGEFLAG_PC_DESTROYED) + endobjective + + beginobjective(3, L_AME_019, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Disable external comms hub" + complete_flags(STAGEFLAG_EXTCOMMSHUB_COMPLETE) + fail_flags(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED) + fail_flags(STAGEFLAG_EXTCOMMSHUB_DESTROYED) + endobjective + + beginobjective(4, L_AME_020, DIFFBIT_A) // "Gain entrance to laboratory" + complete_flags(STAGEFLAG_LAB_LIFT_LOCATED) + fail_flags(STAGEFLAG_CIVILIANS_KILLED) + endobjective + + beginobjective(5, L_AME_020, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Gain entrance to laboratory" + complete_flags(STAGEFLAG_LAB_LIFT_LOCATED) + endobjective + + tag(0x3d, 1) + fan(0x0100, MODEL_DD_FANROOF, PAD_AME_0095, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_AME_0096, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_AME_0097, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_AME_0098, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANWALL, PAD_AME_0099, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000222, 0x00000002, 0x01000000) + tag(0x2e, 1) + door(0x0100, MODEL_DOOR4A_G5, PAD_AME_022B, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001200) + door(0x0100, MODEL_DOOR4B_G5, PAD_AME_022C, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x2f, -1) + door(0x0100, MODEL_DD_DECODOOR, PAD_AME_0226, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD | OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DECODOOR, PAD_AME_0226, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_EXCLUDE_A, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DECODOOR, PAD_AME_0227, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_0229, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_022A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x33, 1) + door(0x0100, MODEL_DD_SECRETDOOR, PAD_AME_0228, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_AUTOMATIC | DOORFLAG_LONGRANGE, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SECRETDOOR, PAD_AME_00BC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_AUTOMATIC | DOORFLAG_LONGRANGE, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00B2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00B3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00A9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00AA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00AB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00AC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00AD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00AE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00B1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0e, 2) + tag(0x0f, 2) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00AF, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000001, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_AME_00B0, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000001, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_AME_00B4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_AME_00B5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_AME_00B6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_AME_00B7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x40, 1) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_AME_00BB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_WINDDOOR, PAD_AME_00B8, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_WINDDOOR, PAD_AME_00B9, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_WINDDOOR, PAD_AME_00BA, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + tag(0x56, 6) + tag(0x57, 6) + tag(0x58, 6) + tag(0x59, 6) + tag(0x4e, 1) + lift(0x0100, MODEL_DD_LIFTR, PAD_AME_0256, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0256, 0x012f, 0x012e, 0x0130, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_0224, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_009C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_009B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_009A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + lift_door(-4, -5, 0) + lift_door(-4, -6, 1) + lift_door(-4, -7, 2) + lift_door(-4, -8, 3) + tag(0x5a, 6) + tag(0x5b, 6) + tag(0x5c, 6) + tag(0x5d, 6) + tag(0x4f, 1) + lift(0x0100, MODEL_DD_LIFTR, PAD_AME_012D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012d, 0x012c, 0x012b, 0x0255, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_009D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_009E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_009F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_AME_0225, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + lift_door(-4, -5, 0) + lift_door(-4, -6, 1) + lift_door(-4, -7, 2) + lift_door(-4, -8, 3) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00BD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00BE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00BF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00C8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00CA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00CB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00CC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00CD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00CE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_00CF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_0235, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_0236, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_0237, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_0238, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_0239, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_AME_023A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_011B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_011C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00DF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0123, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0124, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0125, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0126, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0127, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0128, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0129, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_012A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00E9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00EA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00EB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00EC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00ED, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00EE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00EF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00F9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00FA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00FB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00FC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00FD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00FE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_00FF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0100, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0101, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0102, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0103, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0105, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0106, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0107, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0108, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0109, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_010A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_010B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_010C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_010D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_010E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_010F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0110, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0111, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0112, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0113, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0114, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0104, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0117, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0118, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0119, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_011A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0248, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0249, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_024A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_024B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_024C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_024D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_024E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_024F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0250, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW_FOYER, PAD_AME_0251, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW_FOYER, PAD_AME_0252, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_AME_00D3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_AME_00D4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00D5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00D2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x37, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00D7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00D8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x38, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00D9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_AME_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_00DA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_AME_0253, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_0254, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x3b, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 35) + tag(0x3c, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 35) + tag(0x3a, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 32) + tag(0x39, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01AD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 33) + tag(0x5e, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01B0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01AE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 35) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01B1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01BA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01BB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) +#if VERSION >= VERSION_NTSC_1_0 + tag(0x63, 1) +#endif + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01BC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + tag(0x0d, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH2, PAD_AME_013E, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01B3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01B4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01B5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 8) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01B2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x0c, 1) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01B6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_AME_00DB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x36, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_01B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_01B8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_01B9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 32) + tag(0x35, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_AME_00DD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_022D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_022E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_AME_0232, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_0231, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_0230, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 35) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_0233, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 35) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_0234, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + chr(SPAWNFLAG_00000200, 0x06, PAD_AME_0011, BODY_DD_GUARD, HEAD_RANDOM, 0x040a, 0x001d, -1, 1000, 9, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_01, -1, 3, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x05, PAD_AME_01C0, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, 0x001e, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0005, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x08, PAD_AME_0028, BODY_DD_GUARD, HEAD_RANDOM, 0x040b, -1, -1, 500, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0d, PAD_AME_006F, BODY_DD_GUARD, HEAD_RANDOM, 0x040c, -1, -1, 100, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x07, PAD_AME_0058, BODY_DD_GUARD, HEAD_RANDOM, 0x0407, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0a, PAD_AME_0057, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, CHRFLAG1_HEARSPAWN_ALERT_IF_ALARM | CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0c, PAD_AME_0060, BODY_DD_GUARD, HEAD_RANDOM, 0x0408, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x00, PAD_AME_007D, BODY_DD_GUARD, HEAD_RANDOM, 0x0405, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0000, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0b, PAD_AME_008E, BODY_DD_GUARD, HEAD_RANDOM, 0x0406, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x09, PAD_AME_0081, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, CHRFLAG1_HEARSPAWN_ALERT_IF_ALARM | CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x01, PAD_AME_021A, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 1000, 9, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x02, PAD_AME_021B, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 1000, 9, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0e, PAD_AME_01F6, BODY_DDSHOCK, HEAD_DDSHOCK, 0x040d, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x12, PAD_AME_0221, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0f, PAD_AME_021E, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x10, PAD_AME_021F, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x11, PAD_AME_0220, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x13, PAD_AME_0222, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x03, PAD_AME_021C, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x04, PAD_AME_021D, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x14, PAD_AME_020F, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x15, PAD_AME_020E, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x16, PAD_AME_0210, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x17, PAD_AME_01C6, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 2000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0017, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x18, PAD_AME_01C7, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, 0x35, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x19, PAD_AME_01C8, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, 0x36, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0019, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x1a, PAD_AME_01C9, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1b, PAD_AME_01CA, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0C, 0x37, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1c, PAD_AME_01CB, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0C, 0x38, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x1d, PAD_AME_01CC, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1e, PAD_AME_01CE, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0D, 0x39, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1f, PAD_AME_01CF, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0E, 0x3a, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x20, PAD_AME_01D0, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_DD_GUARD, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0F, 0x3b, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x21, PAD_AME_01D1, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_FALCON_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0F, 0x3c, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2SIL, 0x0021, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, WEAPON_FALCON2_SILENCER) + weapon(0x0100, MODEL_CHRFALCON2SIL, 0x0021, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000 | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_FALCON2_SILENCER) + link_guns(-1, -2) + tag(0x61, -3) + tag(0x62, -3) + + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_CASS, PAD_AME_01C2, BODY_CASSANDRA, HEAD_CASSANDRA, AILIST_INIT_CASS, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_SECRETARY, PAD_AME_01C3, BODY_NEGOTIATOR, HEAD_SECRETARY, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ONLYONPA | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_PROGRAMMER, PAD_AME_007A, BODY_OFFICEWORKER, HEAD_RANDOM, AILIST_PROGRAMMER, -1, -1, 50, 100, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + tag(0x1f, 1) + hovercar(0x004c, MODEL_DD_HOVCOP, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x20, 1) + hovercar(0x004c, MODEL_DD_HOVCOP, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x21, 1) + hovercar(0x004c, MODEL_DD_HOVCAR, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x22, 1) + hovercar(0x004c, MODEL_DD_HOVCAR, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x23, 1) + hovercar(0x004c, MODEL_DD_HOVMOTO, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x24, 1) + hovercar(0x004c, MODEL_DD_HOVMOTO, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x25, 1) + hovercar(0x004c, MODEL_DD_HOVTRUCK, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x26, 1) + hovercar(0x004c, MODEL_DD_HOVTRUCK, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x27, 1) + hovercar(0x004c, MODEL_DD_HOVCAB, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x28, 1) + hovercar(0x004c, MODEL_DD_HOVCAB, PAD_AME_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_DD_AC_UNEXP, PAD_AME_019F, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_DD_AC_EXP, PAD_AME_01A1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_DD_AC_EXP, PAD_AME_01A1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_DD_ACBOT_UNEXP, PAD_AME_019E, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_DD_ACBOT_EXP, PAD_AME_01A0, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_DD_ACBOT_EXP, PAD_AME_01A0, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AME_0140, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AME_0141, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AME_0142, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_AME_0143, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + + tag(0x31, 1) + weapon(0x0180, MODEL_CHRECMMINE, -1, OBJFLAG_00000001, 0, 0, WEAPON_ECMMINE) + rename_object(-1, WEAPON_ECMMINE, L_AME_058, L_AME_059, L_AME_060, L_AME_061, L_AME_062) // "Obtain ECM Mines." + + tag(0x32, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_AME_063, L_AME_064, L_AME_065, L_AME_066, L_AME_067) // "Obtain Data Uplink." + + tag(0x3e, 1) + weapon(0x0180, MODEL_CHRECMMINE, -1, OBJFLAG_00000001, 0, 0, WEAPON_ECMMINE) + rename_object(-1, WEAPON_ECMMINE, L_AME_058, L_AME_059, L_AME_060, L_AME_061, L_AME_062) // "Obtain ECM Mines." + + tag(0x3f, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_AME_063, L_AME_064, L_AME_065, L_AME_066, L_AME_067) // "Obtain Data Uplink." + + tag(0x00, 1) + key(0x0100, MODEL_CHRCHAIN, CHR_CASS, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, 0, 0, 32) + rename_object(-1, WEAPON_NECKLACE, L_AME_011, L_AME_012, L_AME_013, L_AME_014, L_AME_015) // "Obtain De Vries' necklace." + + stdobject(0x0100, MODEL_DD_STONEDESK, PAD_AME_0134, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_AME_0132, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 33) + tag(0x50, 6) + tag(0x51, 6) + tag(0x52, 6) + tag(0x53, 6) + tag(0x54, 6) + tag(0x55, 6) + camera(0x00c0, MODEL_CCTV_PD, PAD_AME_0136, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 400, 0x0011, 0x0000238e, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_AME_0137, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A, 0, 400, 0x0014, 0x00004000, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_AME_0138, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 400, 0x0019, 0x000031c7, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_AME_0139, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A, 0, 400, 0x001d, 0x00001555, 0x0000001e, 0x000003e8) + camera(0x00c0, MODEL_CCTV_PD, PAD_AME_013A, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 400, 0x0067, 0x0000071c, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_AME_013B, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A, 0, 400, 0x0078, 0x00004000, 0x0000001e, 0x000002bc) + camera2(0x0000, 0xfffd05c6, 0xfff25662, 0x000013f6, 0x005a0000, 0x00063f8f, 0x00000219) + tag(0x09, -1) + camera2(0x0000, 0xffff51d2, 0xfffd0422, 0x00000c58, 0x00060000, 0x0005f5c2, 0x00000219) + tag(0x15, -1) + camera2(0x0000, 0xffff67da, 0xfffd8eec, 0xfffe7c44, 0x0004a147, 0x0005f851, 0x00000219) + tag(0x16, -1) + tag(0x04, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_AME_025C, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x03, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_AME_013C, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x14, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH, PAD_AME_013D, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000) + tag(0x10, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_AME_0258, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 8, 3, 0, 0) + tag(0x11, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_AME_0259, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 34, 0, 0) + tag(0x12, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_AME_025A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 35, 3, 0, 0) + tag(0x13, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_AME_025B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 33, 0, 0) + tag(0x19, 2) + tag(0x1a, 2) + stdobject(0x0100, MODEL_DD_BANNER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_BANNER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x17, 1) + stdobject(0x0100, MODEL_DDJUMPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1b, 1) + stdobject(0x0024, MODEL_DDJUMPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x18, 1) + stdobject(0x0100, MODEL_ROPE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1c, 1) + stdobject(0x0051, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1e, 1) + stdobject(0x0024, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1d, 1) + stdobject(0x0051, MODEL_POLICECAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x30, 1) + stdobject(0x0024, MODEL_POLICECAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x29, 1) + stdobject(0x0019, MODEL_DD_HOVCOP, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2a, 1) + stdobject(0x0019, MODEL_DD_HOVCAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2b, 1) + stdobject(0x0019, MODEL_DD_HOVMOTO, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2c, 1) + stdobject(0x0019, MODEL_DD_HOVCAB, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2d, 1) + stdobject(0x0019, MODEL_DD_HOVTRUCK, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_AME_00DE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0121, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0122, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_011F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_AME_0120, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tag(0x41, 1) +#if VERSION >= VERSION_JPN_FINAL + shield(0x0100, MODEL_CHRSHIELD, 0x000a, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_PD, 0, 1000) +#else + shield(0x0100, MODEL_CHRSHIELD, 0x000a, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) +#endif + tag(0x42, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_AME_025F, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x43, 1) + weapon(0x0100, MODEL_CHRPCGUN, PAD_AME_01D2, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + tag(0x44, 1) + weapon(0x0100, MODEL_CHRFALCON2, PAD_AME_01D5, OBJFLAG_00000008 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_FALCON2_SILENCER) + tag(0x45, 1) + weapon(0x0100, MODEL_CHRFALCON2, PAD_AME_01D4, OBJFLAG_00000008 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_FALCON2_SILENCER) + tag(0x46, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_AME_01D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x47, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_AME_01D7, OBJFLAG_00000001 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x48, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_AME_01D8, OBJFLAG_00000001 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x49, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_AME_01D9, OBJFLAG_00000001 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4a, 1) + ammocrate(0x0100, MODEL_CHRFALCON2, PAD_AME_01DA, OBJFLAG_00000001 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4a, 1) + ammocrate(0x0100, MODEL_CHRFALCON2, PAD_AME_01DA, OBJFLAG_00000001 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4b, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_AME_01DB, OBJFLAG_00000001 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4c, 1) + weapon(0x0100, MODEL_CHRCMP150, PAD_AME_025D, OBJFLAG_00000008 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_CMP150) + tag(0x4d, 1) + weapon(0x0100, MODEL_CHRCMP150, PAD_AME_025E, OBJFLAG_00000008 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_CMP150) + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2_SILENCER, -1) + ammo(AMMOTYPE_PISTOL, 80) + ammo(AMMOTYPE_ECM_MINE, 2) + outfit(OUTFIT_DEFAULT) + spawn(PAD_AME_01D3) + endintro +}; + +s32 path00[] = { + PAD_AME_0144, + PAD_AME_0145, + -1, +}; + +s32 path01[] = { + PAD_AME_0146, + PAD_AME_0147, + PAD_AME_0148, + -1, +}; + +s32 path02[] = { + PAD_AME_0149, + PAD_AME_014A, + PAD_AME_014B, + PAD_AME_014C, + PAD_AME_014D, + PAD_AME_014E, + -1, +}; + +s32 path03[] = { + PAD_AME_0152, + PAD_AME_0151, + PAD_AME_0150, + PAD_AME_014F, + -1, +}; + +s32 path04[] = { + PAD_AME_0154, + PAD_AME_0157, + PAD_AME_0156, + PAD_AME_0153, + PAD_AME_0155, + -1, +}; + +s32 path05[] = { + PAD_AME_0159, + PAD_AME_015A, + PAD_AME_015D, + PAD_AME_015B, + PAD_AME_015C, + PAD_AME_0158, + -1, +}; + +s32 path06[] = { + PAD_AME_015E, + PAD_AME_015F, + PAD_AME_0160, + PAD_AME_0161, + PAD_AME_0162, + PAD_AME_0163, + -1, +}; + +s32 path07[] = { + PAD_AME_0167, + PAD_AME_0166, + PAD_AME_0165, + PAD_AME_0168, + PAD_AME_0169, + PAD_AME_0164, + -1, +}; + +s32 path08[] = { + PAD_AME_016A, + PAD_AME_016B, + PAD_AME_016C, + PAD_AME_016D, + -1, +}; + +s32 path09[] = { + PAD_AME_016E, + PAD_AME_016F, + PAD_AME_0170, + PAD_AME_0171, + PAD_AME_0172, + PAD_AME_0173, + -1, +}; + +s32 path10[] = { + PAD_AME_0174, + PAD_AME_0175, + PAD_AME_0176, + PAD_AME_0177, + -1, +}; + +s32 path11[] = { + PAD_AME_0178, + PAD_AME_0179, + PAD_AME_017A, + PAD_AME_017B, + PAD_AME_017C, + PAD_AME_017D, + PAD_AME_017E, + PAD_AME_017F, + -1, +}; + +s32 path12[] = { + PAD_AME_0180, + PAD_AME_0181, + PAD_AME_0182, + -1, +}; + +s32 path13[] = { + PAD_AME_0183, + PAD_AME_0184, + PAD_AME_0185, + -1, +}; + +s32 path14[] = { + PAD_AME_0186, + PAD_AME_0191, + -1, +}; + +s32 path15[] = { + PAD_AME_0187, + PAD_AME_0190, + -1, +}; + +s32 path16[] = { + PAD_AME_0188, + PAD_AME_018F, + -1, +}; + +s32 path17[] = { + PAD_AME_0189, + PAD_AME_018E, + -1, +}; + +s32 path18[] = { + PAD_AME_018C, + PAD_AME_018B, + -1, +}; + +s32 path19[] = { + PAD_AME_018D, + PAD_AME_018A, + -1, +}; + +s32 path20[] = { + PAD_AME_0192, + PAD_AME_019D, + -1, +}; + +s32 path21[] = { + PAD_AME_0193, + PAD_AME_019C, + -1, +}; + +s32 path22[] = { + PAD_AME_0194, + PAD_AME_019B, + -1, +}; + +s32 path23[] = { + PAD_AME_0195, + PAD_AME_019A, + -1, +}; + +s32 path24[] = { + PAD_AME_0197, + PAD_AME_0198, + -1, +}; + +s32 path25[] = { + PAD_AME_0196, + PAD_AME_0199, + -1, +}; + +s32 path26[] = { + PAD_AME_007D, + PAD_AME_007C, + PAD_AME_0077, + PAD_AME_0076, + PAD_AME_008D, + PAD_AME_008C, + PAD_AME_008B, + PAD_AME_0088, + PAD_AME_008B, + PAD_AME_008C, + -1, +}; + +s32 path27[] = { + PAD_AME_008E, + PAD_AME_008D, + PAD_AME_008C, + PAD_AME_008B, + PAD_AME_0088, + -1, +}; + +s32 path30[] = { + PAD_AME_000C, + PAD_AME_000B, + PAD_AME_000F, + PAD_AME_0010, + PAD_AME_0013, + PAD_AME_0011, + PAD_AME_0012, + PAD_AME_0011, + PAD_AME_0010, + PAD_AME_000F, + PAD_AME_000B, + -1, +}; + +s32 path32[] = { + PAD_AME_0028, + PAD_AME_0029, + PAD_AME_002F, + PAD_AME_0030, + PAD_AME_002B, + PAD_AME_002A, + PAD_AME_002D, + PAD_AME_002C, + PAD_AME_002E, + PAD_AME_0031, + PAD_AME_0032, + PAD_AME_003B, + PAD_AME_003A, + PAD_AME_0039, + -1, +}; + +s32 path33[] = { + PAD_AME_0032, + PAD_AME_003B, + PAD_AME_003A, + PAD_AME_0039, + PAD_AME_0074, + PAD_AME_006E, + PAD_AME_006D, + PAD_AME_0072, + PAD_AME_0073, + PAD_AME_0070, + PAD_AME_0071, + PAD_AME_006F, + -1, +}; + +s32 path34[] = { + PAD_AME_01F6, + PAD_AME_01F5, + PAD_AME_01F4, + PAD_AME_01F3, + PAD_AME_01F2, + PAD_AME_01F0, + PAD_AME_01EF, + PAD_AME_01EE, + PAD_AME_01EC, + PAD_AME_01E8, + PAD_AME_01E6, + PAD_AME_01E5, + PAD_AME_01DD, + PAD_AME_01E4, + PAD_AME_01E3, + PAD_AME_01E2, + PAD_AME_01E1, + -1, +}; + +s32 path35[] = { + PAD_AME_007C, + PAD_AME_0078, + PAD_AME_0077, + PAD_AME_0076, + PAD_AME_008E, + PAD_AME_008D, + PAD_AME_008C, + PAD_AME_008B, + PAD_AME_008A, + PAD_AME_0089, + PAD_AME_0088, + PAD_AME_0090, + PAD_AME_0075, + PAD_AME_006F, + PAD_AME_0071, + PAD_AME_0070, + PAD_AME_0073, + PAD_AME_0066, + PAD_AME_0058, + PAD_AME_0059, + PAD_AME_005A, + PAD_AME_0067, + PAD_AME_0068, + PAD_AME_005B, + PAD_AME_005C, + PAD_AME_005D, + PAD_AME_005E, + PAD_AME_0061, + -1, +}; + +s32 path31[] = { + PAD_AME_0011, + PAD_AME_0013, + PAD_AME_0014, + PAD_AME_0015, + PAD_AME_0016, + PAD_AME_0017, + -1, +}; + +s32 path28[] = { + PAD_AME_0058, + PAD_AME_0067, + PAD_AME_0068, + PAD_AME_005B, + PAD_AME_005D, + -1, +}; + +s32 path29[] = { + PAD_AME_0060, + PAD_AME_005F, + PAD_AME_0056, + PAD_AME_0055, + PAD_AME_0051, + PAD_AME_0052, + PAD_AME_0053, + -1, +}; + +/** + * @unused + */ +u8 func0401_do_some_animation[] = { + // Do some animation + restart_timer + chr_do_animation(ANIM_0066, 0, 1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) + + beginloop(0x08) + if_timer_gt(0, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + chr_do_animation(ANIM_0066, 1, -1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) + + beginloop(0x85) + endloop(0x85) + + // Unreachable + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func0402_guard_with_chrflag[] = { + set_returnlist(CHR_SELF, 0x0402) + set_self_chrflag(CHRCFLAG_00000200) + set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) + endlist +}; + +/** + * @unused + */ +u8 func0403_shielded_guard[] = { + set_shield(200) + set_self_chrflag(CHRCFLAG_00000200) + set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) + endlist +}; + +u8 func0404_init_hovercar[] = { + begin_hovercar_path(0) + set_vehicle_speed(0x0c00, 120) + + beginloop(0x04) + reloop(0x04) + + // Unreachable + label(0x08) + set_vehicle_speed(0x0600, 120) + reloop(0x04) + + label(0x09) + set_vehicle_speed(0x0700, 120) + reloop(0x04) + + label(0x0a) + set_vehicle_speed(0x0800, 120) + reloop(0x04) + + label(0x0b) + set_vehicle_speed(0x0900, 120) + reloop(0x04) + + label(0x0c) + set_vehicle_speed(0x0a00, 120) + reloop(0x04) + + label(0x0d) + set_vehicle_speed(0x0b00, 120) + reloop(0x04) + + label(0x0e) + set_vehicle_speed(0x0d00, 120) + endloop(0x04) + + endlist +}; + +#define do_path(path) \ + assign_path(path) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) \ + endlist + +u8 func0405_start_path26[] = { + do_path(26) +}; + +u8 func0406_start_path27[] = { + do_path(27) +}; + +u8 func0407_start_path28[] = { + do_path(28) +}; + +u8 func0408_start_path29[] = { + do_path(29) +}; + +u8 func0409_start_path30[] = { + do_path(30) +}; + +u8 func040a_start_path31[] = { + set_chr_dodge_rating(2, 20) + set_unarmeddodgerating(0) + set_accuracy(0) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_returnlist(CHR_SELF, 0x040a) + assign_path(31) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040b_start_path32[] = { + set_chr_dodge_rating(2, 20) + set_unarmeddodgerating(0) + set_accuracy(0) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(32) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040c_start_path33[] = { + set_chr_dodge_rating(2, 20) + set_unarmeddodgerating(0) + set_accuracy(0) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(33) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040d_start_path34[] = { + set_chr_dodge_rating(2, 20) + set_unarmeddodgerating(0) + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(34) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040e_start_path35[] = { + assign_path(35) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0410_init_cass[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_CASS) + endlist +}; + +u8 func040f_cass[] = { + set_shotlist(GAILIST_IDLE) + if_chr_dead(CHR_CASS, /*goto*/ 0x06) + if_chr_knockedout(CHR_CASS, /*goto*/ 0x06) + goto_next(0x2c) + + // Dying + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + // Wait for player to enter room + beginloop(0x59) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x5a) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x5a) + set_target_chr(CHR_BOND) + if_stage_flag_eq(STAGEFLAG_SECETARY_SAW_JO_OR_COOP, TRUE, /*goto*/ 0xbe) + endloop(0x59) + + label(0xbe) + if_stage_flag_eq(STAGEFLAG_SECRETARY_SAW_COOP, TRUE, /*goto*/ 0xbf) + set_target_chr(CHR_BOND) + goto_next(0x5a) + + label(0xbf) + set_target_chr(CHR_COOP) + goto_next(0x5a) + + // Face target chr (Jo or Velvet) + label(0x5a) + stop_chr + yield + unset_stage_flag(STAGEFLAG_SECETARY_SAW_JO_OR_COOP) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x5b) + + beginloop(0x5b) + if_chr_stopped(/*goto*/ 0x5c) + endloop(0x5b) + + label(0x5c) + speak(CHR_TARGET, L_AME_021, MP3_02F4, CHANNEL_6, COLOR_04_ORANGE) // "Who are you and what are you doing here?" + restart_timer + chr_do_animation(ANIM_TALKING_0098, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x5d) + if_sound_finished(CHANNEL_6, /*goto*/ 0x5e) + endloop(0x5d) + + // Walk backwards for 4 seconds + label(0x5e) + stop_chr + chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + restart_timer + + beginloop(0x5f) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x5f) + + label(0x06) + stop_chr + + // Face target again + label(0x06) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x64) + + beginloop(0x64) + if_target_in_fov_left(10, /*goto*/ 0x65) + if_timer_gt(90, /*goto*/ 0x65) + endloop(0x64) + + label(0x65) + restart_timer + if_can_see_target(/*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005b, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005c, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005d, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005e, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005f, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0060, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0061, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0062, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0064, /*goto*/ 0x2c) + goto_next(0x66) + + label(0x2c) + speak(CHR_TARGET, L_AME_023, MP3_02F5, CHANNEL_6, COLOR_04_ORANGE) // "You won't shoot me, foolish child!" + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x66) + if_sound_finished(CHANNEL_6, /*goto*/ 0x67) + endloop(0x66) + + label(0x67) + if_can_see_target(/*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005b, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005c, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005d, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005e, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005f, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0060, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0061, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0062, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0064, /*goto*/ 0x2c) + goto_next(0x68) + + label(0x2c) + chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + speak(CHR_TARGET, L_AME_024, MP3_02F6, CHANNEL_6, COLOR_04_ORANGE) // "Don't you know who I am?" + + beginloop(0x68) + if_sound_finished(CHANNEL_6, /*goto*/ 0x69) + endloop(0x68) + + label(0x69) + walk_to_pad(PAD_AME_004D) + + beginloop(0x60) + if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_AME_004D, /*goto*/ 0x06) + endloop(0x60) + + label(0x06) + walk_to_pad(PAD_AME_004E) + + beginloop(0x61) + if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_AME_004E, /*goto*/ 0x06) + endloop(0x61) + + label(0x06) + walk_to_pad(PAD_AME_0041) + + beginloop(0x62) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x62) + + label(0x06) + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, 0x0042, /*goto*/ 0xb8) + + beginloop(0xb8) + if_timer_gt(60, /*goto*/ 0x63) + endloop(0xb8) + + label(0x63) + if_can_see_target(/*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005b, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005c, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005d, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005e, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x005f, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0060, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0061, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0062, /*goto*/ 0x2c) + if_chr_in_room(CHR_TARGET, 0x00, 0x0064, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + speak(CHR_TARGET, L_AME_025, MP3_02F7, CHANNEL_6, COLOR_04_ORANGE) // "Let's see how you deal with security." + label(0x06) + chr_do_animation(ANIM_PUSH_BUTTON, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x6a) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x6a) + + label(0x06) + activate_alarm + + label(0x6b) + stop_chr + yield + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x6c) + + beginloop(0x6c) + call_rng + if_rand_lt(250, /*goto*/ 0x06) + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x2c) + label(0x2c) + call_rng + if_distance_to_target_gt(500, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x6d) + label(0x06) + endloop(0x6c) + + label(0x6d) + restart_timer + say_quip(CHR_TARGET, 0x00, 0xff, 0x00, 0xff, BANK_1, 0x01, 0x04) // "How dare you disturb me","You will regret this intrusion girl","If I were you I'd leave, now" + chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x6e) + if_timer_gt(100, /*goto*/ 0x6f) + endloop(0x6e) + + label(0x6f) + restart_timer + + beginloop(0x70) + if_timer_gt(300, /*goto*/ 0x71) + endloop(0x70) + + label(0x71) + goto_first(0x6b) + + endlist +}; + +u8 func0412_init_secretary[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_SECRETARY) + endlist +}; + +u8 func0411_secretary[] = { + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_hiddenflag(CHR_SECRETARY, CHRHFLAG_00100000) + chr_move_to_pad(CHR_SECRETARY, PAD_AME_01C3, 0x00, /*goto*/ 0x2c) + label(0x2c) + stop_chr + label(0x06) + set_shotlist(GAILIST_IDLE) + if_chr_dead(CHR_SECRETARY, /*goto*/ 0x06) + if_chr_knockedout(CHR_SECRETARY, /*goto*/ 0x06) + goto_next(0x2c) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + chr_do_animation(ANIM_00A1, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x72) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x73) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x74) + set_target_chr(CHR_BOND) + endloop(0x72) + + label(0x74) + set_stage_flag(STAGEFLAG_SECRETARY_SAW_COOP) + label(0x73) + stop_chr + restart_timer + set_stage_flag(STAGEFLAG_SECETARY_SAW_JO_OR_COOP) + + beginloop(0x7a) + if_timer_gt(20, /*goto*/ 0x7b) + endloop(0x7a) + + label(0x7b) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x7c) + + beginloop(0x7c) + if_timer_lt(80, /*goto*/ 0x2c) + if_sound_finished(CHANNEL_6, /*goto*/ 0x7d) + label(0x2c) + endloop(0x7c) + + label(0x7d) + restart_timer + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x2c) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x2c) + speak(CHR_TARGET, L_AME_022, MP3_02ED, CHANNEL_5, COLOR_07_RED) // "Look out! She's got a gun." + label(0x2c) + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x75) + if_timer_gt(60, /*goto*/ 0x76) + endloop(0x75) + + label(0x76) + set_action(MA_PANIC, FALSE) + jog_to_pad(PAD_AME_0047) + + beginloop(0x77) + if_chr_stopped(/*goto*/ 0x78) + endloop(0x77) + + label(0x78) + chr_do_animation(ANIM_COWER_01F5, -1, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 20, CHR_SELF, 2) + + beginloop(0x79) + if_distance_to_target_gt(500, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x7e) + label(0x06) + endloop(0x79) + + label(0x7e) + restart_timer + chr_do_animation(ANIM_COWER_01F5, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + yield + goto_next(0x81) + + // Unreachable + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x7f) + + beginloop(0x7f) + if_target_in_fov_left(10, /*goto*/ 0x81) + if_timer_gt(120, /*goto*/ 0x81) + endloop(0x7f) + + label(0x81) + restart_timer + say_quip(CHR_TARGET, 0x01, 0xff, 0x00, 0xff, BANK_1, 0x02, 0x07) // "Please don't kill me","Don't shoot!" + chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x82) + if_timer_gt(180, /*goto*/ 0x83) + endloop(0x82) + + label(0x83) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + + beginloop(0x84) + call_rng + if_rand_gt(254, /*goto*/ 0x06) + endloop(0x84) + + label(0x06) + goto_first(0x78) + + endlist +}; + +u8 func0414_programmer[] = { +#define LABEL_JO_SPEAK 0x9c +#define LABEL_RUN_TO_GUARD 0xa5 +#define LABEL_NEAR_LAPTOPGUN_ROOM 0xa8 +#define LABEL_LOG_ON 0xaa +#define LABEL_PC_BROKEN 0xc5 + + // PA only + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + set_reaction_speed(100) + set_shotlist(AILIST_PROGRAMMER) + set_chr_chrflag(CHR_PROGRAMMER, CHRCFLAG_CANFACEWALL) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x2c) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + if_num_times_shot_lt(1, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_PROGRAMMER_INJURED) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x2c) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x2c) + if_sound_finished(CHANNEL_3, /*goto*/ 0x90) + goto_next(0x2c) + + label(0x90) + speak(CHR_TARGET, L_AME_053, MP3_02FE, CHANNEL_3, COLOR_03_RED) // "Don't shoot, don't shoot!" + label(0x2c) + restart_timer + + beginloop(0xab) + if_chr_stopped(/*goto*/ LABEL_JO_SPEAK) + endloop(0xab) + + // Hasn't been shot + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + stop_chr + + // Wait until Jo or Velvet near his office + beginloop(0x91) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) + if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, 80, 1240, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, 80, 1240, /*goto*/ 0x06) +#else + set_target_chr(CHR_BOND) + if_chr_distance_to_pad_lt(CHR_TARGET, 800, 124, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_chr_distance_to_pad_lt(CHR_TARGET, 800, 124, /*goto*/ 0x06) +#endif + endloop(0x91) + + // Phone ringing + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_4, OBJ_PCMONITOR, SFX_8109, 0x0f, 0x02) +#else + speak(CHR_TARGET, -1, SFX_8109, CHANNEL_4, COLOR_00_GREEN) +#endif + + // Wait until Jo or Velvet is close to his door + beginloop(0x92) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) + if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, PAD_AME_0014, 1240, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, PAD_AME_0014, 1240, /*goto*/ 0x06) +#else + set_target_chr(CHR_BOND) + if_chr_distance_to_pad_lt(CHR_TARGET, 200, 124, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_chr_distance_to_pad_lt(CHR_TARGET, 200, 124, /*goto*/ 0x06) +#endif + endloop(0x92) + + label(0x06) + restart_timer + + beginloop(0x8e) + if_timer_gt(40, /*goto*/ 0x2c) + endloop(0x8e) + + label(0x2c) + mute_channel(CHANNEL_4) // stop ringing + restart_timer + + beginloop(0x8f) + if_timer_gt(90, /*goto*/ 0x2c) + endloop(0x8f) + + // The timer in the following is dialogue is used to measure the gap between + // speaks. + label(0x2c) + restart_timer + speak(CHR_TARGET, L_AME_068, SFX_8104, CHANNEL_3, COLOR_03_RED) // "Yes, yes, I agree. Personality is expendable in th..." + restart_timer + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x08) + pause_timer + if_sound_finished(CHANNEL_3, /*goto*/ 0x06) + reloop(0x08) + + label(0x06) + resume_timer + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + yield + yield + yield + speak(CHR_TARGET, L_AME_069, SFX_8105, CHANNEL_3, COLOR_03_RED) // "No, I can start the process from my office termina..." + restart_timer + + beginloop(0x0e) + pause_timer + if_sound_finished(CHANNEL_3, /*goto*/ 0x06) + reloop(0x0e) + + label(0x06) + resume_timer + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + speak(CHR_TARGET, L_AME_070, SFX_8106, CHANNEL_3, COLOR_03_RED) // "I'll begin at once. Goodbye." + + beginloop(0x0f) + if_sound_finished(CHANNEL_3, /*goto*/ 0x06) + endloop(0x0f) + + label(0x06) + stop_chr + walk_to_pad(PAD_AME_0062) + restart_timer + + beginloop(0x09) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_stage_flag(STAGEFLAG_PROGRAMMER_WALKING) + label(0x06) + + label(0x99) + walk_to_pad(PAD_AME_0062) + + // While walking, check for anything that might cause him to detect Jo. + + // @bug The condition to jump to log on should be a distance check rather + // than chr stopped. If the programmer's pathing has failed then he will + // have stopped without being near the PC. This bug is repeated several + // times in this function but only documented here. + beginloop(0x93) + if_target_in_sight(/*goto*/ 0x96) + if_near_miss(/*goto*/ 0x96) + if_saw_injury(0x00, /*goto*/ 0x96) + if_saw_death(0x00, /*goto*/ 0x96) + if_hears_target(/*goto*/ 0x96) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_RAN_TO_GUARD, TRUE, /*goto*/ 0x2c) + if_sees_suspicious_item(/*goto*/ 0x96) + label(0x2c) + if_chr_stopped(/*goto*/ LABEL_LOG_ON) + endloop(0x93) + + // Detected Jo + label(0x96) + restart_timer + set_alertness(255) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x9a) + + beginloop(0x9a) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x9a) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x06) + speak(CHR_TARGET, L_AME_036, MP3_0300, CHANNEL_3, COLOR_03_RED) // "HELP - Intruder!" + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0xa3) + if_sound_finished(CHANNEL_3, /*goto*/ 0x06) + endloop(0xa3) + + label(0x06) + if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007d, /*goto*/ LABEL_NEAR_LAPTOPGUN_ROOM) + if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007e, /*goto*/ LABEL_NEAR_LAPTOPGUN_ROOM) + if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007f, /*goto*/ LABEL_NEAR_LAPTOPGUN_ROOM) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_INJURED, TRUE, /*goto*/ LABEL_JO_SPEAK) + + label(0xa2) + if_can_see_target(/*goto*/ 0x06) + goto_next(0x2c) + + // Can see Jo, and not injured or near Laptop Gun room + label(0x06) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_RAN_TO_GUARD, TRUE, /*goto*/ 0x06) + + label(0x2c) + speak(CHR_TARGET, L_AME_079, SFX_8107, CHANNEL_3, COLOR_03_RED) // "Security... Help me!" + goto_next(0xa1) + + label(0x06) + speak(CHR_TARGET, L_AME_038, SFX_8108, CHANNEL_3, COLOR_03_RED) // "HELP, HELP!" + label(0xa1) + restart_timer + set_stage_flag(STAGEFLAG_PROGRAMMER_RAN_TO_GUARD) + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ LABEL_RUN_TO_GUARD) + unset_object_flag2(OBJ_LAPTOPGUNDOOR, OBJFLAG2_AICANNOTUSE) + jog_to_pad(PAD_AME_0086) + + beginloop(0x97) + if_timer_lt(240, /*goto*/ 0x06) + if_can_see_target(/*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + if_distance_to_target_lt(300, /*goto*/ LABEL_JO_SPEAK) + label(0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x97) + + label(0x06) + set_stage_flag(STAGEFLAG_PROGRAMMER_INJURED) + restart_timer + unlock_door(OBJ_LAPTOPGUNDOOR, 0x02) + chr_do_animation(ANIM_COWER_01F5, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 16, CHR_SELF, 2) + + beginloop(0x0d) + if_timer_gt(300, /*goto*/ 0xb5) + if_distance_to_target_gt(300, /*goto*/ 0x2c) + if_can_see_target(/*goto*/ 0x06) + goto_next(0x2c) + label(0x06) + if_within_targets_fovx_by_angle(40, /*goto*/ LABEL_JO_SPEAK) + label(0x2c) + endloop(0x0d) + + label(0xb5) + goto_first(0x99) + + label(LABEL_RUN_TO_GUARD) + try_run_to_chr(CHR_PRESET, /*goto*/ 0xa6) + + beginloop(0xa6) + if_detected_chr(CHR_PRESET, /*goto*/ 0xa7) + if_timer_lt(120, /*goto*/ 0x06) + if_can_see_target(/*goto*/ LABEL_JO_SPEAK) + goto_next(0x06) + if_distance_to_target_lt(300, /*goto*/ LABEL_JO_SPEAK) + label(0x06) + if_chr_stopped(/*goto*/ 0xa7) + endloop(0xa6) + + label(0xa7) + speak(CHR_TARGET, L_AME_038, SFX_8108, CHANNEL_3, COLOR_03_RED) // "HELP, HELP!" + increase_squadron_alertness(100) + endloop(0x99) + + label(LABEL_JO_SPEAK) + restart_timer + if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x2c) + speak(CHR_TARGET, L_AME_072, MP3_0322, CHANNEL_3, COLOR_09_BLUE) // "I've got a password problem, and you're the man to..." + goto_next(0x06) + label(0x2c) + speak(CHR_TARGET, L_AME_071, MP3_0323, CHANNEL_3, COLOR_09_BLUE) // "Move it!" + label(0x06) + set_stage_flag(STAGEFLAG_TALKED_TO_PROGRAMMER) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x9b) + + beginloop(0x9b) + if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x06) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x9b) + + label(0x06) + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x10) + if_sound_finished(CHANNEL_3, /*goto*/ 0x06) + endloop(0x10) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x2c) + speak(CHR_TARGET, L_AME_035, MP3_02FF, CHANNEL_5, COLOR_03_RED) // "I'll do what you want!" + set_stage_flag(STAGEFLAG_TALKED_TO_PROGRAMMER) + goto_next(0x06) + label(0x2c) + speak(CHR_TARGET, L_AME_073, MP3_02FE, CHANNEL_5, COLOR_03_RED) // "Don't shoot, don't shoot!" + label(0x06) + chr_do_animation(ANIM_DONT_SHOOT, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x9f) + if_sound_finished(CHANNEL_5, /*goto*/ 0x9d) + endloop(0x9f) + + label(0x9d) + walk_to_pad(PAD_AME_0062) + + beginloop(0x9e) + if_chr_stopped(/*goto*/ LABEL_LOG_ON) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_INJURED, TRUE, /*goto*/ 0x06) + if_distance_to_target_lt(500, /*goto*/ 0x06) + if_within_targets_fovx_by_angle(40, /*goto*/ 0x06) + if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007d, /*goto*/ 0x06) + if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007e, /*goto*/ 0x06) + if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007f, /*goto*/ 0x06) + goto_next(0xa0) + label(0x06) + endloop(0x9e) + + label(0xa0) + goto_first(0xa2) + + label(LABEL_NEAR_LAPTOPGUN_ROOM) + stop_chr + speak(CHR_TARGET, L_AME_039, MP3_02FF, CHANNEL_3, COLOR_03_RED) // "I'll do what you want..." + restart_timer + label(0x06) + walk_to_pad(PAD_AME_0062) + + beginloop(0xa9) + if_chr_stopped(/*goto*/ LABEL_LOG_ON) + endloop(0xa9) + + label(LABEL_LOG_ON) + restart_timer + if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) + if_detected_chr(CHR_TARGET, /*goto*/ 0x2c) + speak(CHR_TARGET, L_AME_040, MP3_0301, CHANNEL_3, COLOR_03_RED) // "Logging on now..." + goto_next(0x06) + label(0x2c) + speak(CHR_TARGET, L_AME_109, MP3_0304, CHANNEL_3, COLOR_03_RED) // "I...I'm logging on now." + label(0x06) + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + speak(CHR_TARGET, -1, SFX_8116, -1, COLOR_00_GREEN) + + beginloop(0xae) + if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) + if_timer_gt(360, /*goto*/ 0x06) + endloop(0xae) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) + chr_do_animation(ANIM_PUSH_BUTTON, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + set_stage_flag(STAGEFLAG_PROGRAMMER_LOGGED_IN) + if_detected_chr(CHR_TARGET, /*goto*/ 0x2c) + speak(CHR_TARGET, L_AME_041, MP3_0302, CHANNEL_3, COLOR_03_RED) // "Okay, I'm in..." + goto_next(0x06) + label(0x2c) + speak(CHR_TARGET, L_AME_108, MP3_0305, CHANNEL_3, COLOR_03_RED) // "Right, I'm in..." + label(0x06) + speak(CHR_TARGET, -1, SFX_8117, -1, COLOR_00_GREEN) + + beginloop(0xaf) + if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) + if_chr_dead(CHR_SELF, /*goto*/ 0xb1) + if_timer_gt(1040, /*goto*/ 0x06) + endloop(0xaf) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) + set_stage_flag(STAGEFLAG_PERSONALITY_DELETED) + set_chr_maxdamage(CHR_SELF, 1) + chr_do_animation(ANIM_TALKING_003D, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + speak(CHR_TARGET, L_AME_042, MP3_0303, CHANNEL_3, COLOR_03_RED) // "Goodbye, Dr. Caroll." + if_stage_flag_eq(STAGEFLAG_DOWNLOAD_COMPLETE, TRUE, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_DELETED_WITHOUT_DOWNLOAD) + label(0x2c) + speak(CHR_TARGET, -1, SFX_TYPING_8118, -1, COLOR_00_GREEN) + + beginloop(0xb0) + endloop(0xb0) + + label(0xb1) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_PC_BROKEN) + set_self_flag_bankx(CHRFLAG0_CANT_ALERT_GROUP, BANK_0) + speak(CHR_TARGET, L_AME_098, MP3_SCI_YOU_VANDAL, CHANNEL_3, COLOR_03_RED) // "You vandal, you've broken it!" + do_preset_animation(PRESETANIM_TALKRANDOM) + + beginloop(0xc6) + if_sound_finished(CHANNEL_3, /*goto*/ 0x06) + endloop(0xc6) + + label(0x06) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * This function appears to be pointless considering you have control during the + * conversation anyway. Perhaps at one point during development there was a + * cutscene for the phone conversation? + */ +u8 func1005_give_control[] = { + beginloop(0x52) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_WALKING, TRUE, /*goto*/ 0x06) + endloop(0x52) + + label(0x06) + label(0x2c) + yield + grant_control(CHR_BOND) + grant_control(CHR_COOP) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func0415_set_idle[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func0413_c318[] = { + set_accuracy(10) + try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_squadron(SQUADRON_09) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) + set_alertness(255) + set_self_chrflag(CHRCFLAG_00000200) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) + endlist +}; + +u8 func100e_check_ecm_mines[] = { + yield +#if VERSION >= VERSION_NTSC_1_0 + yield + yield + yield + yield + yield + yield +#endif + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + give_object_to_chr(OBJ_ECMMINE_BOND, CHR_BOND) + give_object_to_chr(OBJ_ECMMINE_COOP, CHR_COOP) + label(0x06) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x00) + give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) + give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) + + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_SECURITYHUB_COMPLETE, TRUE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_SECURITYHUB_MINES_WASTED, TRUE, /*goto*/ 0x2c) + if_weapon_thrown_on_object(WEAPON_ECMMINE, OBJ_SECURITYHUB, /*goto*/ 0x08) + label(0x06) + if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_COMPLETE, TRUE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED, TRUE, /*goto*/ 0x2c) + if_weapon_thrown_on_object(WEAPON_ECMMINE, OBJ_EXTCOMMSHUB, /*goto*/ 0x0a) + label(0x06) + if_timer_gt(0, /*goto*/ 0x06) + if_weapon_thrown(WEAPON_ECMMINE, /*goto*/ 0x0b) + label(0x2c) + reloop(0x00) + + label(0x06) + if_timer_gt(240, /*goto*/ 0x53) + reloop(0x00) + + label(0x08) + reset_timer + show_hudmsg(CHR_BOND, L_AME_029) // "ECM Mine placed correctly." + yield + mute_channel(CHANNEL_0) + assign_sound(SFX_8113, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_SECURITYHUB, TRUE) + show_hudmsg(CHR_BOND, L_AME_076) // "Internal security system temporarily disabled." + set_stage_flag(STAGEFLAG_SECURITYHUB_COMPLETE) + reloop(0x00) + + label(0x0a) + reset_timer + show_hudmsg(CHR_BOND, L_AME_029) // "ECM Mine placed correctly." + yield + mute_channel(CHANNEL_1) + assign_sound(SFX_8113, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_EXTCOMMSHUB, TRUE) + show_hudmsg(CHR_BOND, L_AME_077) // "External communications hub disabled." + set_stage_flag(STAGEFLAG_EXTCOMMSHUB_COMPLETE) + reloop(0x00) + + label(0x0b) + restart_timer + reloop(0x00) + + // Check ECM mines wasted + label(0x53) + reset_timer + if_stage_flag_eq(STAGEFLAG_SECURITYHUB_COMPLETE, TRUE, /*goto*/ 0x88) + if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_COMPLETE, TRUE, /*goto*/ 0x89) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0xbe) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbe) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 2, /*goto*/ 0xbf) + reloop(0x00) + + label(0xbe) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xc0) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 2, /*goto*/ 0xc0) + reloop(0x00) + + label(0xbf) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xc0) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xc0) + reloop(0x00) + + label(0xc0) + goto_next(0x8d) + + // Security hub is complete + label(0x88) + if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_COMPLETE, TRUE, /*goto*/ 0x8a) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0xbe) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbe) + reloop(0x00) + + label(0xbe) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xbf) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbf) + reloop(0x00) + + label(0xbf) + goto_next(0x8b) + + // Comms hub is complete + label(0x89) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0xbe) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbe) + reloop(0x00) + + label(0xbe) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xbf) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbf) + reloop(0x00) + + // Mines wasted with security hub remaining + label(0xbf) + goto_next(0x06) + label(0x06) + set_stage_flag(STAGEFLAG_SECURITYHUB_MINES_WASTED) + goto_next(0x8c) + + // Mines wasted with comms hub remaining + label(0x8b) + set_stage_flag(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED) + + label(0x8c) + show_hudmsg(CHR_BOND, L_AME_028) // "Badly placed ECM Mine." + reloop(0x00) + + // Mines wasted with both hubs remaining + label(0x8d) + show_hudmsg(CHR_BOND, L_AME_028) // "Badly placed ECM Mine." + show_hudmsg(CHR_BOND, L_AME_032) // "CANNOT complete all objectives." + set_stage_flag(STAGEFLAG_SECURITYHUB_MINES_WASTED) + set_stage_flag(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED) + reloop(0x00) + + // Both hubs are complete + label(0x8a) + endloop(0x00) + + beginloop(0x06) + endloop(0x06) + + endlist +}; + +u8 func1004_check_lab_lift_located[] = { + beginloop(0x52) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LABLIFTDOOR1, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LABLIFTDOOR2, /*goto*/ 0x2c) + if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x2c) + reloop(0x52) + + label(0x2c) + if_stage_flag_eq(STAGEFLAG_LAB_LIFT_LOCATED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_P1P2, L_AME_078) // "Laboratory lift located." + set_stage_flag(STAGEFLAG_LAB_LIFT_LOCATED) + label(0x2c) + yield + if_all_objectives_complete(/*goto*/ 0x2c) + endloop(0x52) + + label(0x2c) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func1006_check_programmer_dead[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + + beginloop(0x04) + if_chr_dead(CHR_PROGRAMMER, /*goto*/ 0x2c) + if_chr_knockedout(CHR_PROGRAMMER, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_LOGGED_IN, TRUE, /*goto*/ 0x06) + show_hudmsg(CHR_BOND, L_AME_057) // "Critical mission personnel killed." + set_stage_flag(STAGEFLAG_PROGRAMMER_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + label(0xac) + yield + goto_first(0x06) + + endlist +}; + +u8 func1007_uplinking[] = { + beginloop(0x04) + if_chr_activated_object(CHR_BOND, OBJ_PC, /*goto*/ 0xbe) + if_chr_activated_object(CHR_COOP, OBJ_PC, /*goto*/ 0xbf) + reloop(0x04) + + label(0xbe) + set_target_chr(CHR_BOND) + goto_next(0xc0) + + label(0xbf) + set_target_chr(CHR_COOP) + goto_next(0xc0) + + label(0xc0) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2c) + show_hudmsg(CHR_TARGET, L_AME_049) // "Unable to download - Data Uplink needed." + call_rng + if_rand_lt(60, /*goto*/ 0x0d) + if_rand_lt(120, /*goto*/ 0x0e) + if_rand_lt(180, /*goto*/ 0x0f) + + label(0x0c) + speak(CHR_TARGET, -1, SFX_8116, -1, COLOR_00_GREEN) + goto_next(0x06) + + label(0x0d) + speak(CHR_TARGET, -1, SFX_8117, -1, COLOR_00_GREEN) + goto_next(0x06) + + label(0x0e) + speak(CHR_TARGET, -1, SFX_TYPING_8118, -1, COLOR_00_GREEN) + goto_next(0x06) + + label(0x0f) + speak(CHR_TARGET, -1, SFX_TYPING_8118, -1, COLOR_00_GREEN) + + label(0x06) + restart_timer + + beginloop(0x10) + if_timer_gt(120, /*goto*/ 0x06) + goto_first(0x10) + + label(0x06) + reloop(0x04) + + label(0x2c) + if_stage_flag_eq(STAGEFLAG_PROGRAMMER_LOGGED_IN, TRUE, /*goto*/ 0xae) + restart_timer + show_hudmsg(CHR_TARGET, L_AME_046) // "ACCESS DENIED - password needed." + assign_sound(SFX_01C0, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_PC, FALSE) + + beginloop(0xaf) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0xaf) + + label(0x06) + mute_channel(CHANNEL_7) + goto_first(0x04) + + label(0xae) + show_hudmsg(CHR_TARGET, L_AME_044) // "File download initiated." + assign_sound(SFX_01BF, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_PC, TRUE) + restart_timer + + // @bug: Missing check for player still having uplink equipped + beginloop(0xac) + if_chr_distance_to_pad_gt(CHR_TARGET, 250, PAD_AME_01B6, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_DELETED_WITHOUT_DOWNLOAD, TRUE, /*goto*/ 0x12) + if_timer_gt(300, /*goto*/ 0xad) + endloop(0xac) + + label(0xad) + mute_channel(CHANNEL_7) + assign_sound(SFX_01C1, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_PC, TRUE) + show_hudmsg(CHR_TARGET, L_AME_045) // "File download completed." + yield + set_stage_flag(STAGEFLAG_DOWNLOAD_COMPLETE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + show_hudmsg(CHR_TARGET, L_AME_074) // "Datalink broken - connection terminated." + mute_channel(CHANNEL_7) + assign_sound(SFX_01C0, CHANNEL_6) + play_sound_from_object(CHANNEL_6, OBJ_PC, 1, 300, 400) + restart_timer + + beginloop(0x11) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x11) + + label(0x06) + mute_channel(CHANNEL_6) + reloop(0x04) + + label(0x12) + show_hudmsg(CHR_TARGET, L_AME_075) // "Datalink error - incomplete file download." + mute_channel(CHANNEL_7) + assign_sound(SFX_01C0, CHANNEL_6) + play_sound_from_object(CHANNEL_6, OBJ_PC, 1, 300, 400) + restart_timer + + beginloop(0x13) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x13) + + label(0x06) + mute_channel(CHANNEL_6) + endloop(0x04) + + endlist +}; + +u8 func1008_doorswitch[] = { + if_difficulty_gt(DIFF_SA, /*goto*/ 0x04) + + // A and SA + unlock_door(OBJ_OFFICEDOOR1, 0x01) + unlock_door(OBJ_OFFICEDOOR2, 0x01) + unset_object_flag2(OBJ_OFFICEDOOR1, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(OBJ_OFFICEDOOR2, OBJFLAG2_AICANNOTUSE) + set_stage_flag(STAGEFLAG_OFFICE_DOOR_UNLOCKED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // PA + beginloop(0x04) +#if VERSION >= VERSION_NTSC_1_0 + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_DOORSWITCH, /*goto*/ 0x2c) +#else + if_chr_activated_object(CHR_ANY, OBJ_DOORSWITCH, /*goto*/ 0x2c) +#endif + label(0x06) + endloop(0x04) + + label(0x2c) + play_sound(SFX_PRESS_SWITCH, -1) +#if VERSION >= VERSION_NTSC_1_0 + show_hudmsg(CHR_P1P2, L_AME_047) // "Door unlocked." +#else + show_hudmsg(CHR_BOND, L_AME_047) // "Door unlocked." +#endif + set_stage_flag(STAGEFLAG_OFFICE_DOOR_UNLOCKED) + unlock_door(OBJ_OFFICEDOOR1, 0x01) + unlock_door(OBJ_OFFICEDOOR2, 0x01) + unset_object_flag2(OBJ_OFFICEDOOR1, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(OBJ_OFFICEDOOR2, OBJFLAG2_AICANNOTUSE) + yield + restart_timer + + beginloop(0x08) + if_timer_gt(45, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + assign_sound(SFX_043B, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_OFFICEDOOR1, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_check_civilians_killed[] = { + beginloop(0x04) + if_chr_dead(CHR_SECRETARY, /*goto*/ 0x2c) + if_chr_dead(CHR_CASS, /*goto*/ 0x09) + label(0x06) + endloop(0x04) + + label(0x2c) + show_hudmsg(CHR_BOND, L_AME_055) // "Unacceptable civilian casualties." + set_stage_flag(STAGEFLAG_CIVILIANS_KILLED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x09) + show_hudmsg(CHR_BOND, L_AME_057) // "Critical mission personnel killed." + set_stage_flag(STAGEFLAG_CIVILIANS_KILLED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Wait for alarm while security is disabled, then set a flag on a CMP guard. + */ +u8 func100a_alarm_guard[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_SECURITY_DISABLED, FALSE, /*goto*/ 0x06) + if_alarm_active(/*goto*/ 0x2c) + label(0x06) + reloop(0x04) + + label(0x2c) + set_chr_flag_bankx(0x09, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + goto_next(0xb3) + + // Unreachable + label(0xac) + deactivate_alarm + reloop(0x04) + + label(0xb3) + label(0xb2) + endloop(0x04) + + endlist +}; + +u8 func100b_lightswitch[] = { + beginloop(0x04) + if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + play_sound(SFX_PRESS_SWITCH, -1) + if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x06) + + // Turning lights off + set_stage_flag(STAGEFLAG_LIGHTS_OFF) + set_lights_state(0x0044, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + reloop(0x04) + + // Turning lights on + label(0x06) + unset_stage_flag(STAGEFLAG_LIGHTS_OFF) + set_lights_state(0x0044, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + endloop(0x04) + + endlist +}; + +u8 func100c_noop2[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_PERSONALITY_DELETED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100d_check_objects_destroyed[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + // SA and PA + beginloop(0x04) + // Check security hub + if_stage_flag_eq(STAGEFLAG_SECURITYHUB_DESTROYED, TRUE, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_SECURITYHUB, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_SECURITYHUB_DESTROYED) + mute_channel(CHANNEL_0) + show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." + + // PA only - check door switch + label(0x2c) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_OFFICE_DOOR_UNLOCKED, TRUE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_DOORSWITCH_DESTROYED, TRUE, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_DOORSWITCH, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_DOORSWITCH_DESTROYED) + show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." + + // PA only - check PC + label(0x2c) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) + if_objective_complete(2, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ 0x2c) + if_objective_failed(2, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_PC, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_PC_DESTROYED) + show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." + + // Check comms hub + label(0x2c) + if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_DESTROYED, TRUE, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_EXTCOMMSHUB, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_EXTCOMMSHUB_DESTROYED) + mute_channel(CHANNEL_1) + show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." + label(0x2c) + endloop(0x04) + + // Agent + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_CASS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_SECRETARY, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PROGRAMMER, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +#define wait_for_camera_finished \ + beginloop(0x08) \ + if_camera_animating(/*goto*/ 0x2c) \ + goto_next(0x06) \ + label(0x2c) \ + if_controller_button_pressed(/*goto*/ 0x06) \ + endloop(0x08) + +u8 func041b_intro_041b[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_01) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP2) + set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_01, OBJ_JUMPSHIP2, 0x04, 0xffff) + enable_object(OBJ_POLICECAR) + set_object_flag3(OBJ_POLICECAR, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_01, OBJ_POLICECAR, 0x04, 0xffff) + enable_object(OBJ_HOVERCOP3) + set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_02, OBJ_HOVERCOP3, 0x04, 0xffff) + enable_object(OBJ_HOVERCAR3) + set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_03, OBJ_HOVERCAR3, 0x04, 0xffff) + enable_object(OBJ_HOVERMOTO3) + set_object_flag3(OBJ_HOVERMOTO3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_04, OBJ_HOVERMOTO3, 0x04, 0xffff) + enable_object(OBJ_HOVERCAB3) + set_object_flag3(OBJ_HOVERCAB3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_05, OBJ_HOVERCAB3, 0x04, 0xffff) + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP2) + disable_object(OBJ_POLICECAR) + disable_object(OBJ_HOVERCOP3) + disable_object(OBJ_HOVERCAR3) + disable_object(OBJ_HOVERMOTO3) + disable_object(OBJ_HOVERCAB3) + label(0x36) + return + endlist +}; + +u8 func041a_intro_041a[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_02) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP2) + set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_02, OBJ_JUMPSHIP2, 0x04, 0xffff) + enable_object(OBJ_HOVERTAXI2) + set_object_flag3(OBJ_HOVERTAXI2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_06, OBJ_HOVERTAXI2, 0x04, 0xffff) + enable_object(OBJ_HOVERCOP3) + set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_07, OBJ_HOVERCOP3, 0x04, 0xffff) + enable_object(OBJ_HOVERCAR3) + set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_08, OBJ_HOVERCAR3, 0x04, 0xffff) + enable_object(OBJ_HOVERMOTO3) + set_object_flag3(OBJ_HOVERMOTO3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_09, OBJ_HOVERMOTO3, 0x04, 0xffff) + enable_object(OBJ_HOVERCAB3) + set_object_flag3(OBJ_HOVERCAB3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_10, OBJ_HOVERCAB3, 0x04, 0xffff) + enable_object(OBJ_HOVERTRUCK3) + set_object_flag3(OBJ_HOVERTRUCK3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_11, OBJ_HOVERTRUCK3, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP2) + disable_object(OBJ_HOVERTAXI2) + disable_object(OBJ_HOVERCOP3) + disable_object(OBJ_HOVERCAR3) + disable_object(OBJ_HOVERMOTO3) + disable_object(OBJ_HOVERCAB3) + disable_object(OBJ_HOVERTRUCK3) + label(0x36) + return + endlist +}; + +u8 func0419_intro_0419[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_03) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP2) + set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_03, OBJ_JUMPSHIP2, 0x04, 0xffff) + enable_object(OBJ_HOVERTAXI1) + set_object_flag3(OBJ_HOVERTAXI1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_12, OBJ_HOVERTAXI1, 0x04, 0xffff) + enable_object(OBJ_HOVERCOP3) + set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_13, OBJ_HOVERCOP3, 0x04, 0xffff) + enable_object(OBJ_HOVERCAR3) + set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_14, OBJ_HOVERCAR3, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP2) + disable_object(OBJ_HOVERTAXI1) + disable_object(OBJ_HOVERCOP3) + disable_object(OBJ_HOVERCAR3) + label(0x36) + return + endlist +}; + +u8 func041c_intro_041c[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_04) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP2) + set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_04, OBJ_JUMPSHIP2, 0x04, 0xffff) + enable_object(OBJ_HOVERTAXI1) + set_object_flag3(OBJ_HOVERTAXI1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_15, OBJ_HOVERTAXI1, 0x04, 0xffff) + + // Invalid object + enable_object(0x1d) + set_object_flag3(0x1d, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_16, 0x1d, 0x04, 0xffff) + + enable_object(OBJ_HOVERCOP3) + set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_17, OBJ_HOVERCOP3, 0x04, 0xffff) + enable_object(OBJ_HOVERCAR3) + set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_18, OBJ_HOVERCAR3, 0x04, 0xffff) + enable_object(OBJ_HOVERMOTO3) + set_object_flag3(OBJ_HOVERMOTO3, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_19, OBJ_HOVERMOTO3, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP2) + disable_object(OBJ_HOVERTAXI1) + disable_object(0x1d) + disable_object(OBJ_HOVERCOP3) + disable_object(OBJ_HOVERCAR3) + disable_object(OBJ_HOVERMOTO3) + label(0x36) + return + endlist +}; + +/** + * Part of the intro cutscene. + */ +u8 func041d_intro_041d[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_05) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP2) + set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_05, OBJ_JUMPSHIP2, 0x01, 0xffff) + enable_object(OBJ_HOVERTAXI1) + set_object_flag3(OBJ_HOVERTAXI1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_20, OBJ_HOVERTAXI1, 0x04, 0xffff) + enable_object(0x1d) + set_object_flag3(0x1d, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_21, 0x1d, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP2) + disable_object(OBJ_HOVERTAXI1) + disable_object(0x1d) + label(0x36) + return + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function2[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO_041B) + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function3[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO_041A) + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function4[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO_0419) + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function5[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO_041C) + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function6[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO_041D) + endlist +}; + +/** + * This is the most ridiculous way of doing an intro cutscene. This is how all + * the ailists call each other: + * + * func0422_intro calls 041b with return to 041e + * 041e calls 041a with return to 041f + * 041f calls 0419 with return to 0420 + * 0420 calls 041c with return to 0421 + * 0421 calls 041d with return to 0428 + * 0428 does stuff then sets 0424 + * 0424 does stuff then sets 0425 + * 0425 does stuff then sets 0423 + * 0423 does stuff then sets 0426 + * 0426 does stuff then sets 0429 + * 0429 does stuff then sets 0427 + * 0427 does stuff then sets 042a + * 042a does stuff then sets 042b + * 042b does stuff then sets 042c + * 042c just sets 042d + * 042d finishes intro + */ +u8 func0422_intro[] = { +#if VERSION == VERSION_PAL_FINAL + yield + set_stage_flag(STAGEFLAG_TRIGGER_INTRO) + yield +#else + play_temporary_track(MUSIC_DEFECTION_INTRO_SFX) + + // No yield in this loop! + label(0x07) + if_music_event_queue_empty(16, /*goto*/ 0x2c) + configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) + goto_first(0x07) + + label(0x2c) +#if VERSION >= VERSION_NTSC_1_0 + yield +#endif + set_stage_flag(STAGEFLAG_TRIGGER_INTRO) + yield + play_cutscene_track(MUSIC_DEFECTION_INTRO) + + label(0x08) + if_music_event_queue_empty(1, /*goto*/ 0x2c) + configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) + goto_first(0x08) + + label(0x2c) +#endif + + set_returnlist(CHR_SELF, AILIST_INTRO_041E) + set_ailist(CHR_SELF, AILIST_INTRO_041B) + endlist +}; + +u8 func041e_intro_041e[] = { + set_returnlist(CHR_SELF, AILIST_INTRO_041F) + set_ailist(CHR_SELF, AILIST_INTRO_041A) + endlist +}; + +u8 func041f_intro_041f[] = { + set_returnlist(CHR_SELF, AILIST_INTRO_0420) + set_ailist(CHR_SELF, AILIST_INTRO_0419) + endlist +}; + +u8 func0420_intro_0420[] = { + set_returnlist(CHR_SELF, AILIST_INTRO_0421) + set_ailist(CHR_SELF, AILIST_INTRO_041C) + endlist +}; + +u8 func0421_intro_0421[] = { + set_returnlist(CHR_SELF, 0x0428) + set_ailist(CHR_SELF, AILIST_INTRO_041D) + endlist +}; + +u8 func0422_intro_0423[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_09) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_06, OBJ_JUMPSHIP1, 0x04, 0xffff) + set_tinted_glass_enabled(TRUE) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + set_tinted_glass_enabled(FALSE) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_0426) + endlist +}; + +u8 func0422_intro_0424[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_07) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_07, OBJ_JUMPSHIP1, 0x04, 0xffff) + set_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SECRETARY, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_SECRETARY, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_SECRETARY, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AME_INTRO_SEC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SECRETARY, 4) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_SECRETARY, CHRCFLAG_UNPLAYABLE) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_0425) + endlist +}; + +u8 func0422_intro_0425[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_08) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_08, OBJ_JUMPSHIP1, 0x04, 0xffff) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_01, OBJ_BANNER1, 0x04, 0xffff) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_01, OBJ_BANNER2, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + disable_object(OBJ_BANNER1) + disable_object(OBJ_BANNER2) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_0423) + endlist +}; + +u8 func0422_intro_0426[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_10) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_09, OBJ_JUMPSHIP1, 0x04, 0xffff) + enable_object(OBJ_BANNER1) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_02, OBJ_BANNER1, 0x04, 0xffff) + enable_object(OBJ_BANNER2) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_02, OBJ_BANNER2, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + disable_object(OBJ_BANNER1) + disable_object(OBJ_BANNER2) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_0429) + endlist +}; + +u8 func0422_intro_0427[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_12) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_10, OBJ_JUMPSHIP1, 0x04, 0xffff) + enable_object(OBJ_ROPE) + set_object_flag3(OBJ_ROPE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_ROPE_01, OBJ_ROPE, 0x04, 0xffff) + enable_object(OBJ_BANNER1) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_03, OBJ_BANNER1, 0x04, 0xffff) + enable_object(OBJ_BANNER2) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_03, OBJ_BANNER2, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + disable_object(OBJ_ROPE) + disable_object(OBJ_BANNER1) + disable_object(OBJ_BANNER2) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_042A) + endlist +}; + +u8 func0422_intro_0428[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_06) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_11, OBJ_JUMPSHIP1, 0x04, 0xffff) + set_object_flag2(OBJ_HOVERCOP1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERCOP2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERCAR1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERCAR2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERMOTO1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERMOTO2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERTRUCK1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERTRUCK2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERCAB1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_HOVERCAB2, OBJFLAG2_INVISIBLE) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + unset_object_flag2(OBJ_HOVERCOP1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERCOP2, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERCAR1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERCAR2, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERMOTO1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERMOTO2, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERTRUCK1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERTRUCK2, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERCAB1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_HOVERCAB2, OBJFLAG2_INVISIBLE) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_0424) + endlist +}; + +u8 func0422_intro_0429[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_11) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_12, OBJ_JUMPSHIP1, 0x04, 0xffff) + set_tinted_glass_enabled(TRUE) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + set_tinted_glass_enabled(FALSE) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_0427) + endlist +}; + +u8 func0422_intro_042a[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_13) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_13, OBJ_JUMPSHIP1, 0x04, 0xffff) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AME_INTRO_JO_09, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_hudpiece_visible(CHR_BOND, TRUE) + enable_object(OBJ_ROPE) + set_object_flag3(OBJ_ROPE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_ROPE_02, OBJ_ROPE, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + disable_object(OBJ_ROPE) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_042B) + endlist +}; + +u8 func0422_intro_042b[] = { + if_controller_button_pressed(/*goto*/ 0x36) + camera_movement(ANIM_CUT_AME_INTRO_CAM_14) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enable_object(OBJ_JUMPSHIP1) + set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_14, OBJ_JUMPSHIP1, 0x04, 0xffff) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AME_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_hudpiece_visible(CHR_BOND, TRUE) + enable_object(OBJ_ROPE) + set_object_flag3(OBJ_ROPE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_ROPE_03, OBJ_ROPE, 0x04, 0xffff) + enable_object(OBJ_BANNER1) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_04, OBJ_BANNER1, 0x04, 0xffff) + enable_object(OBJ_BANNER2) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_04, OBJ_BANNER2, 0x04, 0xffff) + + wait_for_camera_finished + + label(0x06) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + disable_object(OBJ_JUMPSHIP1) + disable_object(OBJ_ROPE) + disable_object(OBJ_BANNER1) + disable_object(OBJ_BANNER2) + label(0x36) + set_ailist(CHR_SELF, AILIST_INTRO_042C) + endlist +}; + +u8 func0422_intro_042c[] = { + set_ailist(CHR_SELF, AILIST_INTRO_042D) + endlist +}; + +u8 func0422_intro_042d[] = { + camera_movement(ANIM_CUT_AME_INTRO_CAM_15) + cmd0175(60) + if_controller_button_pressed(/*goto*/ 0x36) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AME_INTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_hudpiece_visible(CHR_BOND, FALSE) + + wait_for_camera_finished + + label(0x06) + label(0x36) + enable_object(OBJ_BANNER1) + enable_object(OBJ_BANNER2) + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_05, OBJ_BANNER1, 0x08, 0xffff) + + // @bug: Copy/paste error - should be banner 2 + set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_05, OBJ_BANNER2, 0x08, 0xffff) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AME_INTRO_JO_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + set_chr_hudpiece_visible(CHR_BOND, FALSE) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + set_ailist(CHR_SECRETARY, AILIST_INIT_SECRETARY) + enter_firstperson + set_stage_flag(STAGEFLAG_STOP_INTRO) + restart_timer + + beginloop(0x09) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + stop_cutscene_track + stop_ambient_track + set_savefile_flag(GAMEFILEFLAG_CI_TOUR_DONE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0416_outro_from_menu[] = { + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func0416_outro[] = { + camera_movement(ANIM_CUT_AME_OUTRO_CAM) + play_cutscene_track(MUSIC_DEFECTION_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AME_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + restart_timer + unset_stage_flag(STAGEFLAG_LAB_ELEVATOR_CLOSED) + set_door_open(OBJ_LABLIFTDOOR1) + set_door_open(OBJ_LABLIFTDOOR2) + restart_timer + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_FALCON2_SILENCER, WEAPON_NONE) + show_nonessential_chrs(FALSE) + + beginloop(0xb6) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(40, /*goto*/ 0x06) + endloop(0xb6) + + label(0x06) + play_sound(SFX_0165, CHANNEL_10) + + beginloop(0xb7) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(110, /*goto*/ 0x06) + endloop(0xb7) + + label(0x06) + play_sound(SFX_0167, CHANNEL_10) + + beginloop(0xb8) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(123, /*goto*/ 0x06) + endloop(0xb8) + + label(0x06) + play_sound(SFX_01DC, CHANNEL_10) + + beginloop(0xb9) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(215, /*goto*/ 0x06) + endloop(0xb9) + + label(0x06) + play_sound(SFX_01D8, CHANNEL_10) + + beginloop(0xba) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(245, /*goto*/ 0x06) + endloop(0xba) + + label(0x06) + play_sound(SFX_01DA, CHANNEL_10) + + beginloop(0xbb) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(250, /*goto*/ 0x06) + endloop(0xbb) + + label(0x06) + play_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_10) + + beginloop(0xbc) + if_controller_button_pressed(/*goto*/ 0xbd) + if_timer_gt(285, /*goto*/ 0x06) + endloop(0xbc) + + label(0x06) + play_sound(SFX_01DB, CHANNEL_10) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0xbd) + + label(0x2c) + if_controller_button_pressed(/*goto*/ 0xbd) + if_stage_flag_eq(STAGEFLAG_LAB_ELEVATOR_CLOSED, TRUE, /*goto*/ 0x2c) + if_timer_lt(336, /*goto*/ 0x2c) + close_door(OBJ_LABLIFTDOOR1) + close_door(OBJ_LABLIFTDOOR2) + set_stage_flag(STAGEFLAG_LAB_ELEVATOR_CLOSED) + label(0x2c) + endloop(0x08) + + label(0xbd) + mute_channel(CHANNEL_10) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1000_rebuild_groups[] = { + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1401_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func100f_check_necklace_collected[] = { + beginloop(0x04) + if_chr_has_object(CHR_BOND, OBJ_NECKLACE, /*goto*/ 0x2c) + if_chr_has_object(CHR_COOP, OBJ_NECKLACE, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_start_intro[] = { + set_ailist(CHR_SELF, AILIST_INTRO) + endlist +}; + +u8 func1010_start_hub_humms[] = { + yield +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_0, OBJ_SECURITYHUB, SFX_8111, 0x0f, 0x02) + yield + play_sound_from_object2(CHANNEL_1, OBJ_EXTCOMMSHUB, SFX_8111, 0x0f, 0x02) +#else + play_sound_from_object2(CHANNEL_0, OBJ_SECURITYHUB, SFX_8111, 0x0f, 0x00) + yield + play_sound_from_object2(CHANNEL_1, OBJ_SECURITYHUB, SFX_0004, 0x0f, 0x00) +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_check_hubs_activated[] = { + beginloop(0x04) + if_chr_activated_object(CHR_ANY, OBJ_SECURITYHUB, /*goto*/ 0x08) + if_chr_activated_object(CHR_ANY, OBJ_EXTCOMMSHUB, /*goto*/ 0x0a) + reloop(0x04) + + label(0x08) + show_hudmsg(CHR_BOND, L_AME_080) // "ECM Mine needed to disable security hub." + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x0a) + show_hudmsg(CHR_BOND, L_AME_081) // "ECM Mine needed to disable comms hub." + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1012_trigger_x_music[] = { + // Wait until arriving at bottom floor + beginloop(0x04) + if_camera_animating(/*goto*/ 0x2c) + if_chr_y(CHR_BOND, -8000, OPERATOR_LESS_THAN, /*goto*/ 0x06) + if_chr_y(CHR_COOP, -8000, OPERATOR_LESS_THAN, /*goto*/ 0x06) + label(0x2c) + endloop(0x04) + + // This stage flag check seems a bit weird, but it makes sense if Rare were + // testing the outro in isolation of the rest of the stage. They obviously + // didn't want the X music playing during the outro while testing. Note that + // the flag is only set during the outro cutscene, not during gameplay. + label(0x06) + if_stage_flag_eq(STAGEFLAG_LAB_ELEVATOR_CLOSED, TRUE, /*goto*/ 0x2c) + play_x_track(XREASON_DEFAULT, 10, 60) + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_guard(accuracy, health) \ + set_chr_dodge_rating(2, 20) \ + set_unarmeddodgerating(0) \ + set_accuracy(accuracy) \ + set_reaction_speed(0) \ + set_chr_maxdamage(CHR_SELF, health) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) + +u8 func0417_init_dd_guard[] = { + init_guard(0, 40) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0418_init_shock_guard[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x2c) + + // Agent + init_guard(10, 40) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + // SA and PA + label(0x2c) + init_guard(20, 40) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0430_init_falcon_guard[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x2c) + + // Agent + init_guard(20, 40) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + // SA and PA + label(0x2c) + init_guard(30, 60) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1013_msg_commshubnearby[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + beginloop(0x04) + if_chr_y(CHR_BOND, -770, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0039, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + speak(CHR_BOND, L_AME_093, SFX_8170, CHANNEL_6, COLOR_09_BLUE) // "We're getting a positive reading - the internal co..." + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_msg_officefloor[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x0054, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0064, /*goto*/ 0x0d) + endloop(0x04) + + label(0x2c) + speak(CHR_BOND, L_AME_094, SFX_8171, CHANNEL_6, COLOR_09_BLUE) // "You're on the same floor as Cassandra's office." + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_msg_securityroom[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x0025, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + speak(CHR_BOND, L_AME_095, MP3_03A2, CHANNEL_6, COLOR_09_BLUE) // "The other hub has got to be in the Security Room." + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_msg_basementelevator[] = { + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x002c, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + speak(CHR_BOND, L_AME_096, SFX_8172, CHANNEL_6, COLOR_09_BLUE) // "The basement elevator must be around there somewhe..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_unlock_basement_door[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Agent only - unlock basement door (SA and PA requires necklace) + label(0x2c) + unlock_door(OBJ_SECRETDOOR, 0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Rare used stage flags to trigger the intro cutscene to restart. + */ +u8 func0422_intro_speaking[] = { + label(0xbe) + if_stage_flag_eq(STAGEFLAG_TRIGGER_INTRO, TRUE, /*goto*/ 0xbf) + yield + goto_first(0xbe) + + label(0xbf) + unset_stage_flag(STAGEFLAG_TRIGGER_INTRO) + restart_timer + +#if VERSION == VERSION_PAL_FINAL + beginloop(0xb7) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2c) + endloop(0xb7) + + label(0x2c) + play_temporary_track(MUSIC_DEFECTION_INTRO_SFX) + + // No yield in this loop! + label(0xb8) + if_music_event_queue_empty(16, /*goto*/ 0x2c) + configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) + goto_first(0xb8) + + label(0x2c) + play_cutscene_track(MUSIC_DEFECTION_INTRO) + + label(0xb9) + if_music_event_queue_empty(1, /*goto*/ 0x2c) + configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) + goto_first(0xb9) + + label(0x2c) +#endif + + beginloop(0xb6) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_timer_gt(700, /*goto*/ 0x2c) + endloop(0xb6) + + label(0x2c) + speak(CHR_BOND, L_AME_100, MP3_03E4, CHANNEL_6, COLOR_09_BLUE) // "Why the big hurry?" + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + speak(CHR_BOND, L_AME_101, MP3_03E5, CHANNEL_6, COLOR_06_WHITE) // "If Dr. Caroll is not extracted tonight, dataDyne w..." + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x09) + + label(0x2c) + speak(CHR_BOND, L_AME_102, MP3_03E6, CHANNEL_6, COLOR_09_BLUE) // "Are they all expendable?" + + beginloop(0x0a) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x0a) + + label(0x2c) + speak(CHR_BOND, L_AME_103, MP3_03E7, CHANNEL_6, COLOR_06_WHITE) // "Don't joke! You have to be careful, Joanna. Code k..." + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x0b) + + label(0x2c) + speak(CHR_BOND, L_AME_104, MP3_03E8, CHANNEL_6, COLOR_09_BLUE) // "What's the target location?" + + beginloop(0x0c) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x0c) + + label(0x2c) + speak(CHR_BOND, L_AME_105, MP3_03E9, CHANNEL_6, COLOR_06_WHITE) // "Work your way down the building to the ground leve..." + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x0d) + + label(0x2c) + speak(CHR_BOND, L_AME_106, MP3_03EA, CHANNEL_6, COLOR_09_BLUE) // "How will I recognize him?" + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x0e) + + label(0x2c) + speak(CHR_BOND, L_AME_107, MP3_03EB, CHANNEL_6, COLOR_06_WHITE) // "We don't have an image record, and we can't find a..." + + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x0f) + + label(0x2c) + label(0x06) + mute_channel(CHANNEL_6) + goto_first(0xbe) + + endlist +}; + +/** + * Hide guards, then unhide then once you pass below -2000. This is likely the + * first staircase between the light switch room and Cass's office floor. + */ +u8 func1019_toggle_guards[] = { + label(0x2c) + disable_chr(0x01) + disable_chr(0x02) + disable_chr(0x0e) + disable_chr(0x12) + disable_chr(0x0f) + disable_chr(0x10) + disable_chr(0x11) + disable_chr(0x13) + disable_chr(0x03) + disable_chr(0x04) + disable_chr(0x14) + disable_chr(0x15) + disable_chr(0x16) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -2000, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + enable_chr(0x01) + yield + enable_chr(0x02) + yield + enable_chr(0x0e) + yield + enable_chr(0x12) + yield + enable_chr(0x0f) + yield + enable_chr(0x10) + yield + enable_chr(0x11) + yield + enable_chr(0x13) + yield + enable_chr(0x03) + yield + enable_chr(0x04) + yield + enable_chr(0x14) + yield + enable_chr(0x15) + yield + enable_chr(0x16) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_noop[] = { + yield + yield + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func141c_start_lifts[] = { + activate_lift(2, OBJ_LIFT1) + activate_lift(1, OBJ_LIFT2) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_disable_cameras[] = { + // Check security hub objective + beginloop(0xc4) + if_objective_complete(0, /*goto*/ 0x2c) + endloop(0xc4) + + label(0x2c) + set_object_flag(OBJ_CAMERA1, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CAMERA2, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CAMERA3, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CAMERA4, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CAMERA5, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CAMERA6, OBJFLAG_DEACTIVATED) + set_stage_flag(STAGEFLAG_SECURITY_DISABLED) + restart_timer + + // @bug: If you disable the security (bottom floor), then activate the alarm + // before the 2 minute timer expires (eg. by getting Cass to activate it), + // then the first camera is never reactivated. The if_alarm_active check + // should go to 0x2c instead. + beginloop(0x08) + if_alarm_active(/*goto*/ 0x06) + if_timer_gt(7200, /*goto*/ 0x2c) + endloop(0x08) + + // 2 minutes elapsed + label(0x2c) + if_object_in_good_condition(OBJ_CAMERA1, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + unset_object_flag(OBJ_CAMERA1, OBJFLAG_DEACTIVATED) + + label(0x06) + if_object_in_good_condition(OBJ_CAMERA2, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + unset_object_flag(OBJ_CAMERA2, OBJFLAG_DEACTIVATED) + + label(0x06) + if_object_in_good_condition(OBJ_CAMERA3, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + unset_object_flag(OBJ_CAMERA3, OBJFLAG_DEACTIVATED) + + label(0x06) + if_object_in_good_condition(OBJ_CAMERA4, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + unset_object_flag(OBJ_CAMERA4, OBJFLAG_DEACTIVATED) + + label(0x06) + if_object_in_good_condition(OBJ_CAMERA5, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + unset_object_flag(OBJ_CAMERA5, OBJFLAG_DEACTIVATED) + + label(0x06) + if_object_in_good_condition(OBJ_CAMERA6, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + unset_object_flag(OBJ_CAMERA6, OBJFLAG_DEACTIVATED) + + label(0x06) + show_hudmsg(CHR_BOND, L_AME_097) // "Security system is now back online." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unregistered + */ +u8 unregistered_function7[] = { + show_hudmsg(CHR_BOND, L_AME_099) // "2023 AD, 2214 Hours Lucerne Tower - dataDyne HQ" + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_lift_door_sounds[] = { + beginloop(0xc4) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR1, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR2, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR3, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR4, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR1, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR2, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR3, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR4, /*goto*/ 0x2c) + reloop(0xc4) + + label(0x2c) + play_sound(SFX_DOOR_81B0, -1) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + endloop(0xc4) + + endlist +}; + +/** + * @unused + */ +u8 func042e_init_surrendering_guard[] = { + label(0xc4) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_SURRENDERING_GUARD) + endlist +}; + +/** + * @unused + */ +u8 func042f_surrendering_guard[] = { + // Wait for player detection + beginloop(0xc4) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x2c) + if_enemy_distance_lt_and_los(500, /*goto*/ 0x2c) + if_near_miss(/*goto*/ 0x2c) + if_saw_injury(0x00, /*goto*/ 0x2c) + endloop(0xc4) + + // Be surprised + label(0x2c) + say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) + + // Wait 1 second + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x54) + goto_next(0x55) + + label(0x54) + try_run_to_chr(CHR_PRESET, /*goto*/ 0x56) + + beginloop(0x56) + if_distance_to_target_gt(300, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x28) + label(0x06) + if_chr_death_animation_finished(CHR_PRESET, /*goto*/ 0x55) + if_chr_knockedout(CHR_PRESET, /*goto*/ 0x55) + if_detected_chr(CHR_PRESET, /*goto*/ 0x57) + if_chr_stopped(/*goto*/ 0x57) + endloop(0x56) + + // Warn + label(0x57) + say_quip(CHR_BOND, QUIP_WARNFRIENDS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + increase_squadron_alertness(100) + + // No chr in same group, or follow through from above + // Wait until player in range and then surrender. + beginloop(0x55) + if_distance_to_target_gt(300, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x28) + label(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x58) + endloop(0x55) + + label(0x58) + restart_timer + retreat(GOPOSFLAG_RUN, 2) + + beginloop(0x0a) + if_distance_to_target_gt(300, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x28) + label(0x06) + if_timer_gt(600, /*goto*/ 0x2c) + endloop(0x0a) + + label(0x2c) + stop_chr + goto_first(0x55) + + // Surrender + label(0x28) + surrender + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_setup_rtracker[] = { + yield + set_object_flag3(OBJ_FALCONSIL1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_FALCONSIL2, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_LAPTOPGUN, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1420_setup_portals[] = { + yield + set_portal_flag(0x008e, PORTALFLAG_SKIP) + set_portal_flag(0x008f, PORTALFLAG_SKIP) + set_portal_flag(0x0084, PORTALFLAG_SKIP) + set_portal_flag(0x0090, PORTALFLAG_SKIP) + set_portal_flag(0x0091, PORTALFLAG_SKIP) + set_portal_flag(0x0093, PORTALFLAG_SKIP) + set_portal_flag(0x0096, PORTALFLAG_SKIP) + set_portal_flag(0x0095, PORTALFLAG_SKIP) + set_portal_flag(0x0099, PORTALFLAG_SKIP) + set_portal_flag(0x00b6, PORTALFLAG_SKIP) + set_portal_flag(0x00bf, PORTALFLAG_SKIP) + set_portal_flag(0x00be, PORTALFLAG_SKIP) + set_portal_flag(0x00c0, PORTALFLAG_SKIP) + set_portal_flag(0x00c2, PORTALFLAG_SKIP) + set_portal_flag(0x00c4, PORTALFLAG_SKIP) + set_portal_flag(0x00c8, PORTALFLAG_SKIP) + set_portal_flag(0x00c7, PORTALFLAG_SKIP) + set_portal_flag(0x00c9, PORTALFLAG_SKIP) + set_portal_flag(0x00cd, PORTALFLAG_SKIP) + set_portal_flag(0x00ce, PORTALFLAG_SKIP) + set_portal_flag(0x00d2, PORTALFLAG_SKIP) + set_portal_flag(0x00e0, PORTALFLAG_SKIP) + set_portal_flag(0x00dc, PORTALFLAG_SKIP) + set_portal_flag(0x00de, PORTALFLAG_SKIP) + set_portal_flag(0x00e3, PORTALFLAG_SKIP) + set_portal_flag(0x00e5, PORTALFLAG_SKIP) + set_portal_flag(0x00e7, PORTALFLAG_SKIP) + set_portal_flag(0x00fb, PORTALFLAG_SKIP) + set_portal_flag(0x00fa, PORTALFLAG_SKIP) + set_portal_flag(0x00fc, PORTALFLAG_SKIP) + set_portal_flag(0x00ff, PORTALFLAG_SKIP) + set_portal_flag(0x0100, PORTALFLAG_SKIP) + set_portal_flag(0x0103, PORTALFLAG_SKIP) + set_portal_flag(0x0102, PORTALFLAG_SKIP) + set_portal_flag(0x0104, PORTALFLAG_SKIP) + set_portal_flag(0x0109, PORTALFLAG_SKIP) + set_portal_flag(0x010c, PORTALFLAG_SKIP) + set_portal_flag(0x0119, PORTALFLAG_SKIP) + set_portal_flag(0x0112, PORTALFLAG_SKIP) + set_portal_flag(0x0117, PORTALFLAG_SKIP) + set_portal_flag(0x0120, PORTALFLAG_SKIP) + set_portal_flag(0x011e, PORTALFLAG_SKIP) + set_portal_flag(0x011c, PORTALFLAG_SKIP) + set_portal_flag(0x0108, PORTALFLAG_SKIP) + set_portal_flag(0x006f, PORTALFLAG_SKIP) + set_portal_flag(0x007d, PORTALFLAG_SKIP) + set_portal_flag(0x0080, PORTALFLAG_SKIP) + set_portal_flag(0x0081, PORTALFLAG_SKIP) + set_portal_flag(0x0075, PORTALFLAG_SKIP) + set_portal_flag(0x0078, PORTALFLAG_SKIP) + set_portal_flag(0x0079, PORTALFLAG_SKIP) + set_portal_flag(0x0006, PORTALFLAG_SKIP) + set_portal_flag(0x0004, PORTALFLAG_SKIP) + set_portal_flag(0x0008, PORTALFLAG_SKIP) + set_portal_flag(0x000a, PORTALFLAG_SKIP) + set_portal_flag(0x0001, PORTALFLAG_SKIP) + set_portal_flag(0x0005, PORTALFLAG_SKIP) + set_portal_flag(0x0000, PORTALFLAG_SKIP) + set_portal_flag(0x0003, PORTALFLAG_SKIP) + set_portal_flag(0x0007, PORTALFLAG_SKIP) + set_portal_flag(0x0013, PORTALFLAG_SKIP) + set_portal_flag(0x0009, PORTALFLAG_SKIP) + set_portal_flag(0x00b1, PORTALFLAG_SKIP) + set_portal_flag(0x00ef, PORTALFLAG_SKIP) + set_portal_flag(0x00ee, PORTALFLAG_SKIP) + set_portal_flag(0x0121, PORTALFLAG_SKIP) + set_portal_flag(0x00e8, PORTALFLAG_SKIP) + set_portal_flag(0x00e9, PORTALFLAG_SKIP) + set_portal_flag(0x00ea, PORTALFLAG_SKIP) + set_portal_flag(0x00ec, PORTALFLAG_SKIP) + set_portal_flag(0x00eb, PORTALFLAG_SKIP) + set_portal_flag(0x00ed, PORTALFLAG_SKIP) + set_portal_flag(0x009d, PORTALFLAG_SKIP) + set_portal_flag(0x00af, PORTALFLAG_SKIP) + set_portal_flag(0x00a1, PORTALFLAG_SKIP) + set_portal_flag(0x005a, PORTALFLAG_SKIP) + set_portal_flag(0x005c, PORTALFLAG_SKIP) + set_portal_flag(0x005d, PORTALFLAG_SKIP) + set_portal_flag(0x0060, PORTALFLAG_SKIP) + set_portal_flag(0x0034, PORTALFLAG_SKIP) + set_portal_flag(0x0030, PORTALFLAG_SKIP) + set_portal_flag(0x002e, PORTALFLAG_SKIP) + set_portal_flag(0x002b, PORTALFLAG_SKIP) + set_portal_flag(0x0028, PORTALFLAG_SKIP) + set_portal_flag(0x0025, PORTALFLAG_SKIP) + set_portal_flag(0x0036, PORTALFLAG_SKIP) + set_portal_flag(0x0038, PORTALFLAG_SKIP) + set_portal_flag(0x004f, PORTALFLAG_SKIP) + set_portal_flag(0x0051, PORTALFLAG_SKIP) + set_portal_flag(0x0052, PORTALFLAG_SKIP) + set_portal_flag(0x0057, PORTALFLAG_SKIP) + set_portal_flag(0x0058, PORTALFLAG_SKIP) + set_portal_flag(0x0031, PORTALFLAG_SKIP) + set_portal_flag(0x002f, PORTALFLAG_SKIP) + set_portal_flag(0x0023, PORTALFLAG_SKIP) + set_portal_flag(0x00a6, PORTALFLAG_SKIP) + set_portal_flag(0x00a3, PORTALFLAG_SKIP) + set_portal_flag(0x00a2, PORTALFLAG_SKIP) + set_portal_flag(0x00a4, PORTALFLAG_SKIP) + set_portal_flag(0x0087, PORTALFLAG_SKIP) + set_portal_flag(0x00b9, PORTALFLAG_SKIP) + set_portal_flag(0x00b4, PORTALFLAG_SKIP) + set_portal_flag(0x00b2, PORTALFLAG_SKIP) + set_portal_flag(0x00b3, PORTALFLAG_SKIP) + set_portal_flag(0x00bd, PORTALFLAG_SKIP) + set_portal_flag(0x00f4, PORTALFLAG_SKIP) + set_portal_flag(0x00f2, PORTALFLAG_SKIP) + set_portal_flag(0x00f0, PORTALFLAG_SKIP) + set_portal_flag(0x00f8, PORTALFLAG_SKIP) + set_portal_flag(0x00f1, PORTALFLAG_SKIP) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1421_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, TRUE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function8[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_do_some_animation, 0x0401 }, + { func0402_guard_with_chrflag, 0x0402 }, + { func0403_shielded_guard, 0x0403 }, + { func0404_init_hovercar, 0x0404 }, + { func0405_start_path26, 0x0405 }, + { func0406_start_path27, 0x0406 }, + { func0407_start_path28, 0x0407 }, + { func0408_start_path29, 0x0408 }, + { func0409_start_path30, 0x0409 }, + { func040a_start_path31, 0x040a }, + { func040b_start_path32, 0x040b }, + { func040c_start_path33, 0x040c }, + { func040d_start_path34, 0x040d }, + { func040e_start_path35, 0x040e }, + { func040f_cass, 0x040f }, + { func0410_init_cass, 0x0410 }, + { func0411_secretary, 0x0411 }, + { func0412_init_secretary, 0x0412 }, + { func0413_c318, 0x0413 }, + { func0414_programmer, 0x0414 }, + { func0415_set_idle, 0x0415 }, + { func0419_intro_0419, 0x0419 }, + { func041a_intro_041a, 0x041a }, + { func041b_intro_041b, 0x041b }, + { func041c_intro_041c, 0x041c }, + { func041d_intro_041d, 0x041d }, + { func041e_intro_041e, 0x041e }, + { func041f_intro_041f, 0x041f }, + { func0420_intro_0420, 0x0420 }, + { func0421_intro_0421, 0x0421 }, + { func0422_intro, 0x0422 }, + { func0422_intro_0423, 0x0423 }, + { func0422_intro_0424, 0x0424 }, + { func0422_intro_0425, 0x0425 }, + { func0422_intro_0426, 0x0426 }, + { func0422_intro_0427, 0x0427 }, + { func0422_intro_0428, 0x0428 }, + { func0422_intro_0429, 0x0429 }, + { func0422_intro_042a, 0x042a }, + { func0422_intro_042b, 0x042b }, + { func0422_intro_042c, 0x042c }, + { func0422_intro_042d, 0x042d }, + { func042e_init_surrendering_guard, 0x042e }, + { func042f_surrendering_guard, 0x042f }, + { func0430_init_falcon_guard, 0x0430 }, + { func0416_outro, 0x0416 }, + { func0417_init_dd_guard, 0x0417 }, + { func0418_init_shock_guard, 0x0418 }, + { func1000_rebuild_groups, 0x1000 }, + { func1401_setup_counterop, 0x1401 }, + { func1002_objectives_failed_msg, 0x1002 }, + { func1003_start_intro, 0x1003 }, + { func1004_check_lab_lift_located, 0x1004 }, + { func1005_give_control, 0x1005 }, + { func1006_check_programmer_dead, 0x1006 }, + { func1007_uplinking, 0x1007 }, + { func1008_doorswitch, 0x1008 }, + { func1009_check_civilians_killed, 0x1009 }, + { func100a_alarm_guard, 0x100a }, + { func100b_lightswitch, 0x100b }, + { func100c_noop2, 0x100c }, + { func100d_check_objects_destroyed, 0x100d }, + { func100e_check_ecm_mines, 0x100e }, + { func100f_check_necklace_collected, 0x100f }, + { func1010_start_hub_humms, 0x1010 }, + { func1011_check_hubs_activated, 0x1011 }, + { func1012_trigger_x_music, 0x1012 }, + { func1013_msg_commshubnearby, 0x1013 }, + { func1014_msg_officefloor, 0x1014 }, + { func1015_msg_securityroom, 0x1015 }, + { func1016_msg_basementelevator, 0x1016 }, + { func1017_unlock_basement_door, 0x1017 }, + { func0422_intro_speaking, 0x1418 }, + { func1019_toggle_guards, 0x1019 }, + { func101a_noop, 0x101a }, + { func141c_start_lifts, 0x141c }, + { func101d_disable_cameras, 0x101d }, + { func101e_lift_door_sounds, 0x101e }, + { func101f_setup_rtracker, 0x101f }, + { func1420_setup_portals, 0x1420 }, + { func1421_setup_environment, 0x1421 }, + { func0422_intro, 0x0c00 }, + { func0416_outro_from_menu, 0x0c01 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, PATHFLAG_FLYING }, + { path02, 2, PATHFLAG_FLYING }, + { path03, 3, PATHFLAG_FLYING }, + { path04, 4, PATHFLAG_FLYING }, + { path05, 5, PATHFLAG_FLYING }, + { path06, 6, PATHFLAG_FLYING }, + { path07, 7, PATHFLAG_FLYING }, + { path08, 8, PATHFLAG_FLYING }, + { path09, 9, PATHFLAG_FLYING }, + { path10, 10, PATHFLAG_FLYING }, + { path11, 11, PATHFLAG_FLYING }, + { path12, 12, PATHFLAG_FLYING }, + { path13, 13, PATHFLAG_FLYING }, + { path14, 14, PATHFLAG_FLYING }, + { path15, 15, PATHFLAG_FLYING }, + { path16, 16, PATHFLAG_FLYING }, + { path17, 17, PATHFLAG_FLYING }, + { path18, 18, PATHFLAG_FLYING }, + { path19, 19, PATHFLAG_FLYING }, + { path20, 20, PATHFLAG_FLYING }, + { path21, 21, PATHFLAG_FLYING }, + { path22, 22, PATHFLAG_FLYING }, + { path23, 23, PATHFLAG_FLYING }, + { path24, 24, PATHFLAG_FLYING }, + { path25, 25, PATHFLAG_FLYING }, + { path26, 26, PATHFLAG_CIRCULAR }, + { path27, 27, 0 }, + { path28, 28, 0 }, + { path29, 29, 0 }, + { path30, 30, PATHFLAG_CIRCULAR }, + { path31, 31, 0 }, + { path32, 32, 0 }, + { path33, 33, 0 }, + { path34, 34, PATHFLAG_CIRCULAR }, + { path35, 35, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setuparch.c b/src/ailists/setuparch.c new file mode 100644 index 000000000..57c09f01c --- /dev/null +++ b/src/ailists/setuparch.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x18 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setuparec.c b/src/ailists/setuparec.c new file mode 100644 index 000000000..ac6775a81 --- /dev/null +++ b/src/ailists/setuparec.c @@ -0,0 +1,48 @@ +// +// Ravine (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + lift(0x0100, MODEL_RAVINELIFT, PAD_AREC_00BC, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00bc, 0x00bb, 0x00ba, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + endprops +}; + +u8 unregistered_func1[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_func2[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; diff --git a/src/ailists/setupark.c b/src/ailists/setupark.c new file mode 100644 index 000000000..9f69b2afd --- /dev/null +++ b/src/ailists/setupark.c @@ -0,0 +1,3179 @@ +// +// Extraction +// + +#include "stagesetup.h" + +// Characters +#define CHR_DRCAROLL 0x00 +#define CHR_RLSHOCK 0x0e +#define CHR_TECH1 0x0f +#define CHR_TECH2 0x10 +#define CHR_TOPGUARD1 0x11 +#define CHR_TOPGUARD2 0x12 +#define CHR_TOPGUARD3 0x13 +#define CHR_TOPGUARD4 0x14 +#define CHR_TOPGUARD5 0x15 +#define CHR_CASS 0x1c +#define CHR_MRBLONDE 0x1d +#define CHR_INTRO_GUARD 0x1e +#define CHR_OUTRO_GUARD1 0x1f +#define CHR_OUTRO_GUARD2 0x20 +#define CHR_SPECIAL_SHOCK 0x22 // guy who appears if foyer completed perfectly + +// Objects +#define OBJ_TOPROOMDOOR 0x05 +#define OBJ_LIGHTSWITCH 0x0a +#define OBJ_HOVERCOPTER 0x0b +#define OBJ_NIGHTVISION 0x0e +#define OBJ_JUMPSHIP 0x10 +#define OBJ_ROCKETAMMO1 0x14 +#define OBJ_ROCKETAMMO2 0x15 +#define OBJ_GRENADE 0x1a +#define OBJ_DRAGON 0x1b +#define OBJ_DY357 0x1c +#define OBJ_ROCKETLAUNCHER 0x1f + +// Stage flags +#define STAGEFLAG_ELEVATOR_PC_DESTROYED 0x00000001 +#define STAGEFLAG_TRIGGER_CANTLEAVEANY_MSG 0x00000002 +#define STAGEFLAG_TOP_BODYGUARDS_DEAD 0x00000004 +#define STAGEFLAG_ACCESSED_FOYER_ELEVATOR 0x00000100 +#define STAGEFLAG_ELEVATOR_UNLOCKED 0x00000200 +#define STAGEFLAG_HOVERCOPTER_DESTROYED 0x00000400 +#define STAGEFLAG_OBJECTIVE_BODYGUARDS_DEAD 0x00000800 +#define STAGEFLAG_REACHED_HELIPAD 0x00001000 +#define STAGEFLAG_FOYER_LIGHTS_RESTORED 0x00002000 +#define STAGEFLAG_DRCAROLL_DEAD 0x00004000 +#define STAGEFLAG_DRCAROLL_ATTACKED 0x00008000 +#define STAGEFLAG_DRCAROLL_DAMAGED 0x00010000 +#define STAGEFLAG_TECHS_RUNNING 0x00020000 +#define STAGEFLAG_CHOPPER_GO_TO_ROOF 0x00040000 +#define STAGEFLAG_ENTERING_TOP_ROOM 0x00080000 +#define STAGEFLAG_TOP_GUARDS_ATTACKING 0x00200000 +#define STAGEFLAG_TOP_LIGHTS_OFF 0x00400000 +#define STAGEFLAG_00800000 0x00800000 // unset in intro, not used elsewhere +#define STAGEFLAG_HOVERCOPTER_ON_ROOF 0x01000000 +#define STAGEFLAG_CASS_SHIELD_DAMAGED 0x02000000 +#define STAGEFLAG_FOYER_LIGHTS_OFF 0x04000000 +#define STAGEFLAG_SAID_SURRENDER_OR_DIE 0x10000000 +#define STAGEFLAG_SAID_GIVE_UP 0x20000000 +#define STAGEFLAG_SAID_FINAL_WARNING 0x40000000 +#define STAGEFLAG_TECHS_FINISHED 0x80000000 + +// AI Lists +#define AILIST_DRCAROLL_FOLLOWING 0x0401 +#define AILIST_INIT_DRCAROLL 0x0404 +#define AILIST_GENERAL_COMBAT 0x0406 +#define AILIST_CASS_OUTRO 0x0407 +#define AILIST_HOVERCOPTER 0x0408 +#define AILIST_INIT_TECH1 0x040b +#define AILIST_INIT_TECH2 0x040c +#define AILIST_CASS 0x040d +#define AILIST_TOP_GUARD 0x040f +#define AILIST_INIT_TOP_GUARD 0x0410 +#define AILIST_TOP_GUARD_BLINDED 0x0411 +#define AILIST_OUTRO 0x0412 +#define AILIST_DEFEND_PAD 0x0413 +#define AILIST_INIT_SHOCK 0x0414 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_ARK_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_ARK_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_ARK_002) + briefing(BRIEFINGTYPE_TEXT_A, L_ARK_003) + + beginobjective(0, L_ARK_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Access foyer elevator" + complete_flags(STAGEFLAG_ACCESSED_FOYER_ELEVATOR) + endobjective + + beginobjective(1, L_ARK_010, (DIFFBIT_PA | DIFFBIT_PD)) // "Reactivate office elevator" + complete_flags(STAGEFLAG_ELEVATOR_UNLOCKED) + fail_flags(STAGEFLAG_ELEVATOR_PC_DESTROYED) + endobjective + + beginobjective(2, L_ARK_011, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Destroy dataDyne hovercopter" + complete_flags(STAGEFLAG_HOVERCOPTER_DESTROYED) + endobjective + + beginobjective(3, L_ARK_012, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Defeat Cassandra's bodyguards" + complete_flags(STAGEFLAG_OBJECTIVE_BODYGUARDS_DEAD) + endobjective + + beginobjective(4, L_ARK_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Rendezvous at helipad" + complete_flags(STAGEFLAG_REACHED_HELIPAD) + fail_flags(STAGEFLAG_DRCAROLL_DEAD) + endobjective + + fan(0x0100, MODEL_DD_FANROOF, PAD_ARK_0087, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_ARK_0088, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_ARK_0089, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_ARK_008A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANWALL, PAD_ARK_008B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000222, 0x00000002, 0x01000000) + tag(0x0b, 1) + chopper(0x004c, MODEL_DD_HOVERCOPTER, PAD_ARK_0190, OBJFLAG_00000008 | OBJFLAG_20000000, OBJFLAG2_EXCLUDE_A | OBJFLAG2_00000100, OBJFLAG3_REACTTOSIGHT, 1000, AILIST_HOVERCOPTER) + tag(0x10, 1) + stdobject(0x0100, MODEL_DDJUMPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x0c, 2) + tag(0x0d, 2) + door(0x0100, MODEL_DOOR4A_G5, PAD_ARK_0224, OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001200) + door(0x0100, MODEL_DOOR4B_G5, PAD_ARK_0223, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_DECODOOR, PAD_ARK_021E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DECODOOR, PAD_ARK_021F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_0221, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_0222, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_SECRETDOOR, PAD_ARK_0220, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_AUTOMATIC | DOORFLAG_LONGRANGE, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SECRETDOOR, PAD_ARK_00AE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_AUTOMATIC | DOORFLAG_LONGRANGE, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0092, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0093, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0094, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0095, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0096, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0097, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0098, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_0099, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_00A4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_00A5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_009A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_009B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_009C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_009D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_009E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_009F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_00A0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_00A3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_00A1, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ARK_00A2, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_ARK_00A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_ARK_00A7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x11, 1) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_ARK_00A8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x04, 1) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_ARK_00A9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_ARK_00AD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x05, 1) + door(0x0100, MODEL_DD_WINDDOOR, PAD_ARK_00AA, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DD_WINDDOOR, PAD_ARK_00AB, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_WINDDOOR, PAD_ARK_00AC, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) +#else + door(0x0100, MODEL_DD_WINDDOOR, PAD_ARK_00AB, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_DOOR_OPENTOFRONT, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_WINDDOOR, PAD_ARK_00AC, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) +#endif + tag(0x20, 6) + tag(0x21, 6) + tag(0x22, 6) + tag(0x23, 6) + tag(0x1d, 1) + lift(0x0100, MODEL_DD_LIFTR, PAD_ARK_011D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, PAD_ARK_011D, PAD_ARK_0259, -1, -1, 0x00000001, 0x00000004, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_008C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_008D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_008E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#else + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_008D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_008E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#endif + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_021C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + lift_door(-4, -5, 0) + lift_door(-2, -6, 1) + tag(0x24, 8) + tag(0x25, 8) + tag(0x26, 8) + tag(0x27, 8) + tag(0x02, 4) + tag(0x03, 4) + tag(0x1e, 1) + lift(0x0100, MODEL_DD_LIFTR, PAD_ARK_011E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, PAD_ARK_011E, PAD_ARK_0120, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_008F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000001, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_0090, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000001, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_0091, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_021D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#else + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_0091, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ARK_021D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#endif + lift_door(-4, -5, 0) + lift_door(-4, -6, 1) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00AF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00B9, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00BA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00BC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00BD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00BE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00BF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00C0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_00C1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_023A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_023B, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_023C, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_023D, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_023E, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ARK_023F, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_010F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0110, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_024D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_024E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_024F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0250, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0251, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0252, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0253, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0254, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0255, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW_FOYER, PAD_ARK_024B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW_FOYER, PAD_ARK_024C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00DA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00DB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00DC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00DD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00DE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00DF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00E9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00EA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00EB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00EC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00ED, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00EE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00EF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00F9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00FA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00FB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00FC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00FD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00FE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00FF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0100, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0101, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0102, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0103, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0104, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0105, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0106, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0107, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_010B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_010C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_010D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_010E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_ARK_00C4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00C5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00C2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00C7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00C8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00C9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_ARK_00C6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_00CA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_ARK_0256, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_0257, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01A0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_019F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x01, 1) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_019E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01A1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_01A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_01A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_01A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_01AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_01AD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_LIGHTSWITCH2, PAD_ARK_012E, OBJFLAG_00000001, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01B1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01B2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_ARK_00CB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_01B3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_01B4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_01B5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00CC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_ARK_00CD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_ARK_0225, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_0226, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_0228, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_022A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + singlemonitor(0x0100, MODEL_PC1, PAD_ARK_022B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 3) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0232, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0233, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0234, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0235, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0236, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0237, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0238, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_0239, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_01CE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_01CF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x00e6, MODEL_BLASTSHIELD, PAD_ARK_01D0, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_ARK_01D1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_ARK_022F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_QUADPOD, PAD_ARK_01B6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + tag(0x1f, 1) + weapon(0x0100, MODEL_CHRDYROCKET, PAD_ARK_01C4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000 | OBJFLAG_WEAPON_40000000, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_ROCKETLAUNCHER) + camera2(0x0000, 0xffff9931, 0xfffea6ce, 0x00003a3e, 0x00410000, 0x00000000, PAD_ARK_001B) + tag(0x06, -1) + camera2(0x0000, 0xffffba1e, 0xfffeba56, 0xffff7356, 0x01560000, 0x00000000, PAD_ARK_001B) + tag(0x07, -1) + camera2(0x0000, 0xffff5d8a, 0xfffeba56, 0x00000924, 0x01499eb8, 0x00000000, PAD_ARK_001B) + tag(0x08, -1) + camera2(0x0000, 0xffff85c6, 0xffff3b3e, 0xffff6672, 0xfffcdbc7, 0x00000000, PAD_ARK_01CC) + tag(0x09, -1) + tag(0x0e, 1) + stdobject(0x0100, MODEL_CHRNIGHTSIGHT, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + rename_object(-1, WEAPON_NIGHTVISION, L_ARK_027, L_ARK_028, L_ARK_029, L_ARK_030, L_ARK_031) // "Obtain Night Vision." + tag(0x17, 1) + stdobject(0x0100, MODEL_CHRNIGHTSIGHT, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + rename_object(-1, WEAPON_NIGHTVISION, L_ARK_027, L_ARK_028, L_ARK_029, L_ARK_030, L_ARK_031) // "Obtain Night Vision." + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x00, PAD_ARK_0210, BODY_DRCAROLL, HEAD_RANDOM, AILIST_INIT_DRCAROLL, -1, -1, 1000, 100, 0, 0, TEAM_ALLY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x01, PAD_ARK_0215, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 7, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x02, PAD_ARK_021B, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 7, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x03, PAD_ARK_0214, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 8, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x04, PAD_ARK_0213, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 9, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x05, PAD_ARK_0216, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 8, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + weapon(0x0100, MODEL_CHRDY357, 0x0005, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_DY357MAGNUM) + tag(0x1c, -1) + chr(SPAWNFLAG_00000200, 0x06, PAD_ARK_0211, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 8, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x07, PAD_ARK_0212, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 8, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x08, PAD_ARK_0217, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 8, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x09, PAD_ARK_0218, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 9, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0a, PAD_ARK_0219, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 9, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0b, PAD_ARK_01BE, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0c, PAD_ARK_01BF, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0d, PAD_ARK_01C0, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x0e, PAD_ARK_01C1, BODY_DDSHOCK, HEAD_DDSHOCK, GAILIST_IDLE, -1, -1, 50, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x0f, PAD_ARK_01C2, BODY_OFFICEWORKER, HEAD_RANDOM, AILIST_INIT_TECH1, -1, -1, 50, 9, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x10, PAD_ARK_01C3, BODY_OFFICEWORKER, HEAD_RANDOM, AILIST_INIT_TECH2, -1, -1, 50, 9, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE, 0x11, PAD_ARK_01C5, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_FORCESUNGLASSES, 0x11, PAD_ARK_01C5, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE, 0x12, PAD_ARK_01C6, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_FORCESUNGLASSES, 0x12, PAD_ARK_01C6, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE, 0x13, PAD_ARK_01C7, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_FORCESUNGLASSES, 0x13, PAD_ARK_01C7, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE, 0x14, PAD_ARK_01C8, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_FORCESUNGLASSES, 0x14, PAD_ARK_01C8, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE, 0x15, PAD_ARK_01CC, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_FORCESUNGLASSES, 0x15, PAD_ARK_01CC, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_TOP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x1c, PAD_ARK_01C9, BODY_CASSANDRA, HEAD_CASSANDRA, AILIST_CASS, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x1d, PAD_ARK_0206, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_INVINCIBLE_AND_IDLE, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x1e, PAD_ARK_0204, BODY_DDSHOCK, HEAD_DARLING, GAILIST_INVINCIBLE_AND_IDLE, -1, -1, 1000, 100, 0, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x1f, PAD_ARK_0207, BODY_FEM_GUARD, HEAD_RANDOM, GAILIST_INVINCIBLE_AND_IDLE, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x20, PAD_ARK_0203, BODY_FEM_GUARD, HEAD_RANDOM, GAILIST_INVINCIBLE_AND_IDLE, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x16, PAD_ARK_0070, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_DEFEND_PAD, PAD_ARK_006A, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x17, PAD_ARK_0081, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_DEFEND_PAD, PAD_ARK_006A, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x18, PAD_ARK_0071, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_GENERAL_COMBAT, PAD_ARK_006A, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x19, PAD_ARK_0048, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_GENERAL_COMBAT, PAD_ARK_006A, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x1a, PAD_ARK_0047, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_DEFEND_PAD, PAD_ARK_0044, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x1b, PAD_ARK_004A, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_DEFEND_PAD, PAD_ARK_0044, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x22, PAD_ARK_007E, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK, -1, -1, 1000, 9, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + key(0x0080, MODEL_KEYCARD, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 64) + rename_object(-1, WEAPON_KEYCARD4C, L_ARK_055, L_ARK_056, L_ARK_057, L_ARK_058, L_ARK_059) // "Obtain alpha key card." + conditional_scenery(1, 0, 2) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DD_AC_UNEXP, PAD_ARK_019B, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + stdobject(0x0100, MODEL_DD_AC_EXP, PAD_ARK_019D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + door(0x0100, MODEL_DD_AC_UNEXP, PAD_ARK_019B, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + stdobject(0x0100, MODEL_DD_AC_EXP, PAD_ARK_019D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_DD_ACBOT_UNEXP, PAD_ARK_019A, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_DD_ACBOT_EXP, PAD_ARK_019C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_DD_ACBOT_EXP, PAD_ARK_019C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ARK_0130, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ARK_0131, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ARK_0132, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ARK_0133, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_STONEDESK, PAD_ARK_0124, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, 0, 1000) + multimonitor(0x0099, MODEL_COMHUB, PAD_ARK_012C, OBJFLAG_00000002, 0, 0, 1000, 3, 3, 3, 0) + tag(0x0a, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH, PAD_ARK_012D, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0111, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0112, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0113, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0114, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0119, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_011A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0117, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_0118, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00CE, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00CF, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D0, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_ARK_00D1, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tag(0x18, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_ARK_0078, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x19, 1) + tag(0x1a, 1) + weapon(0x0100, MODEL_CHRGRENADE, PAD_ARK_01D2, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_GRENADE) + tag(0x1b, 1) + weapon(0x0100, MODEL_CHRDRAGON, PAD_ARK_01D3, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_DRAGON) + tag(0x14, 1) + weapon(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_ARK_0204, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_ROCKETLAUNCHER) + tag(0x15, 1) + weapon(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_ARK_0207, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_ROCKETLAUNCHER) + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2_SCOPE, -1) + ammo(AMMOTYPE_PISTOL, 50) + ammo(AMMOTYPE_RIFLE, 160) + ammo(AMMOTYPE_MAGNUM, 2) + ammo(AMMOTYPE_ROCKET, 1) + outfit(OUTFIT_DEFAULT) + spawn(PAD_ARK_025A) + endintro +}; + +s32 path00[] = { + PAD_ARK_018F, + PAD_ARK_018E, + PAD_ARK_0191, + PAD_ARK_0190, + -1, +}; + +s32 path01[] = { + PAD_ARK_0192, + PAD_ARK_0193, + PAD_ARK_0194, + PAD_ARK_0195, + -1, +}; + +s32 path02[] = { + PAD_ARK_0196, + PAD_ARK_0197, + PAD_ARK_0198, + PAD_ARK_0199, + -1, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { NULL, 0, 0 }, +}; + +/** + * @unused + */ +u8 func0403_stop_and_idle[] = { + stop_chr + + beginloop(0x00) + endloop(0x00) + + endlist +}; + +u8 func0404_init_drcaroll[] = { + set_self_chrflag(CHRCFLAG_PUSHABLE) + set_shield(100) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_start_drcaroll[] = { + stop_chr + set_ailist(CHR_SELF, AILIST_DRCAROLL_FOLLOWING) + endlist +}; + +u8 func0401_drcaroll_following[] = { + set_shotlist(AILIST_DRCAROLL_FOLLOWING) + set_self_chrflag(CHRCFLAG_00040000) + stop_chr + set_target_chr(CHR_BOND) + try_jog_to_target(/*goto*/ 0x00) + label(0x00) + yield + set_target_chr(CHR_BOND) + if_chr_deadish(CHR_SELF, /*goto*/ 0x00) + goto_next(0x20) + + label(0x00) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x0b) + if_timer_gt(15, /*goto*/ 0x00) + endloop(0x0b) + + label(0x00) + say_quip(CHR_TARGET, 0x06, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + set_target_chr(CHR_BOND) + set_shield(100) + set_chr_maxdamage(CHR_SELF, 100) + label(0x20) + if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x00) + goto_next(0x02) + + label(0x00) + restart_timer + say_quip(CHR_TARGET, 0x04, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x0d) + if_num_times_shot_lt(1, /*goto*/ 0x00) + if_timer_lt(20, /*goto*/ 0x00) + label(0x00) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x0d) + + label(0x02) + stop_chr + restart_timer + + beginloop(0x03) + if_chr_y(CHR_TARGET, -1910, OPERATOR_LESS_THAN, /*goto*/ 0x20) + label(0x20) + if_can_see_target(/*goto*/ 0x00) + goto_next(0x04) + + label(0x00) + if_timer_gt(1250, /*goto*/ 0x20) + if_distance_to_target_gt(200, /*goto*/ 0x04) + endloop(0x03) + + label(0x20) + call_rng + if_rand_lt(64, /*goto*/ 0x20) + say_quip(CHR_TARGET, 0x02, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x02) + + label(0x20) + say_quip(CHR_TARGET, 0x03, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x02) + + label(0x00) + say_quip(CHR_TARGET, 0x07, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x02) + + label(0x04) + restart_timer + if_chr_y(CHR_DRCAROLL, -2100, OPERATOR_LESS_THAN, /*goto*/ 0x20) + try_run_to_target(/*goto*/ 0x05) + label(0x20) + if_distance_to_target_lt(200, /*goto*/ 0x20) + try_run_to_target(/*goto*/ 0x05) + label(0x20) + try_jog_to_target(/*goto*/ 0x05) + + beginloop(0x05) + if_chr_in_room(CHR_TARGET, 0x00, 0x0094, /*goto*/ 0x00) + goto_next(0x20) + + label(0x00) + label(0x20) + label(0x00) + if_distance_to_target_lt(200, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + if_timer_gt(360, /*goto*/ 0x20) + endloop(0x05) + + label(0x20) + say_quip(CHR_TARGET, 0x03, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x04) + + label(0x00) + say_quip(CHR_TARGET, 0x07, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x04) + + label(0x06) + goto_first(0x02) + + label(0x07) + try_run_to_target(/*goto*/ 0x08) + + beginloop(0x08) + endloop(0x08) + + label(0x09) + goto_first(0x02) + + // Unreachable + // Attempts to teleport Dr Caroll up the elevator shaft from foyer + label(0x5c) + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x20) + chr_move_to_pad(CHR_DRCAROLL, PAD_ARK_0079, 0x00, /*goto*/ 0x00) + label(0x00) + goto_first(0x02) + + label(0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Waiting at the door to the top room while you clear it out. + */ +u8 func0405_drcaroll_waiting[] = { + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x20) + goto_next(0x00) + + label(0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x00) + set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00100000) + chr_move_to_pad(CHR_DRCAROLL, PAD_ARK_01CA, 0x00, /*goto*/ 0x00) + label(0x00) + stop_chr + + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_TOP_BODYGUARDS_DEAD, TRUE, /*goto*/ 0x00) + endloop(0x1f) + + label(0x00) + set_ailist(CHR_SELF, AILIST_DRCAROLL_FOLLOWING) + endlist +}; + +u8 func100c_foyer_lights_timer[] = { + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_OFF, TRUE, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) + + // PA + set_countdown_timer(60) + start_countdown_timer + show_countdown_timer + goto_next(0x0e) + + // Agent + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + set_countdown_timer(60) + start_countdown_timer + show_countdown_timer + goto_next(0x0e) + + // SA + label(0x2f) + set_countdown_timer(90) + start_countdown_timer + show_countdown_timer + + beginloop(0x0e) + if_countdown_timer_lt(1, /*goto*/ 0x0f) + endloop(0x0e) + + label(0x0f) + set_stage_flag(STAGEFLAG_FOYER_LIGHTS_RESTORED) + hide_countdown_timer + stop_countdown_timer + set_lights_state(0x0019, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x001a, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x001b, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x001c, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x001d, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x001e, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x001f, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0020, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0021, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0017, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0018, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0016, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0022, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0023, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0024, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0025, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0026, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0027, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0028, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0029, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x002a, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x002b, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x002c, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x002d, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x002e, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x002f, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0030, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0031, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0032, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0033, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0034, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0035, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0036, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0015, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x000f, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x000e, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0010, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0011, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0012, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0013, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0014, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x000d, LIGHTOP_1, 0x64, 0x00, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0410_init_top_guard[] = { + set_shotlist(AILIST_TOP_GUARD) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x20) + + // SA and PA + set_chr_dodge_rating(2, 10) + set_accuracy(80) + set_reaction_speed(10) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + goto_next(0x00) + + // Agent + label(0x20) + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(10) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + + label(0x00) + beginloop(0x8d) + if_stage_flag_eq(STAGEFLAG_ENTERING_TOP_ROOM, TRUE, /*goto*/ 0x20) + endloop(0x8d) + + label(0x20) + set_ailist(CHR_SELF, AILIST_TOP_GUARD) + endlist +}; + +u8 func040f_top_guard[] = { + if_just_injured(CHR_SELF, /*goto*/ 0x20) + goto_next(0x00) + + label(0x20) + set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) + + beginloop(0x21) + if_chr_stopped(/*goto*/ 0x00) + endloop(0x21) + + label(0x00) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x1f) + + beginloop(0x1f) + if_distance_to_target_lt(200, /*goto*/ 0x20) + if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x00) + if_stage_flag_eq(STAGEFLAG_TOP_GUARDS_ATTACKING, TRUE, /*goto*/ 0x00) + set_target_chr(CHR_PRESET) + endloop(0x1f) + + label(0x00) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + + label(0x20) + set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + endlist +}; + +u8 func0411_top_guard_blinded[] = { + if_chr_deadish(CHR_SELF, /*goto*/ 0x20) + goto_next(0x00) + + label(0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x00) + chr_do_animation(ANIM_BLINDED, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + say_quip(CHR_BOND, 0x11, 0x64, 0x02, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x1f) + if_chr_stopped(/*goto*/ 0x00) + endloop(0x1f) + + label(0x00) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + endlist +}; + +u8 func0406_general_combat[] = { + set_self_chrflag(CHRCFLAG_00000040) + set_shotlist(AILIST_GENERAL_COMBAT) + if_has_gun(CHR_SELF, /*goto*/ 0x20) + + // No gun + set_shotlist(GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + // Has gun + label(0x20) + if_chr_deadish(CHR_SELF, /*goto*/ 0x00) + goto_next(0x20) + + // Dying - wait a few frames then say quip + label(0x00) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x0b) + if_timer_gt(15, /*goto*/ 0x00) + endloop(0x0b) + + label(0x00) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive with gun + label(0x20) + if_just_injured(CHR_SELF, /*goto*/ 0x00) + goto_next(0x21) + + // Just got injured + label(0x00) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED) + restart_timer + + beginloop(0x0c) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x00) + if_num_times_shot_lt(1, /*goto*/ 0x00) + if_timer_lt(20, /*goto*/ 0x00) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x00) + if_chr_stopped(/*goto*/ 0x21) + endloop(0x0c) + + // Not injured, or injury recovery finished + label(0x21) + set_self_chrflag(CHRCFLAG_00000040) + + label(0x14) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x00) + label(0x20) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x10) + label(0x00) + kneel + + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) + goto_next(0x20) + + // Lights restored + label(0x00) + set_view_distance(100) + + label(0x20) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) + if_target_in_sight(/*goto*/ 0x15) + goto_next(0x20) + + label(0x00) + if_can_see_target(/*goto*/ 0x15) + label(0x20) + if_near_miss(/*goto*/ 0x18) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) + if_enemy_distance_lt_and_los(500, /*goto*/ 0x20) + goto_next(0x5e) + + label(0x00) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x20) + goto_next(0x5e) + + label(0x20) + if_target_is_player(/*goto*/ 0x5e) + goto_next(0x15) + + label(0x5e) + set_target_chr(CHR_P1P2) + reloop(0x10) + + label(0x00) + if_target_in_sight(/*goto*/ 0x15) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) + if_enemy_distance_lt_and_los(500, /*goto*/ 0x20) + goto_next(0x5e) + + label(0x00) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x20) + goto_next(0x5e) + + label(0x20) + if_target_is_player(/*goto*/ 0x5e) + goto_next(0x15) + + label(0x5e) + set_target_chr(CHR_P1P2) + endloop(0x10) + + label(0x15) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED) + if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2a) + if_distance_to_target_lt(250, /*goto*/ 0x29) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x20) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) + say_quip(CHR_BOND, QUIP_SEARCHSUCCESS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + goto_next(0x20) + + label(0x00) + say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + label(0x20) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x17) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x12) + goto_next(0x13) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x13) + endloop(0x12) + + label(0x13) + if_chr_injured_target(CHR_SELF, /*goto*/ 0x20) + say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) + goto_next(0x00) + + label(0x20) + say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) + label(0x00) + goto_first(0x14) + + label(0x18) + restart_timer + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x1c) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x1c) + say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + + beginloop(0x1c) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + call_rng + if_target_in_sight(/*goto*/ 0x19) + if_timer_gt(60, /*goto*/ 0x1e) + if_rand_lt(4, /*goto*/ 0x1e) + endloop(0x1c) + + label(0x1e) + if_can_see_target(/*goto*/ 0x19) + goto_first(0x14) + + label(0x19) + goto_first(0x15) + + label(0x1a) + restart_timer + + beginloop(0x1b) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x19) + if_timer_gt(300, /*goto*/ 0x00) + endloop(0x1b) + + label(0x00) + goto_first(0x14) + + label(0x19) + goto_first(0x15) + + label(0x17) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x16) + label(0x16) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x00) + goto_next(0x20) + label(0x00) + goto_first(0x12) + + label(0x20) + goto_first(0x13) + + label(0x29) + try_jog_to_target(/*goto*/ 0x20) + label(0x20) + set_returnlist(CHR_SELF, AILIST_GENERAL_COMBAT) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + + label(0x2a) + label(0x20) + if_target_is_player(/*goto*/ 0x20) + set_shotlist(GAILIST_COMBAT_WITH_TARGET) + set_returnlist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + label(0x20) + set_shotlist(GAILIST_ALERTED) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func0408_hovercopter[] = { + set_target_chr(CHR_BOND) + chopper_arm_weapons + move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0199) + begin_hovercar_path(0x02) + restart_timer + set_chr_maxdamage(CHR_SELF, 42320) + + beginloop(0x1f) + if_timer_gt(120, /*goto*/ 0x42) + endloop(0x1f) + + label(0x42) + yield + if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x52) + if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x53) + goto_next(0x54) + + // Low combat (lowest floor) + label(0x21) + begin_hovercar_path(0x00) + + beginloop(0x22) + if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x00) + if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x53) + if_stage_flag_eq(STAGEFLAG_CHOPPER_GO_TO_ROOF, FALSE, /*goto*/ 0x00) + goto_next(0x54) + + label(0x00) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x43) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x20) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x43) + set_target_chr(CHR_BOND) + label(0x20) + endloop(0x22) + + // Mid combat (second floor and Cass's office floor) + label(0x23) + begin_hovercar_path(0x01) + + beginloop(0x24) + if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x52) + if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x00) + if_stage_flag_eq(STAGEFLAG_CHOPPER_GO_TO_ROOF, FALSE, /*goto*/ 0x00) + goto_next(0x54) + + label(0x00) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x48) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x20) + set_target_chr(CHR_COOP) + + // @bug: This should go to 0x48. Instead it goes to the low code path, + // which doesn't appear to have any side effects except that the + // hovercopter will say the low line ("surrender or die") on the mid + // level if Velvet is the first player it sees. + if_can_see_target(/*goto*/ 0x43) + set_target_chr(CHR_BOND) + label(0x20) + endloop(0x24) + + // High combat (roof) + label(0x25) + begin_hovercar_path(0x02) + + beginloop(0x26) + set_target_chr(CHR_BOND) + if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x52) + if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x53) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x4d) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x20) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x4d) + label(0x20) + set_target_chr(CHR_BOND) + label(0x00) + endloop(0x26) + + // Change to high + label(0x54) + label(0x27) + yield + goto_next(0x00) + label(0x00) + if_can_see_target(/*goto*/ 0x20) + move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0199) + label(0x20) + goto_first(0x25) + + // Change to low + label(0x52) + if_can_see_target(/*goto*/ 0x20) + move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0190) + label(0x20) + goto_first(0x21) + + // Change to mid + label(0x53) + if_can_see_target(/*goto*/ 0x20) + move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0195) + label(0x20) + goto_first(0x23) + + // Low shooting + label(0x43) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x44) + goto_first(0x22) + + beginloop(0x44) + if_can_see_target(/*goto*/ 0x47) + restart_timer + + beginloop(0x45) + if_timer_gt(480, /*goto*/ 0x46) + if_can_see_target(/*goto*/ 0x47) + endloop(0x45) + + label(0x46) + stop_chr + goto_first(0x22) + + label(0x47) + if_stage_flag_eq(STAGEFLAG_SAID_SURRENDER_OR_DIE, TRUE, /*goto*/ 0x20) + play_sound(MP3_030B, -1) + set_stage_flag(STAGEFLAG_SAID_SURRENDER_OR_DIE) + label(0x20) + endloop(0x44) + + // Mid shooting + label(0x48) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x49) + goto_first(0x24) + + beginloop(0x49) + if_can_see_target(/*goto*/ 0x4c) + restart_timer + + beginloop(0x4a) + if_timer_gt(180, /*goto*/ 0x4b) + if_can_see_target(/*goto*/ 0x4c) + endloop(0x4a) + + label(0x4b) + stop_chr + goto_first(0x24) + + label(0x4c) + if_stage_flag_eq(STAGEFLAG_SAID_GIVE_UP, TRUE, /*goto*/ 0x20) + play_sound(MP3_030D, -1) + set_stage_flag(STAGEFLAG_SAID_GIVE_UP) + label(0x20) + endloop(0x49) + + // High shooting (roof) + label(0x4d) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x00) + label(0x00) + set_stage_flag(STAGEFLAG_HOVERCOPTER_ON_ROOF) + if_stage_flag_eq(STAGEFLAG_SAID_FINAL_WARNING, TRUE, /*goto*/ 0x20) + play_sound(MP3_030C, -1) + set_stage_flag(STAGEFLAG_SAID_FINAL_WARNING) + label(0x20) + stop_chr + restart_timer + + beginloop(0x29) + if_timer_gt(180, /*goto*/ 0x00) + endloop(0x29) + + label(0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x00) + goto_first(0x26) + + label(0x00) + restart_timer + + beginloop(0x4e) + if_can_see_target(/*goto*/ 0x51) + restart_timer + + beginloop(0x4f) + if_timer_gt(480, /*goto*/ 0x50) + if_can_see_target(/*goto*/ 0x51) + endloop(0x4f) + + label(0x50) + stop_chr + goto_first(0x26) + + label(0x51) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x20) + if_timer_gt(500, /*goto*/ 0x27) + label(0x20) + endloop(0x4e) + + label(0x27) + restart_timer + hovercopter_fire_rocket(0) // left side + goto_first(0x4e) + + // Unreachable - the hovercopter only fires rockets from the left side + label(0x28) + restart_timer + hovercopter_fire_rocket(1) // right side + goto_first(0x4e) + + endlist +}; + +u8 func1002_check_accessed_foyer_elevator[] = { + beginloop(0x21) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_y(CHR_TARGET, -8155, OPERATOR_LESS_THAN, /*goto*/ 0x20) + if_chr_distance_to_pad_lt(CHR_TARGET, 300, PAD_ARK_021A, /*goto*/ 0x00) + label(0x20) + goto_first(0x21) + + label(0x00) + set_stage_flag(STAGEFLAG_ACCESSED_FOYER_ELEVATOR) + show_hudmsg(CHR_TARGET, L_ARK_033) // "Foyer elevator accessed." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_check_end_level[] = { + beginloop(0x21) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_ARK_0002, /*goto*/ 0x00) + reloop(0x21) + + label(0x00) + if_chr_y(CHR_P1P2, 30, OPERATOR_LESS_THAN, /*goto*/ 0x20) + goto_next(0x00) + label(0x20) + reloop(0x21) + + label(0x00) + set_stage_flag(STAGEFLAG_REACHED_HELIPAD) + yield + if_all_objectives_complete(/*goto*/ 0x20) + endloop(0x21) + + label(0x20) + if_chr_deadish(CHR_BOND, /*goto*/ 0x20) + goto_next(0x00) + + label(0x20) + if_chr_deadish(CHR_COOP, /*goto*/ 0x20) + goto_next(0x00) + + label(0x20) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x00) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func1004_elevator_unlocking[] = { + yield + if_difficulty_gt(DIFF_SA, /*goto*/ 0x1f) + unlock_door(0x02, 0x01) + unlock_door(0x03, 0x01) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x1f) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, 0x01, /*goto*/ 0x20) + if_object_in_good_condition(0x01, /*goto*/ 0x00) + goto_next(0x28) + label(0x00) + endloop(0x1f) + + // Computer destroyed + label(0x28) + if_stage_flag_eq(STAGEFLAG_ELEVATOR_UNLOCKED, TRUE, /*goto*/ 0x00) + set_stage_flag(STAGEFLAG_ELEVATOR_PC_DESTROYED) + show_hudmsg(CHR_BOND, L_ARK_045) // "Critical mission object destroyed." + label(0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Computer activated + label(0x20) + show_hudmsg(CHR_TARGET, L_ARK_014) // "Accessing elevator controls..." + assign_sound(SFX_8116, CHANNEL_6) + control_sound_from_object(CHANNEL_6, 0x01, TRUE) + restart_timer + + beginloop(0x22) + if_timer_gt(15, /*goto*/ 0x00) + endloop(0x22) + + label(0x00) + mute_channel(CHANNEL_6) + + beginloop(0x23) + if_timer_gt(40, /*goto*/ 0x00) + endloop(0x23) + + label(0x00) + + beginloop(0x24) + if_timer_gt(60, /*goto*/ 0x00) + endloop(0x24) + + label(0x00) + + beginloop(0x25) + if_timer_gt(80, /*goto*/ 0x00) + endloop(0x25) + + label(0x00) + restart_timer + + beginloop(0x21) + if_timer_gt(120, /*goto*/ 0x00) + endloop(0x21) + + label(0x00) + play_sound(SFX_DOOR_81B0, -1) + unlock_door(0x02, 0x01) + unlock_door(0x03, 0x01) + show_hudmsg(CHR_TARGET, L_ARK_034) // "Office elevator door has been unlocked." + set_stage_flag(STAGEFLAG_ELEVATOR_UNLOCKED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_check_bodyguards_dead[] = { + #define if_alive_goto_00(chr, goto) \ + if_chr_deadish(chr, goto) \ + goto_next(0x00) \ + label(goto) + + beginloop(0x1f) + if_alive_goto_00(CHR_TOPGUARD5, 0x21) + if_alive_goto_00(CHR_TOPGUARD4, 0x22) + if_alive_goto_00(CHR_TOPGUARD3, 0x23) + if_alive_goto_00(CHR_TOPGUARD2, 0x24) + if_alive_goto_00(CHR_TOPGUARD1, 0x20) + + set_stage_flag(STAGEFLAG_TOP_BODYGUARDS_DEAD) + unlock_door(OBJ_TOPROOMDOOR, 0x02) + unset_object_flag2(OBJ_TOPROOMDOOR, OBJFLAG2_AICANNOTUSE) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x26) + + if_alive_goto_00(0x16, 0x20) + if_alive_goto_00(0x17, 0x20) + if_alive_goto_00(0x18, 0x20) + if_alive_goto_00(0x19, 0x20) + if_alive_goto_00(0x1a, 0x20) + + if_chr_deadish(0x1b, /*goto*/ 0x20) + goto_next(0x00) + + label(0x00) + endloop(0x1f) + + label(0x20) + label(0x26) + show_hudmsg(CHR_BOND, L_ARK_036) // "Cassandra's bodyguards have been defeated." + set_stage_flag(STAGEFLAG_OBJECTIVE_BODYGUARDS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_check_hovercopter_destroyed[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x26) + + beginloop(0x1f) + if_object_in_good_condition(OBJ_HOVERCOPTER, /*goto*/ 0x00) + show_hudmsg(CHR_BOND, L_ARK_035) // "DataDyne Hovercopter eliminated." + set_stage_flag(STAGEFLAG_HOVERCOPTER_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x00) + endloop(0x1f) + + label(0x26) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_drcaroll_warnings[] = { + beginloop(0x1f) + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x21) + if_stage_flag_eq(STAGEFLAG_DRCAROLL_ATTACKED, TRUE, /*goto*/ 0x00) + if_chr_shield_lt(CHR_DRCAROLL, 100, /*goto*/ 0x30) + + // Attacked message already shown + label(0x00) + if_stage_flag_eq(STAGEFLAG_DRCAROLL_DAMAGED, TRUE, /*goto*/ 0x00) + if_just_injured(CHR_DRCAROLL, /*goto*/ 0x31) + + label(0x00) + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x00) + reloop(0x1f) + + // Dead + label(0x21) + label(0x00) + show_hudmsg(CHR_BOND, L_ARK_016) // "Dr. Caroll has been killed!" + set_stage_flag(STAGEFLAG_DRCAROLL_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Shield under 100 + label(0x30) + show_hudmsg(CHR_BOND, L_ARK_017) // "Dr. Caroll is under attack!" + set_stage_flag(STAGEFLAG_DRCAROLL_ATTACKED) + reloop(0x1f) + + label(0x31) + show_hudmsg(CHR_BOND, L_ARK_018) // "Dr. Caroll has been damaged!" + set_stage_flag(STAGEFLAG_DRCAROLL_DAMAGED) + endloop(0x1f) + + endlist +}; + +u8 func1007_noop[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_trigger_hovercopter_roof[] = { + // Wait until techs running, then wait 7 seconds, then set flag that allows + // the hovercopter to go to the roof. + beginloop(0x1f) + if_timer_gt(420, /*goto*/ 0x21) + if_timer_gt(0, /*goto*/ 0x20) + if_stage_flag_eq(STAGEFLAG_TECHS_RUNNING, TRUE, /*goto*/ 0x00) + label(0x20) + reloop(0x1f) + + label(0x00) + restart_timer + endloop(0x1f) + + label(0x21) + set_stage_flag(STAGEFLAG_CHOPPER_GO_TO_ROOF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_init_top_room[] = { + set_chr_chrflag(CHR_TOPGUARD1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TOPGUARD2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TOPGUARD3, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TOPGUARD4, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TOPGUARD5, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CASS, CHRCFLAG_INVINCIBLE) + + beginloop(0x1f) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0039, /*goto*/ 0x00) + if_chr_activated_object(CHR_P1P2, OBJ_TOPROOMDOOR, /*goto*/ 0x00) + endloop(0x1f) + + label(0x00) + set_object_flag(OBJ_TOPROOMDOOR, OBJFLAG_CANNOT_ACTIVATE) + set_chr_target_chr(CHR_CASS, CHR_P1P2) + set_chr_target_chr(CHR_TOPGUARD1, CHR_P1P2) + set_chr_target_chr(CHR_TOPGUARD2, CHR_P1P2) + set_chr_target_chr(CHR_TOPGUARD3, CHR_P1P2) + set_chr_target_chr(CHR_TOPGUARD4, CHR_P1P2) + set_chr_target_chr(CHR_TOPGUARD5, CHR_P1P2) + unset_chr_chrflag(CHR_TOPGUARD1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TOPGUARD2, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TOPGUARD3, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TOPGUARD4, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TOPGUARD5, CHRCFLAG_INVINCIBLE) + set_chr_team(CHR_CASS, TEAM_ENEMY) + set_chr_team(CHR_TOPGUARD1, TEAM_ENEMY) + set_chr_team(CHR_TOPGUARD2, TEAM_ENEMY) + set_chr_team(CHR_TOPGUARD3, TEAM_ENEMY) + set_chr_team(CHR_TOPGUARD4, TEAM_ENEMY) + set_chr_team(CHR_TOPGUARD5, TEAM_ENEMY) + set_stage_flag(STAGEFLAG_ENTERING_TOP_ROOM) + restart_timer + + beginloop(0x21) + if_timer_gt(60, /*goto*/ 0x00) + endloop(0x21) + + label(0x00) + beginloop(0x21) + if_chr_shield_lt(CHR_CASS, 100, /*goto*/ 0x20) + endloop(0x21) + + label(0x20) + set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040b_init_tech1[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, 0x0409) + endlist +}; + +u8 func0409_tech_conversation[] = { + set_shotlist(GAILIST_IDLE) + + beginloop(0x01) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, 0x11, /*goto*/ 0x00) + if_door_state(0x11, DOORSTATE_OPEN, /*goto*/ 0x00) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + set_chr_chrflag(CHR_TECH1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TECH2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_RLSHOCK, CHRCFLAG_INVINCIBLE) + endloop(0x01) + + // Player activated door or door is fully open + label(0x00) + set_chrpreset(CHR_TARGET) + set_chr_team(CHR_TECH1, TEAM_ENEMY) + set_chr_team(CHR_TECH2, TEAM_ENEMY) + set_chr_team(CHR_RLSHOCK, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + unset_chr_chrflag(CHR_TECH1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TECH2, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_RLSHOCK, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_RLSHOCK, GAILIST_UNALERTED) + restart_timer + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) + + beginloop(0x28) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + if_timer_gt(30, /*goto*/ 0x20) + endloop(0x28) + + label(0x20) + chr_do_animation(ANIM_TALKING_00A0, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + speak(CHR_PRESET, L_ARK_037, SFX_811D, CHANNEL_7, COLOR_06_WHITE) // "That's not how it goes." + restart_timer + + beginloop(0x21) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + if_target_in_sight(/*goto*/ 0x33) + pause_timer + if_sound_finished(CHANNEL_7, /*goto*/ 0x20) + reloop(0x21) + + label(0x20) + resume_timer + if_timer_gt(20, /*goto*/ 0x20) + goto_first(0x21) + + label(0x20) + chr_do_animation(ANIM_TWO_GUN_HOLD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + chr_do_animation(ANIM_TALKING_00A0, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) + speak(CHR_PRESET, L_ARK_038, SFX_8120, CHANNEL_7, COLOR_08_RED) // "Yes, it is." + + beginloop(0x22) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + if_target_in_sight(/*goto*/ 0x33) + pause_timer + if_sound_finished(CHANNEL_7, /*goto*/ 0x20) + reloop(0x22) + + label(0x20) + resume_timer + if_timer_gt(40, /*goto*/ 0x20) + endloop(0x22) + + label(0x20) + chr_do_animation(ANIM_TALKING_00A0, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) + speak(CHR_PRESET, L_ARK_039, SFX_811E, CHANNEL_7, COLOR_06_WHITE) // "Give it to me - you're doing it wrong." + + beginloop(0x23) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + if_target_in_sight(/*goto*/ 0x33) + pause_timer + if_sound_finished(CHANNEL_7, /*goto*/ 0x20) + reloop(0x23) + + label(0x20) + resume_timer + if_timer_gt(60, /*goto*/ 0x20) + endloop(0x23) + + label(0x20) + chr_do_animation(ANIM_TWO_GUN_HOLD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + chr_do_animation(ANIM_TALKING_00A0, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) + speak(CHR_PRESET, L_ARK_040, SFX_8121, CHANNEL_7, COLOR_08_RED) // "Stop annoying me." + + beginloop(0x24) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + if_target_in_sight(/*goto*/ 0x33) + pause_timer + if_sound_finished(CHANNEL_7, /*goto*/ 0x20) + reloop(0x24) + + label(0x20) + resume_timer + if_timer_gt(80, /*goto*/ 0x20) + endloop(0x24) + + label(0x20) + chr_do_animation(ANIM_TWO_GUN_HOLD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + chr_do_animation(ANIM_TALKING_00A0, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, CHR_RLSHOCK, 2) + chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) + speak(CHR_PRESET, L_ARK_041, SFX_8123, CHANNEL_7, COLOR_09_BLUE) // "Will you just hurry up!" + + beginloop(0x25) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + if_target_in_sight(/*goto*/ 0x33) + pause_timer + if_sound_finished(CHANNEL_7, /*goto*/ 0x20) + reloop(0x25) + + label(0x20) + resume_timer + if_timer_gt(100, /*goto*/ 0x20) + endloop(0x25) + + label(0x20) + set_stage_flag(STAGEFLAG_TECHS_FINISHED) + stop_chr + + beginloop(0x26) + if_saw_injury(0x00, /*goto*/ 0x33) + if_saw_death(0x00, /*goto*/ 0x33) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + if_can_see_target(/*goto*/ 0x20) + endloop(0x26) + + label(0x20) + label(0x33) + if_stage_flag_eq(STAGEFLAG_TECHS_RUNNING, TRUE, /*goto*/ 0x00) + set_stage_flag(STAGEFLAG_TECHS_RUNNING) + label(0x00) + increase_squadron_alertness(100) + open_door(0x04) + restart_timer + speak(CHR_TARGET, L_ARK_042, SFX_811F, CHANNEL_7, COLOR_06_WHITE) // "Oh, no...too late." + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x34) + if_timer_gt(60, /*goto*/ 0x35) + endloop(0x34) + + label(0x35) + jog_to_pad(PAD_ARK_01CD) + + beginloop(0x36) + if_chr_stopped(/*goto*/ 0x37) + endloop(0x36) + + label(0x37) + restart_timer + surrender + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x38) + if_chr_idle(/*goto*/ 0x5e) + goto_next(0x20) + + label(0x5e) + reloop(0x38) + + label(0x20) + restart_timer + endloop(0x38) + + label(0x00) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_cass_necklace[] = { + chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_init_tech2[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, 0x040a) + endlist +}; + +u8 func040a_tech2[] = { + set_shotlist(GAILIST_IDLE) + stop_chr + + beginloop(0x1f) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TECHS_FINISHED, TRUE, /*goto*/ 0x20) + if_target_in_sight(/*goto*/ 0x33) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + endloop(0x1f) + + label(0x20) + stop_chr + + beginloop(0x21) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x00) + reloop(0x21) + + label(0x00) + label(0x33) + if_stage_flag_eq(STAGEFLAG_TECHS_RUNNING, TRUE, /*goto*/ 0x00) + set_stage_flag(STAGEFLAG_TECHS_RUNNING) + label(0x00) + increase_squadron_alertness(100) + open_door(0x04) + yield + restart_timer + chr_do_animation(ANIM_OPERATE_0205, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + // @bug: Duplicate label. I suspect the goto first 0x21 below is + // supposed to go here. The only possible side effect is the tech may + // restart his animation repeatedly. + label(0x21) + yield + if_sound_finished(CHANNEL_7, /*goto*/ 0x20) + endloop(0x21) + + label(0x20) + chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + speak(CHR_TARGET, L_ARK_043, SFX_8122, CHANNEL_7, COLOR_08_RED) // "She's here..." + + beginloop(0x22) + if_sound_finished(CHANNEL_7, /*goto*/ 0x35) + endloop(0x22) + + label(0x35) + jog_to_pad(PAD_ARK_002A) + + beginloop(0x36) + if_chr_stopped(/*goto*/ 0x37) + endloop(0x36) + + label(0x37) + restart_timer + surrender + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x38) + if_chr_idle(/*goto*/ 0x5e) + goto_next(0x20) + + label(0x5e) + reloop(0x38) + + label(0x20) + restart_timer + endloop(0x38) + + label(0x00) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_cass[] = { + set_shield(100) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CASS, CHRCFLAG_UNEXPLODABLE) + set_target_chr(CHR_P1P2) + + beginloop(0x3b) + if_stage_flag_eq(STAGEFLAG_ENTERING_TOP_ROOM, TRUE, /*goto*/ 0x3a) + endloop(0x3b) + + label(0x3a) + open_door(OBJ_TOPROOMDOOR) + set_target_chr(CHR_PRESET) + if_num_human_players_lt(2, /*goto*/ 0x20) + goto_next(0x89) + + // 1 player - do force walk (enter room) + label(0x20) + revoke_control(CHR_BOND, 0) + force_walk(CHR_BOND, 0x0019, 40, 55, 0, 46) + + beginloop(0x23) + open_door(OBJ_TOPROOMDOOR) + if_force_walk_finished(CHR_BOND, /*goto*/ 0x24) + endloop(0x23) + + // Second force walk (turn to face Cass) + label(0x24) + force_walk(CHR_BOND, 0x0018, 0, 65, 65, 0) + open_door(OBJ_TOPROOMDOOR) + + beginloop(0x25) + if_force_walk_finished(CHR_BOND, /*goto*/ 0x26) + endloop(0x25) + + label(0x26) + unset_object_flag(OBJ_TOPROOMDOOR, OBJFLAG_CANNOT_ACTIVATE) + grant_control(CHR_BOND) + close_door(OBJ_TOPROOMDOOR) + if_chr_in_room(CHR_BOND, 0x00, 0x0045, /*goto*/ 0x20) + lock_door(OBJ_TOPROOMDOOR, 0x02) + + // 2 players, or force walk failed + label(0x20) + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x20) + set_ailist(CHR_DRCAROLL, 0x0405) + label(0x20) + goto_next(0x00) + + label(0x89) + unset_object_flag(OBJ_TOPROOMDOOR, OBJFLAG_CANNOT_ACTIVATE) + restart_timer + + beginloop(0x8a) + if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x5b) + if_timer_gt(120, /*goto*/ 0x00) + endloop(0x8a) + + label(0x00) + restart_timer + speak(CHR_TARGET, L_ARK_032, SFX_80FF, CHANNEL_6, COLOR_04_ORANGE) // "We meet again, girl!" + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x27) + if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x5b) + if_sound_finished(CHANNEL_6, /*goto*/ 0x00) + endloop(0x27) + + label(0x00) + restart_timer + speak(CHR_TARGET, L_ARK_020, SFX_80FE, CHANNEL_6, COLOR_04_ORANGE) // "You've become quite an annoyance..." + chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + + beginloop(0x28) + if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x5b) + if_timer_gt(300, /*goto*/ 0x00) + endloop(0x28) + + label(0x5b) + restart_timer + + beginloop(0x29) + if_timer_gt(60, /*goto*/ 0x20) + endloop(0x29) + + label(0x20) + speak(CHR_TARGET, L_ARK_044, SFX_8101, CHANNEL_6, COLOR_04_ORANGE) // "Get her!" + chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + goto_next(0x20) + + label(0x00) + restart_timer + speak(CHR_TARGET, L_ARK_021, SFX_8100, CHANNEL_6, COLOR_04_ORANGE) // "Good night, Ms. Dark." + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x2a) + if_timer_gt(150, /*goto*/ 0x20) + endloop(0x2a) + + label(0x20) + set_lights_state(0x0044, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_stage_flag(STAGEFLAG_TOP_LIGHTS_OFF) + set_stage_flag(STAGEFLAG_TOP_GUARDS_ATTACKING) + walk_to_pad(PAD_ARK_000F) + restart_timer + + beginloop(0x2b) + if_timer_gt(60, /*goto*/ 0x00) + endloop(0x2b) + + label(0x00) + play_sound(SFX_8102, CHANNEL_7) + + beginloop(0x2c) + if_timer_gt(120, /*goto*/ 0x00) + endloop(0x2c) + + label(0x00) + play_x_track(XREASON_DEFAULT, 10, 60) + + beginloop(0x3f) + if_timer_gt(180, /*goto*/ 0x00) + endloop(0x3f) + + label(0x00) + set_stage_flag(STAGEFLAG_TRIGGER_CANTLEAVEANY_MSG) + label(0x3d) + label(0x00) + label(0x00) + set_stage_flag(STAGEFLAG_TOP_GUARDS_ATTACKING) + + // Wait until Cass not in top room +#if VERSION >= VERSION_NTSC_1_0 + beginloop(0x2c) + if_chr_in_room(CHR_SELF, 0x00, 0x003a, /*goto*/ 0x20) + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ 0x20) + goto_next(0x00) + + label(0x20) + reloop(0x2c) + + // And not in sight + label(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_nearly_in_targets_sight(30, /*goto*/ 0x20) + set_target_chr(CHR_ANTI) + if_nearly_in_targets_sight(30, /*goto*/ 0x20) + goto_next(0x2d) + + label(0x20) + endloop(0x2c) +#else + beginloop(0x2c) + if_can_see_target(/*goto*/ 0x20) + goto_next(0x2d) + + label(0x20) + endloop(0x2c) +#endif + + label(0x2d) + set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00100000) + chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) + chr_move_to_pad(CHR_CASS, PAD_ARK_0205, 0x00, /*goto*/ 0x00) + label(0x00) +#if VERSION >= VERSION_NTSC_1_0 + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x20) + label(0x20) +#else + stop_chr +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_unlock_top_door[] = { + beginloop(0x1f) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x003b, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + unlock_door(OBJ_TOPROOMDOOR, 0x02) + unset_object_flag2(OBJ_TOPROOMDOOR, OBJFLAG2_AICANNOTUSE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func040e_noop2[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_lightswitch[] = { + beginloop(0x1f) + if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x20) + reloop(0x1f) + + label(0x20) + play_sound(SFX_PRESS_SWITCH, -1) + if_stage_flag_eq(STAGEFLAG_TOP_LIGHTS_OFF, TRUE, /*goto*/ 0x00) + set_lights_state(0x0044, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) + set_stage_flag(STAGEFLAG_TOP_LIGHTS_OFF) + reloop(0x1f) + + label(0x00) + unset_stage_flag(STAGEFLAG_TOP_LIGHTS_OFF) + set_lights_state(0x0044, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_TURNON, 0x00, 0x00, 0x00) + endloop(0x1f) + + endlist +}; + +u8 func100b_check_top_lights_on[] = { + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_TOP_GUARDS_ATTACKING, TRUE, /*goto*/ 0x00) + endloop(0x1f) + + label(0x00) + if_stage_flag_eq(STAGEFLAG_TOP_LIGHTS_OFF, TRUE, /*goto*/ 0x00) + goto_next(0x20) + + label(0x00) + endloop(0x1f) + + label(0x20) + set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) + set_ailist(CHR_TOPGUARD1, AILIST_TOP_GUARD_BLINDED) + set_ailist(CHR_TOPGUARD2, AILIST_TOP_GUARD_BLINDED) + set_ailist(CHR_TOPGUARD3, AILIST_TOP_GUARD_BLINDED) + set_ailist(CHR_TOPGUARD4, AILIST_TOP_GUARD_BLINDED) + set_ailist(CHR_TOPGUARD5, AILIST_TOP_GUARD_BLINDED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_foyer_lights[] = { + restart_timer + beginloop(0x21) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_OFF, TRUE, /*goto*/ 0x00) + if_timer_gt(980, /*goto*/ 0x00) + endloop(0x21) + + label(0x00) + set_lights_state(0x0019, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x001a, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x001b, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x001c, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x001d, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x001e, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x001f, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0020, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0021, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0017, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0018, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0016, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0022, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0023, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0024, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0025, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0026, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0027, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0028, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0029, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x002a, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x002b, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x002c, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x002d, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x002e, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x002f, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0030, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0031, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0032, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0033, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0034, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0035, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0036, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x0015, LIGHTOP_3, 0x64, 0x02, 0x78) + set_lights_state(0x000f, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x000e, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x0010, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x0011, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x0012, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x0013, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x0014, LIGHTOP_3, 0x64, 0x02, 0xf0) + set_lights_state(0x000d, LIGHTOP_3, 0x64, 0x02, 0xf0) + restart_timer + + beginloop(0x22) + if_timer_gt(240, /*goto*/ 0x00) + endloop(0x22) + + label(0x00) + set_lights_state(0x0019, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x001a, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x001b, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x001c, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x001d, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x001e, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x001f, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0020, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0021, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0017, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0018, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0016, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0022, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0023, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0024, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0025, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0026, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0027, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0028, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0029, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x002a, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x002b, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x002c, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x002d, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x002e, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x002f, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0030, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0031, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0032, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0033, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0034, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0035, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0036, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0015, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x000f, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x000e, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0010, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0011, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0012, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0013, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x0014, LIGHTOP_1, 0x02, 0x00, 0x00) + set_lights_state(0x000d, LIGHTOP_1, 0x02, 0x00, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + give_object_to_chr(OBJ_NIGHTVISION, CHR_BOND) + give_object_to_chr(OBJ_NIGHTVISION, CHR_COOP) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func100d_intro[] = { + play_cutscene_track(MUSIC_EXTRACTION_INTRO) + camera_movement(ANIM_CUT_ARK_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(0x00, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(0x00, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_INTRO_DRC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 4) + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_INTRO_GUARD_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 4) + unset_stage_flag(STAGEFLAG_00800000) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + if_controller_button_pressed(/*goto*/ 0x00) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x5d) \ + if_timer_gt(time, /*goto*/ 0x00) \ + endloop(loopid) \ + label(0x00) + + wait_until(20, 0x61) + open_door(0x0c) + + wait_until(120, 0x60) + play_sound(SFX_0161, -1) + + wait_until(350, 0x62) + play_sound(SFX_042F, -1) + + wait_until(450, 0x63) + play_sound(SFX_0427, -1) + + wait_until(540, 0x64) + speak(CHR_BOND, L_ARK_060, MP3_03F3, CHANNEL_7, COLOR_06_WHITE) // "Sound the alarm - she's here!" + + wait_until(640, 0x65) + speak(CHR_BOND, L_ARK_061, MP3_03F4, CHANNEL_7, COLOR_09_BLUE) // "Lights out!" + + wait_until(690, 0x66) + play_sound(SFX_0428, -1) + + wait_until(720, 0x67) + play_sound(SFX_ARGH_DRCAROLL_0250, 10) + + wait_until(850, 0x68) + play_sound(SFX_0430, -1) + + wait_until(880, 0x69) + play_sound(SFX_0429, -1) + + wait_until(890, 0x6a) + close_door(0x0c) + + wait_until(1000, 0x6b) + speak(CHR_BOND, L_ARK_062, MP3_03F5, CHANNEL_7, COLOR_09_BLUE) // "What the...?" + + beginloop(0x21) + if_camera_animating(/*goto*/ 0x20) + goto_next(0x5d) + + label(0x20) + endloop(0x21) + + label(0x5d) + set_stage_flag(STAGEFLAG_FOYER_LIGHTS_OFF) + mute_channel(CHANNEL_10) + mute_channel(CHANNEL_7) + + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_INTRO_DRC, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) + + unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_INVINCIBLE) + set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_PERIMDISABLEDTMP) + chr_do_animation(ANIM_CUT_ARK_INTRO_GUARD_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) + + stop_cutscene_track + stop_ambient_track + enter_firstperson + yield + chr_do_animation(ANIM_CUT_ARK_INTRO_GUARD_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) + set_ailist(CHR_DRCAROLL, 0x0402) + yield + kill(CHR_INTRO_GUARD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_outro[] = { + play_cutscene_track(MUSIC_EXTRACTION_OUTRO) + play_temporary_track(MUSIC_EXTRACTION_OUTRO_SFX) + camera_movement(ANIM_CUT_ARK_OUTRO_CAM) + set_object_flag2(OBJ_HOVERCOPTER, OBJFLAG2_INVISIBLE) + disable_object(OBJ_HOVERCOPTER) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CASS, CHRCFLAG_INVINCIBLE) + chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) + set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_OUTRO_GUARD1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_OUTRO_GUARD2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_INVINCIBLE) + + set_ailist(CHR_DRCAROLL, GAILIST_IDLE) + set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_OUTRO_DRC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 4) + + set_ailist(CHR_CASS, AILIST_CASS_OUTRO) + set_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_OUTRO_CASS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 4) + + set_ailist(CHR_MRBLONDE, GAILIST_IDLE) + set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_OUTRO_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MRBLONDE, 4) + + set_ailist(CHR_OUTRO_GUARD1, GAILIST_IDLE) + set_chr_chrflag(CHR_OUTRO_GUARD1, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_OUTRO_GUARD1, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_OUTRO_GUARD1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_OUTRO_GUARD1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD1, 4) + + set_ailist(CHR_OUTRO_GUARD2, GAILIST_IDLE) + set_chr_chrflag(CHR_OUTRO_GUARD2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_OUTRO_GUARD2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_OUTRO_GUARD2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_OUTRO_GUARD2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD2, 4) + + enable_object(OBJ_JUMPSHIP) + set_object_flag3(OBJ_JUMPSHIP, OBJFLAG3_00000010) + set_object_flag2(OBJ_JUMPSHIP, OBJFLAG2_04000000) + object_do_animation(ANIM_CUT_ARK_OUTRO_DROPSHIP, OBJ_JUMPSHIP, 0x04, 0xffff) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ARK_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + show_nonessential_chrs(FALSE) + restart_timer + set_cutscene_weapon(CHR_P1P2, -1, -1) + yield + set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2_SCOPE) + + #define outro_wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x5d) \ + if_timer_gt(time, /*goto*/ 0x00) \ + endloop(loopid) \ + label(0x00) + + outro_wait_until(0, 0x5f) + outro_wait_until(20, 0x5f) + outro_wait_until(47, 0x7e) + outro_wait_until(90, 0x7f) + + outro_wait_until(120, 0x60) + speak(CHR_P1P2, L_ARK_063, MP3_03F6, CHANNEL_7, COLOR_04_ORANGE) // "Going somewhere?" + + outro_wait_until(188, 0x61) + play_sound(SFX_01D9, -1) + + outro_wait_until(350, 0x62) + speak(CHR_P1P2, L_ARK_064, MP3_03F7, CHANNEL_7, COLOR_09_BLUE) // "Something I can do for you, old woman?" + + outro_wait_until(500, 0x63) + speak(CHR_P1P2, L_ARK_065, MP3_03F8, CHANNEL_7, COLOR_04_ORANGE) // "Return our sapient immediately! You don't know wha..." + + outro_wait_until(720, 0x64) + play_sound(SFX_0424, -1) + + outro_wait_until(740, 0x65) + speak(CHR_P1P2, L_ARK_066, MP3_03F9, CHANNEL_7, COLOR_09_BLUE) // "Yes I do. I'm leaving." + + outro_wait_until(858, 0x73) + + outro_wait_until(980, 0x66) + speak(CHR_P1P2, L_ARK_067, MP3_03FA, CHANNEL_7, COLOR_04_ORANGE) // "One more chance! Give it back, and you could come ..." + + outro_wait_until(990, 0x68) + play_sound(SFX_RELOAD_DEFAULT, -1) + + outro_wait_until(1220, 0x69) + + outro_wait_until(1240, 0x6a) + + outro_wait_until(1348, 0x6b) + play_sound(SFX_FOOTSTEP_80C8, -1) + + outro_wait_until(1380, 0x80) + play_sound(SFX_FOOTSTEP_80C9, -1) + + outro_wait_until(1400, 0x81) + set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD1, TRUE) + + yield + yield + set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD1, FALSE) + + outro_wait_until(1420, 0x82) + set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD2, TRUE) + + yield + yield + set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD2, FALSE) + + outro_wait_until(1425, 0x6c) + speak(CHR_P1P2, L_ARK_068, MP3_03FB, CHANNEL_7, COLOR_09_BLUE) // "Sorry! Gotta shoot." + + outro_wait_until(1447, 0x6d) + play_sound(SFX_FOOTSTEP_80CA, -1) + + outro_wait_until(1486, 0x83) + play_sound(SFX_FOOTSTEP_80CB, -1) + + outro_wait_until(1505, 0x6e) + play_sound(SFX_FIRE_SHOTGUN, CHANNEL_10) + + outro_wait_until(1520, 0x6f) + play_sound(SFX_FIRE_SHOTGUN, CHANNEL_10) + + outro_wait_until(1526, 0x70) + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + + yield + yield + set_chr_shooting_in_cutscene(CHR_BOND, FALSE) + + outro_wait_until(1538, 0x84) + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + + yield + yield + set_chr_shooting_in_cutscene(CHR_BOND, FALSE) + + outro_wait_until(1554, 0x71) + play_sound(SFX_ARGH_FEMALE_000D, CHANNEL_10) + + outro_wait_until(1600, 0x74) + play_sound(SFX_ARGH_FEMALE_000E, CHANNEL_10) + + outro_wait_until(1734, 0x72) + play_sound(SFX_THUD_808D, CHANNEL_10) + + outro_wait_until(1890, 0x75) + play_sound(SFX_0425, -1) + + outro_wait_until(1940, 0x77) + speak(CHR_P1P2, L_ARK_069, MP3_03FC, CHANNEL_7, COLOR_03_RED) // "You must get the sapient back. We cannot proceed w..." + + outro_wait_until(1944, 0x76) + play_sound(SFX_FOOTSTEP_80C4, -1) + + outro_wait_until(1970, 0x85) + play_sound(SFX_FOOTSTEP_80C5, -1) + + outro_wait_until(2008, 0x86) + play_sound(SFX_FOOTSTEP_80C6, -1) + + outro_wait_until(2190, 0x78) + speak(CHR_P1P2, L_ARK_070, MP3_03FD, CHANNEL_7, COLOR_04_ORANGE) // "I know that!" + + outro_wait_until(2300, 0x79) + play_sound(SFX_FOOTSTEP_80C7, -1) + + outro_wait_until(2317, 0x87) + play_sound(SFX_DISGUISE_ON, -1) + + outro_wait_until(2324, 0x88) + play_sound(SFX_FOOTSTEP_80C4, -1) + + outro_wait_until(2340, 0x7a) + play_sound(SFX_FOOTSTEP_80C7, -1) + + outro_wait_until(2344, 0x7b) + + outro_wait_until(2393, 0x7c) + speak(CHR_P1P2, L_ARK_071, MP3_03FE, CHANNEL_7, COLOR_04_ORANGE) // "I also know who to talk to... Mr. Carrington." + + outro_wait_until(2497, 0x7d) + + beginloop(0x21) + if_camera_animating(/*goto*/ 0x20) + goto_next(0x5d) + label(0x20) + if_controller_button_pressed(/*goto*/ 0x5d) + endloop(0x21) + + label(0x5d) + disable_object(OBJ_JUMPSHIP) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0413_defend_pad[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(10) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_shotlist(AILIST_GENERAL_COMBAT) + + beginloop(0x1f) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x21) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x21) + if_distance_from_target_to_pad_lt(200, PAD_PRESET, /*goto*/ 0x22) + endloop(0x1f) + + label(0x21) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + + label(0x22) + go_to_target_pad(GOPOSFLAG_RUN) + + beginloop(0x23) + if_chr_stopped(/*goto*/ 0x00) + if_can_see_target(/*goto*/ 0x00) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x00) + endloop(0x23) + + label(0x00) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + endlist +}; + +u8 func100f_move_rocket_ammo[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Agent only + label(0x00) + move_object_to_pad(OBJ_ROCKETAMMO1, PAD_ARK_000F) + move_object_to_pad(OBJ_ROCKETAMMO2, PAD_ARK_000D) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_cass_outro[] = { + set_shield(0) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_TECH1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_TECH2, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func0414_init_shock[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(10) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(10) + set_shield(0) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + endlist +}; + +/** + * @unused + */ +u8 func0415_init_10hp[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(10) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) + endlist +}; + +u8 func1012_msg_lockeddown[] = { + beginloop(0x1f) + if_chr_in_room(CHR_BOND, 0x00, 0x0023, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + speak(CHR_BOND, L_ARK_051, SFX_8176, CHANNEL_6, COLOR_09_BLUE) // "They've locked down the ground floor - get to the ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_msg_thatcopter[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x26) + + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_SAID_SURRENDER_OR_DIE, TRUE, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + restart_timer + + beginloop(0x21) + if_timer_gt(300, /*goto*/ 0x20) + endloop(0x21) + + label(0x20) + speak(CHR_BOND, L_ARK_052, SFX_8177, CHANNEL_6, COLOR_09_BLUE) // "That copter needs to be taken out, or the jumpship..." + + label(0x26) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_msg_cantleaveany[] = { + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CANTLEAVEANY_MSG, TRUE, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + if_chr_deadish(CHR_BOND, /*goto*/ 0x26) + restart_timer + + beginloop(0x21) + if_timer_gt(120, /*goto*/ 0x20) + endloop(0x21) + + label(0x20) + if_chr_deadish(CHR_BOND, /*goto*/ 0x26) + speak(CHR_BOND, L_ARK_053, MP3_03AA, CHANNEL_6, COLOR_09_BLUE) // "I can't leave any bodyguards standing." + + label(0x26) + if_chr_deadish(CHR_BOND, /*goto*/ 0x27) + + beginloop(0x5f) + if_chr_deadish(CHR_BOND, /*goto*/ 0x27) + if_sound_finished(CHANNEL_6, /*goto*/ 0x20) + endloop(0x5f) + + label(0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x27) + mute_channel(CHANNEL_6) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_msg_jumpshipwaiting[] = { + beginloop(0x1f) + if_objective_failed(0, /*goto*/ 0x00) + if_objective_failed(1, /*goto*/ 0x00) + if_objective_failed(2, /*goto*/ 0x00) + if_objective_failed(3, /*goto*/ 0x00) + if_objective_failed(4, /*goto*/ 0x00) + if_chr_in_room(CHR_BOND, 0x00, 0x0002, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + speak(CHR_BOND, L_ARK_054, SFX_8178, CHANNEL_6, COLOR_09_BLUE) // "Don't keep the jumpship waiting - get back to the ..." + + label(0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_msg_make_foyer_guards_alerted[] = { + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_ACCESSED_FOYER_ELEVATOR, TRUE, /*goto*/ 0x20) + endloop(0x1f) + + #define if_alive_set_alerted(chr) \ + if_chr_deadish(chr, /*goto*/ 0x20) \ + set_ailist(chr, GAILIST_ALERTED) \ + increase_chr_alertness(100, chr) \ + label(0x20) + + label(0x20) + if_alive_set_alerted(0x01) + if_alive_set_alerted(0x02) + if_alive_set_alerted(0x03) + if_alive_set_alerted(0x04) + if_alive_set_alerted(0x05) + if_alive_set_alerted(0x06) + if_alive_set_alerted(0x07) + if_alive_set_alerted(0x08) + if_alive_set_alerted(0x09) + if_alive_set_alerted(0x0a) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_remove_special_shock[] = { + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_DRCAROLL_ATTACKED, TRUE, /*goto*/ 0x00) + if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) + + if_chr_deadish(0x01, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x02, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x03, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x04, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x05, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x06, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x07, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x08, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x09, /*goto*/ 0x20) + reloop(0x1f) + label(0x20) + + if_chr_deadish(0x0a, /*goto*/ 0x20) + endloop(0x1f) + + label(0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x00) + remove_chr(CHR_SPECIAL_SHOCK) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_give_magnum[] = { + beginloop(0x1f) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED, /*goto*/ 0x00) + endloop(0x1f) + + // Player has been seen - remove Dy357 from shock trooper + label(0x00) + give_object_to_chr(OBJ_DY357, CHR_MRBLONDE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1419_start_lifts[] = { + activate_lift(2, 0x1d) + activate_lift(1, 0x1e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_set_rocketlauncher_flag[] = { + yield + if_difficulty_lt(DIFF_SA, /*goto*/ 0x20) + + // SA and PA + set_object_flag2(OBJ_ROCKETLAUNCHER, OBJFLAG2_AICANNOTUSE) + + label(0x20) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101b_lift_door_sounds[] = { + beginloop(0x8d) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x23, /*goto*/ 0x20) + if_chr_activated_object(CHR_P1P2, 0x27, /*goto*/ 0x5e) + if_chr_activated_object(CHR_P1P2, 0x20, /*goto*/ 0x20) + if_chr_activated_object(CHR_P1P2, 0x24, /*goto*/ 0x25) + if_chr_activated_object(CHR_P1P2, 0x21, /*goto*/ 0x5e) + if_chr_activated_object(CHR_P1P2, 0x25, /*goto*/ 0x26) + if_chr_activated_object(CHR_P1P2, 0x22, /*goto*/ 0x5e) + if_chr_activated_object(CHR_P1P2, 0x26, /*goto*/ 0x5e) + reloop(0x8d) + + label(0x25) + if_door_locked(0x24, 0x01, /*goto*/ 0x5e) + goto_next(0x20) + + label(0x26) + if_door_locked(0x25, 0x01, /*goto*/ 0x5e) + goto_next(0x20) + + label(0x20) + play_sound(SFX_DOOR_81B0, -1) + goto_next(0x00) + + label(0x5e) + play_sound(SFX_MENU_SELECT, -1) + label(0x00) + restart_timer + + beginloop(0x21) + if_timer_gt(120, /*goto*/ 0x00) + endloop(0x21) + + label(0x00) + endloop(0x8d) + + endlist +}; + +u8 func141c_setup_portals[] = { + yield + set_portal_flag(0x008e, PORTALFLAG_SKIP) + set_portal_flag(0x008f, PORTALFLAG_SKIP) + set_portal_flag(0x0084, PORTALFLAG_SKIP) + set_portal_flag(0x0090, PORTALFLAG_SKIP) + set_portal_flag(0x0091, PORTALFLAG_SKIP) + set_portal_flag(0x0093, PORTALFLAG_SKIP) + set_portal_flag(0x0096, PORTALFLAG_SKIP) + set_portal_flag(0x0095, PORTALFLAG_SKIP) + set_portal_flag(0x0099, PORTALFLAG_SKIP) + set_portal_flag(0x00b6, PORTALFLAG_SKIP) + set_portal_flag(0x00bf, PORTALFLAG_SKIP) + set_portal_flag(0x00be, PORTALFLAG_SKIP) + set_portal_flag(0x00c0, PORTALFLAG_SKIP) + set_portal_flag(0x00c2, PORTALFLAG_SKIP) + set_portal_flag(0x00c4, PORTALFLAG_SKIP) + set_portal_flag(0x00c8, PORTALFLAG_SKIP) + set_portal_flag(0x00c7, PORTALFLAG_SKIP) + set_portal_flag(0x00c9, PORTALFLAG_SKIP) + set_portal_flag(0x00cd, PORTALFLAG_SKIP) + set_portal_flag(0x00ce, PORTALFLAG_SKIP) + set_portal_flag(0x00d2, PORTALFLAG_SKIP) + set_portal_flag(0x00e0, PORTALFLAG_SKIP) + set_portal_flag(0x00dc, PORTALFLAG_SKIP) + set_portal_flag(0x00de, PORTALFLAG_SKIP) + set_portal_flag(0x00e3, PORTALFLAG_SKIP) + set_portal_flag(0x00e5, PORTALFLAG_SKIP) + set_portal_flag(0x00e7, PORTALFLAG_SKIP) + set_portal_flag(0x00fb, PORTALFLAG_SKIP) + set_portal_flag(0x00fa, PORTALFLAG_SKIP) + set_portal_flag(0x00fc, PORTALFLAG_SKIP) + set_portal_flag(0x00ff, PORTALFLAG_SKIP) + set_portal_flag(0x0100, PORTALFLAG_SKIP) + set_portal_flag(0x0103, PORTALFLAG_SKIP) + set_portal_flag(0x0102, PORTALFLAG_SKIP) + set_portal_flag(0x0104, PORTALFLAG_SKIP) + set_portal_flag(0x0109, PORTALFLAG_SKIP) + set_portal_flag(0x010c, PORTALFLAG_SKIP) + set_portal_flag(0x0119, PORTALFLAG_SKIP) + set_portal_flag(0x0112, PORTALFLAG_SKIP) + set_portal_flag(0x0117, PORTALFLAG_SKIP) + set_portal_flag(0x0120, PORTALFLAG_SKIP) + set_portal_flag(0x011e, PORTALFLAG_SKIP) + set_portal_flag(0x011c, PORTALFLAG_SKIP) + set_portal_flag(0x0108, PORTALFLAG_SKIP) + set_portal_flag(0x006f, PORTALFLAG_SKIP) + set_portal_flag(0x007d, PORTALFLAG_SKIP) + set_portal_flag(0x0080, PORTALFLAG_SKIP) + set_portal_flag(0x0081, PORTALFLAG_SKIP) + set_portal_flag(0x0075, PORTALFLAG_SKIP) + set_portal_flag(0x0078, PORTALFLAG_SKIP) + set_portal_flag(0x0079, PORTALFLAG_SKIP) + set_portal_flag(0x0006, PORTALFLAG_SKIP) + set_portal_flag(0x0004, PORTALFLAG_SKIP) + set_portal_flag(0x0008, PORTALFLAG_SKIP) + set_portal_flag(0x000a, PORTALFLAG_SKIP) + set_portal_flag(0x0001, PORTALFLAG_SKIP) + set_portal_flag(0x0005, PORTALFLAG_SKIP) + set_portal_flag(0x0000, PORTALFLAG_SKIP) + set_portal_flag(0x0003, PORTALFLAG_SKIP) + set_portal_flag(0x0007, PORTALFLAG_SKIP) + set_portal_flag(0x0013, PORTALFLAG_SKIP) + set_portal_flag(0x0009, PORTALFLAG_SKIP) + set_portal_flag(0x00b1, PORTALFLAG_SKIP) + set_portal_flag(0x00ef, PORTALFLAG_SKIP) + set_portal_flag(0x00ee, PORTALFLAG_SKIP) + set_portal_flag(0x0121, PORTALFLAG_SKIP) + set_portal_flag(0x00e8, PORTALFLAG_SKIP) + set_portal_flag(0x00e9, PORTALFLAG_SKIP) + set_portal_flag(0x00ea, PORTALFLAG_SKIP) + set_portal_flag(0x00ec, PORTALFLAG_SKIP) + set_portal_flag(0x00eb, PORTALFLAG_SKIP) + set_portal_flag(0x00ed, PORTALFLAG_SKIP) + set_portal_flag(0x009d, PORTALFLAG_SKIP) + set_portal_flag(0x00af, PORTALFLAG_SKIP) + set_portal_flag(0x00a1, PORTALFLAG_SKIP) + set_portal_flag(0x005a, PORTALFLAG_SKIP) + set_portal_flag(0x005c, PORTALFLAG_SKIP) + set_portal_flag(0x005d, PORTALFLAG_SKIP) + set_portal_flag(0x0060, PORTALFLAG_SKIP) + set_portal_flag(0x0034, PORTALFLAG_SKIP) + set_portal_flag(0x0030, PORTALFLAG_SKIP) + set_portal_flag(0x002e, PORTALFLAG_SKIP) + set_portal_flag(0x002b, PORTALFLAG_SKIP) + set_portal_flag(0x0028, PORTALFLAG_SKIP) + set_portal_flag(0x0025, PORTALFLAG_SKIP) + set_portal_flag(0x0036, PORTALFLAG_SKIP) + set_portal_flag(0x0038, PORTALFLAG_SKIP) + set_portal_flag(0x004f, PORTALFLAG_SKIP) + set_portal_flag(0x0051, PORTALFLAG_SKIP) + set_portal_flag(0x0052, PORTALFLAG_SKIP) + set_portal_flag(0x0057, PORTALFLAG_SKIP) + set_portal_flag(0x0058, PORTALFLAG_SKIP) + set_portal_flag(0x0031, PORTALFLAG_SKIP) + set_portal_flag(0x002f, PORTALFLAG_SKIP) + set_portal_flag(0x0023, PORTALFLAG_SKIP) + set_portal_flag(0x00a6, PORTALFLAG_SKIP) + set_portal_flag(0x00a3, PORTALFLAG_SKIP) + set_portal_flag(0x00a2, PORTALFLAG_SKIP) + set_portal_flag(0x00a4, PORTALFLAG_SKIP) + set_portal_flag(0x0087, PORTALFLAG_SKIP) + set_portal_flag(0x00b9, PORTALFLAG_SKIP) + set_portal_flag(0x00b4, PORTALFLAG_SKIP) + set_portal_flag(0x00b2, PORTALFLAG_SKIP) + set_portal_flag(0x00b3, PORTALFLAG_SKIP) + set_portal_flag(0x00bd, PORTALFLAG_SKIP) + set_portal_flag(0x00f4, PORTALFLAG_SKIP) + set_portal_flag(0x00f2, PORTALFLAG_SKIP) + set_portal_flag(0x00f0, PORTALFLAG_SKIP) + set_portal_flag(0x00f8, PORTALFLAG_SKIP) + set_portal_flag(0x00f1, PORTALFLAG_SKIP) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func141e_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, TRUE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_setup_rtracker[] = { + yield + set_object_flag3(OBJ_GRENADE, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_DRAGON, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_drcaroll_following, 0x0401 }, + { func0402_start_drcaroll, 0x0402 }, + { func0403_stop_and_idle, 0x0403 }, + { func0404_init_drcaroll, 0x0404 }, + { func0409_tech_conversation, 0x0409 }, + { func040a_tech2, 0x040a }, + { func040b_init_tech1, 0x040b }, + { func040c_init_tech2, 0x040c }, + { func040d_cass, 0x040d }, + { func040e_noop2, 0x040e }, + { func0405_drcaroll_waiting, 0x0405 }, + { func0411_top_guard_blinded, 0x0411 }, + { func0412_outro, 0x0412 }, + { func0414_init_shock, 0x0414 }, + { func0415_init_10hp, 0x0415 }, + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_check_accessed_foyer_elevator, 0x1002 }, + { func1003_check_end_level, 0x1003 }, + { func1004_elevator_unlocking, 0x1004 }, + { func1005_check_bodyguards_dead, 0x1005 }, + { func1006_check_hovercopter_destroyed, 0x1006 }, + { func1007_noop, 0x1007 }, + { func1008_trigger_hovercopter_roof, 0x1008 }, + { func1009_init_top_room, 0x1009 }, + { func100a_lightswitch, 0x100a }, + { func100b_check_top_lights_on, 0x100b }, + { func100c_foyer_lights, 0x100c }, + { func100d_intro, 0x100d }, + { func100e_drcaroll_warnings, 0x100e }, + { func100f_move_rocket_ammo, 0x100f }, + { func100c_foyer_lights_timer, 0x1010 }, + { func040d_cass_necklace, 0x1011 }, + { func1012_msg_lockeddown, 0x1012 }, + { func1013_msg_thatcopter, 0x1013 }, + { func1014_msg_cantleaveany, 0x1014 }, + { func1015_msg_jumpshipwaiting, 0x1015 }, + { func1016_msg_make_foyer_guards_alerted, 0x1016 }, + { func1017_remove_special_shock, 0x1017 }, + { func1018_give_magnum, 0x1018 }, + { func1419_start_lifts, 0x1419 }, + { func101a_set_rocketlauncher_flag, 0x101a }, + { func101b_lift_door_sounds, 0x101b }, + { func141c_setup_portals, 0x141c }, + { func101d_setup_rtracker, 0x101d }, + { func141e_setup_environment, 0x141e }, + { func101f_unlock_top_door, 0x101f }, + { func040d_cass_outro, 0x0407 }, + { func0406_general_combat, 0x0406 }, + { func040f_top_guard, 0x040f }, + { func0410_init_top_guard, 0x0410 }, + { func0413_defend_pad, 0x0413 }, + { func0408_hovercopter, 0x0408 }, + { func100d_intro, 0x0c00 }, + { func0412_outro, 0x0c01 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupash.c b/src/ailists/setupash.c new file mode 100644 index 000000000..db9d59704 --- /dev/null +++ b/src/ailists/setupash.c @@ -0,0 +1,46 @@ +// +// Stage ID 0x2e +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupate.c b/src/ailists/setupate.c new file mode 100644 index 000000000..7803d9f56 --- /dev/null +++ b/src/ailists/setupate.c @@ -0,0 +1,584 @@ +// +// Duel +// + +#include "stagesetup.h" + +// Characters +#define CHR_GUARD 0x00 +#define CHR_JONATHAN 0x01 +#define CHR_TRENT 0x02 + +// Stage flags +#define STAGEFLAG_GUARD_DEAD 0x00000100 +#define STAGEFLAG_JONATHAN_DEAD 0x00000200 +#define STAGEFLAG_TRENT_DEAD 0x00000400 +#define STAGEFLAG_SA_WALK_TRIGGER 0x00000800 +#define STAGEFLAG_PA_WALK_TRIGGER 0x00001000 + +// AI Lists +#define AILIST_MOVE_TO_PAD 0x0401 +#define AILIST_GUARD_COMBAT 0x0402 +#define AILIST_JON_COMBAT 0x0403 +#define AILIST_TRENT_COMBAT 0x0404 +#define AILIST_GUARD_INIT 0x0405 +#define AILIST_JON_INIT 0x0406 +#define AILIST_TRENT_INIT 0x0407 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_ATE_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_ATE_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_ATE_002) + briefing(BRIEFINGTYPE_TEXT_A, L_ATE_003) + + beginobjective(0, L_ATE_004, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Defeat dataDyne guard" + complete_flags(STAGEFLAG_GUARD_DEAD) + endobjective + + beginobjective(1, L_ATE_005, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Defeat Jonathan Dark" + complete_flags(STAGEFLAG_JONATHAN_DEAD) + endobjective + + beginobjective(2, L_ATE_006, (DIFFBIT_PA | DIFFBIT_PD)) // "Defeat Trent Easton" + complete_flags(STAGEFLAG_TRENT_DEAD) + endobjective + + chr(SPAWNFLAG_00000200, 0x00, PAD_ATE_0279, BODY_DDSHOCK, HEAD_RANDOM, AILIST_GUARD_INIT, -1, -1, 100, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2, CHR_GUARD, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FALCON2_SCOPE) + chr(SPAWNFLAG_00000200, 0x01, PAD_ATE_0023, BODY_CISOLDIER, HEAD_JONATHAN, AILIST_JON_INIT, -1, -1, 100, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, CHR_JONATHAN, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + chr(SPAWNFLAG_00000200, 0x02, PAD_ATE_0024, BODY_TRENT, HEAD_TRENT, AILIST_TRENT_INIT, -1, -1, 100, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357TRENT, CHR_TRENT, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357LX) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ATE_0158, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_ATE_0159, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + spawn(PAD_ATE_027A) + intro_weapon(WEAPON_FALCON2_SCOPE, -1) + ammo(AMMOTYPE_PISTOL, 8) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_counterop_setup[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1001_objectives_failed[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1002_first_walk[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + camera_movement(ANIM_CUT_ATE_INTRO_CAM) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + show_hudmsg_middle(0x00, COLOR_02_WHITE, L_ATE_007) // "THE DUEL" + chr_do_animation(ANIM_RELOAD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_GUARD, 2) + label(0x2d) + show_hudmsg(CHR_BOND, L_ATE_012) // "Opponent skill level: AGENT" + + // Wait for camera to stop animating + restart_timer + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x06) + label(0x2d) + endloop(0x08) + + // Start walking + label(0x06) + remove_hudmsgs + revoke_control(CHR_BOND, 0) + enter_firstperson + force_walk(CHR_BOND, 0x0275, 40, 5, 0, 100) + chr_move_to_pad(CHR_GUARD, PAD_ATE_0274, 0x01, /*goto*/ 0x0b) + + // Wait for walk to finish + beginloop(0x0b) + if_force_walk_finished(CHR_BOND, /*goto*/ 0x0c) + endloop(0x0b) + + label(0x0c) + grant_control(CHR_BOND) + set_ailist(CHR_GUARD, AILIST_GUARD_COMBAT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_second_walk[] = { + // Wait until SA walk trigger + beginloop(0x58) + if_chr_dead(CHR_BOND, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_SA_WALK_TRIGGER, TRUE, /*goto*/ 0x06) + endloop(0x58) + + // Begin cutscene + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x06) + revoke_control(CHR_BOND, 0) + camera_movement(ANIM_CUT_ATE_INTRO_CAM) + + // Place chrs + label(0x8f) + set_ailist(CHR_P1P2, AILIST_MOVE_TO_PAD) + chr_move_to_pad(CHR_JONATHAN, PAD_ATE_0279, 0x01, /*goto*/ 0x2d) + yield + goto_first(0x8f) + + label(0x2d) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNEXPLODABLE) + yield + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_GRAB_CROTCH, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 2) + + label(0x2d) + show_hudmsg(CHR_BOND, L_ATE_013) // "Opponent skill level: SPECIAL AGENT" + restart_timer + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x06) + label(0x2d) + endloop(0x08) + + // Start force walk + label(0x06) + label(0x2d) + remove_hudmsgs + revoke_control(CHR_BOND, 0) + enter_firstperson + yield + force_walk(CHR_BOND, 0x0275, 40, 5, 0, 100) + + // Place Jon + call_rng + if_rand_lt(128, /*goto*/ 0x8f) + chr_move_to_pad(CHR_JONATHAN, PAD_ATE_0271, 0x01, /*goto*/ 0x0b) + label(0x8f) + chr_move_to_pad(CHR_JONATHAN, PAD_ATE_0270, 0x01, /*goto*/ 0x0b) + + // Wait for force walk to finish + beginloop(0x0b) + if_force_walk_finished(CHR_BOND, /*goto*/ 0x0c) + endloop(0x0b) + + // Give control back to Jo + label(0x0c) + grant_control(CHR_BOND) + set_ailist(CHR_JONATHAN, AILIST_JON_COMBAT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0401_move_to_pad[] = { + chr_move_to_pad(CHR_SELF, PAD_ATE_027A, 0x01, /*goto*/ 0x06) + label(0x06) + yield + stop_chr + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_third_walk[] = { + // Wait for flag or Jo dying + beginloop(0x58) + if_chr_dead(CHR_BOND, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_PA_WALK_TRIGGER, TRUE, /*goto*/ 0x06) + endloop(0x58) + + // Jo dead + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Do cutscene + label(0x06) + revoke_control(CHR_BOND, 0) + camera_movement(ANIM_CUT_ATE_INTRO_CAM) + + label(0x8f) + set_ailist(CHR_P1P2, AILIST_MOVE_TO_PAD) + chr_move_to_pad(CHR_TRENT, PAD_ATE_0279, 0x01, /*goto*/ 0x2d) + yield + goto_first(0x8f) + + label(0x2d) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_UNEXPLODABLE) + yield + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_HEAD_ROLL, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 2) + label(0x2d) + show_hudmsg(CHR_BOND, L_ATE_014) // "Opponent skill level: PERFECT AGENT" + + // Wait for cutscene to finish + restart_timer + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x06) + label(0x2d) + endloop(0x08) + + // Begin force walk + label(0x06) + remove_hudmsgs + revoke_control(CHR_BOND, 0) + enter_firstperson + force_walk(CHR_BOND, 0x0275, 40, 5, 0, 100) + chr_move_to_pad(CHR_TRENT, PAD_ATE_0272, 0x01, /*goto*/ 0x0b) + + beginloop(0x0b) + if_force_walk_finished(CHR_BOND, /*goto*/ 0x0c) + endloop(0x0b) + + label(0x0c) + set_ailist(CHR_TRENT, AILIST_TRENT_COMBAT) + grant_control(CHR_BOND) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_revoke_control[] = { + yield + revoke_control(CHR_BOND, 0) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_main[] = { + // Wait until guard dead + beginloop(0x04) + if_chr_deadish(CHR_GUARD, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + show_hudmsg(CHR_BOND, L_ATE_009) // "Well done! You were too quick for him!" + set_stage_flag(STAGEFLAG_GUARD_DEAD) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x08) + + // If Agent, return + label(0x2d) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_stage_flag(STAGEFLAG_SA_WALK_TRIGGER) + + // Wait until Jonathan dead + beginloop(0x09) + if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + show_hudmsg(CHR_BOND, L_ATE_010) // "Well done! You were too quick for him!" + set_stage_flag(STAGEFLAG_JONATHAN_DEAD) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x0b) + + // If Special Agent, return + label(0x2d) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_stage_flag(STAGEFLAG_PA_WALK_TRIGGER) + + // Wait until Trent dead + beginloop(0x0c) + if_chr_deadish(CHR_TRENT, /*goto*/ 0x2d) + endloop(0x0c) + + label(0x2d) + show_hudmsg(CHR_BOND, L_ATE_011) // "Well done! You were too quick for him!" + set_stage_flag(STAGEFLAG_TRENT_DEAD) + restart_timer + + beginloop(0x0d) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x0d) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_init_audio[] = { + stop_cutscene_track + stop_ambient_track + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_check_objectives_complete[] = { + // Wait for all objectives complete + beginloop(0x04) + if_all_objectives_complete(/*goto*/ 0x2d) + endloop(0x04) + + // Wait 3 seconds + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x08) + + // End level + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_guard_combat[] = { + set_shotlist(AILIST_GUARD_COMBAT) + if_just_injured(CHR_SELF, /*goto*/ 0x03) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PERFECTACCURACY) + + // Wait 2 seconds or for guard to come into view + restart_timer + + beginloop(0x04) + if_timer_gt(120, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x2d) + endloop(0x04) + + // Guard has come into view. Jump sideways. + label(0x2d) + try_sidestep(/*goto*/ 0x08) + + beginloop(0x08) + if_distance_to_target_lt(250, /*goto*/ 0x0e) + if_chr_stopped(/*goto*/ 0x03) + endloop(0x08) + + // Guard has been shot, or finished jump + beginloop(0x03) + if_distance_to_target_lt(250, /*goto*/ 0x0e) + if_can_see_target(/*goto*/ 0x06) + reloop(0x03) + + // 2 seconds have passed without seeing guard, or guard has been shot + label(0x06) + if_chr_dead(CHR_TARGET, /*goto*/ 0x2e) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2d) + label(0x2d) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + // Finished shooting + label(0x06) + endloop(0x03) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Hand combat + label(0x0e) + set_returnlist(CHR_SELF, AILIST_TRENT_COMBAT) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + endlist +}; + +u8 func0403_jon_combat[] = { + set_shotlist(AILIST_JON_COMBAT) + if_just_injured(CHR_SELF, /*goto*/ 0x58) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PERFECTACCURACY) + restart_timer + + beginloop(0x04) + if_timer_gt(240, /*goto*/ 0x58) + if_nearly_in_targets_sight(30, /*goto*/ 0x58) + endloop(0x04) + + label(0x58) + try_run_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_distance_to_target_lt(250, /*goto*/ 0x0e) + if_can_see_attack_target(/*goto*/ 0x06) + reloop(0x08) + + label(0x06) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2d) + label(0x2d) + try_attack_roll(/*goto*/ 0x0c) + try_attack_kneel(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + endloop(0x58) + + label(0x0e) + set_returnlist(CHR_SELF, AILIST_JON_COMBAT) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0404_trent_combat[] = { + set_shotlist(AILIST_TRENT_COMBAT) + if_just_injured(CHR_SELF, /*goto*/ 0x03) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PERFECTACCURACY) + restart_timer + + beginloop(0x04) + if_timer_gt(120, /*goto*/ 0x03) + if_chr_in_view(/*goto*/ 0x03) + endloop(0x04) + + // Wait until player in sight or in close range + beginloop(0x03) + if_distance_to_target_lt(250, /*goto*/ 0x0e) + if_can_see_target(/*goto*/ 0x06) + reloop(0x03) + + // Attack + label(0x06) + if_chr_dead(CHR_TARGET, /*goto*/ 0x2e) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2d) + label(0x2d) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + endloop(0x03) + + // Hand combat + label(0x0e) + set_returnlist(CHR_SELF, AILIST_TRENT_COMBAT) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0405_guard_init[] = { + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + // @bug: The value for set_accuracy is interpreted as a signed byte, + // so 200 is interpreted as -56 which reduces the chr's accuracy. + // However this isn't an issue because the chr has CHRHFLAG_PERFECTACCURACY. + // This bug is repeated for Jon and Trent below. + set_accuracy(200) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 20) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0406_jon_init[] = { + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + set_accuracy(200) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0407_trent_init[] = { + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + set_accuracy(200) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_counterop_setup, 0x1000 }, + { func1001_objectives_failed, 0x1001 }, + { func1002_first_walk, 0x1002 }, + { func1003_init_audio, 0x1003 }, + { func1004_revoke_control, 0x1004 }, + { func1005_main, 0x1005 }, + { func1006_check_objectives_complete, 0x1006 }, + { func1007_second_walk, 0x1007 }, + { func1008_third_walk, 0x1008 }, + { func0401_move_to_pad, 0x0401 }, + { func0402_guard_combat, 0x0402 }, + { func0403_jon_combat, 0x0403 }, + { func0404_trent_combat, 0x0404 }, + { func0405_guard_init, 0x0405 }, + { func0406_jon_init, 0x0406 }, + { func0407_trent_init, 0x0407 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupazt.c b/src/ailists/setupazt.c new file mode 100644 index 000000000..bdf8bd9c7 --- /dev/null +++ b/src/ailists/setupazt.c @@ -0,0 +1,2145 @@ +// +// Crash Site +// + +#include "stagesetup.h" + +// Characters +enum chrnum { + CHR_ELVIS, + CHR_TRENT, +#if VERSION >= VERSION_NTSC_1_0 + CHR_TRENT_OUTRO, +#endif + CHR_MRBLONDE, + CHR_SKEDAR, + CHR_PRESIDENT, + CHR_PRESIDENT_OUTRO, + CHR_07, + CHR_PRES_CLONE, + CHR_09, + CHR_0A, + CHR_0B, + CHR_0C, + CHR_0D, + CHR_0E, + CHR_0F, + CHR_10, + CHR_11, + CHR_12, + CHR_13, + CHR_14, + CHR_15, + CHR_16, + CHR_17, + CHR_18, + CHR_19, + CHR_1A, + CHR_1B, + CHR_1C, + CHR_1D, + CHR_1E, + CHR_1F, + CHR_20, + CHR_21, + CHR_22, + CHR_23, + CHR_24, + CHR_25, + CHR_ROBOT1, + CHR_ROBOT2, + CHR_ROBOT3, + CHR_ROBOT4, + CHR_2A, + CHR_2B, + CHR_2C, + CHR_2D, + CHR_2E, + CHR_2F, + CHR_30, + CHR_31, + CHR_32, + CHR_33, + CHR_34, + CHR_35, + CHR_36, + CHR_37, + CHR_ELVIS_OUTRO +}; + +// Objects +#define OBJ_CRATE 0x00 +#define OBJ_ESCAPEPOD 0x01 +#define OBJ_MEDICALSCANNER 0x02 +#define OBJ_SKEDAR_SHUTTLE 0x03 +#define OBJ_PROXYMINE 0x08 +#define OBJ_HOVERBIKE 0x09 + +// Stage flags +#define STAGEFLAG_BEACON_ACTIVATED 0x00000100 +#define STAGEFLAG_ESCAPEPOD_DESTROYED 0x00000200 +#define STAGEFLAG_SKEDAR_SHUTTLE_DESTROYED 0x00000400 +#define STAGEFLAG_PRESIDENT_DEAD 0x00000800 +#define STAGEFLAG_PRESIDENT_RESCUED 0x00001000 +#define STAGEFLAG_CLONE_DEAD 0x00002000 +#define STAGEFLAG_TRIGGER_PRESIDENT_RUNNING 0x00004000 +#define STAGEFLAG_TRENT_RUNNING 0x00008000 +#define STAGEFLAG_ELVIS_GAVE_PROXYMINE 0x00010000 +#define STAGEFLAG_OUTRO_STARTED 0x00020000 + +// AI Lists +#define AILIST_OUTRO 0x0402 +#define AILIST_INIT_ELVIS 0x0403 +#define AILIST_ELVIS 0x0404 +#define AILIST_INIT_STRIPES 0x0406 +#define AILIST_INIT_BLONDE 0x0407 +#define AILIST_SPAWNER 0x0414 +#define AILIST_SPAWNED_GUARD 0x0416 +#define AILIST_INIT_ROBOT 0x0417 +#define AILIST_ROBOT 0x0418 +#define AILIST_INIT_PRESIDENT 0x041b +#define AILIST_PRESIDENT_WAITING 0x041c +#define AILIST_PRESIDENT_RUNNING 0x041d +#define AILIST_TRENT_WAITING 0x041e +#define AILIST_TRENT_SHOOTING 0x041f +#define AILIST_TRENT_RUNNING 0x0420 +#define AILIST_STARTING_AREA_GUARD 0x0421 +#define AILIST_HIDE 0x0422 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_AZT_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_AZT_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_AZT_002) + briefing(BRIEFINGTYPE_TEXT_A, L_AZT_003) + + beginobjective(0, L_AZT_005, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Retrieve Presidential medical scanner" + require_object_collected(OBJ_MEDICALSCANNER) + endobjective + + beginobjective(1, L_AZT_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Activate distress beacon" + complete_flags(STAGEFLAG_BEACON_ACTIVATED) + fail_flags(STAGEFLAG_ESCAPEPOD_DESTROYED) + endobjective + + beginobjective(2, L_AZT_007, (DIFFBIT_PA | DIFFBIT_PD)) // "Shut down enemy jamming device" + complete_flags(STAGEFLAG_SKEDAR_SHUTTLE_DESTROYED) + endobjective + + beginobjective(3, L_AZT_008, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Retire Presidential clone" + complete_flags(STAGEFLAG_CLONE_DEAD) + endobjective + + beginobjective(4, L_AZT_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate and rescue President" + complete_flags(STAGEFLAG_PRESIDENT_RESCUED) + fail_flags(STAGEFLAG_PRESIDENT_DEAD) + endobjective + + tag(0x09, 1) + hoverbike(0x0100, MODEL_HOVBIKE, PAD_AZT_0000, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_GEOCYL, 1000) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_ELVIS, PAD_AZT_0106, BODY_THEKING, HEAD_ELVIS, AILIST_INIT_ELVIS, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANPISTOL, CHR_ELVIS, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_PHOENIX) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_ELVIS_OUTRO, PAD_AZT_011F, BODY_THEKING, HEAD_ELVIS, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_ELVIS_OUTRO, PAD_AZT_011F, BODY_THEKING, HEAD_ELVIS, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRMAIANPISTOL, CHR_ELVIS_OUTRO, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_PHOENIX) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_PRESIDENT_OUTRO, PAD_AZT_0110, BODY_PRESIDENT, HEAD_PRESIDENT, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, CHR_TRENT_OUTRO, PAD_AZT_010E, BODY_TRENT, HEAD_TRENT, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_NONCOMBAT, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357TRENT, CHR_TRENT_OUTRO, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357LX) +#else + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_PRESIDENT_OUTRO, PAD_AZT_0110, BODY_PRESIDENT, HEAD_PRESIDENT, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + chr(SPAWNFLAG_00000200, CHR_09, PAD_AZT_005A, BODY_STRIPES, HEAD_RANDOM, 0x0408, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_09, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_0A, PAD_AZT_0059, BODY_STRIPES, HEAD_RANDOM, 0x0408, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_0A, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_0B, PAD_AZT_0058, BODY_MRBLONDE, HEAD_MRBLONDE, 0x0408, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, CHR_0B, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_00000200, CHR_0C, PAD_AZT_00D1, BODY_STRIPES, HEAD_RANDOM, 0x0409, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_0C, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_0D, PAD_AZT_00D4, BODY_STRIPES, HEAD_RANDOM, 0x0409, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_0D, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_0E, PAD_AZT_00D5, BODY_MRBLONDE, HEAD_MRBLONDE, 0x0409, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, CHR_0E, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_00000200, CHR_13, PAD_AZT_004C, BODY_STRIPES, HEAD_RANDOM, 0x040a, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_13, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_14, PAD_AZT_005F, BODY_STRIPES, HEAD_RANDOM, 0x040b, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_14, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_15, PAD_AZT_004D, BODY_STRIPES, HEAD_RANDOM, 0x040c, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_15, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_16, PAD_AZT_0055, BODY_STRIPES, HEAD_RANDOM, 0x040d, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_16, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_17, PAD_AZT_0081, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_17, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_18, PAD_AZT_0079, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_18, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_19, PAD_AZT_007B, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_19, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_1A, PAD_AZT_007C, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_1A, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_1B, PAD_AZT_016B, BODY_STRIPES, HEAD_RANDOM, 0x040e, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_1B, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_1C, PAD_AZT_016C, BODY_STRIPES, HEAD_RANDOM, 0x040f, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_1C, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_1D, PAD_AZT_0048, BODY_STRIPES, HEAD_RANDOM, 0x0410, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_1D, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_1E, PAD_AZT_017E, BODY_STRIPES, HEAD_RANDOM, 0x0411, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_1E, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_1F, PAD_AZT_0177, BODY_STRIPES, HEAD_RANDOM, 0x0412, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_1F, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_20, PAD_AZT_0189, BODY_STRIPES, HEAD_RANDOM, 0x0413, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_20, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, CHR_ROBOT1, PAD_AZT_01BB, BODY_CHICROB, 0x00, AILIST_INIT_ROBOT, -1, -1, 1000, 50, CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(0, CHR_ROBOT2, PAD_AZT_01BC, BODY_CHICROB, 0x00, AILIST_INIT_ROBOT, -1, -1, 1000, 50, CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(0, CHR_ROBOT3, PAD_AZT_01BD, BODY_CHICROB, 0x00, AILIST_INIT_ROBOT, -1, -1, 1000, 50, CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(0, CHR_ROBOT4, PAD_AZT_01BE, BODY_CHICROB, 0x00, AILIST_INIT_ROBOT, -1, -1, 1000, 50, CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, CHR_TRENT, PAD_AZT_01B5, BODY_TRENT, HEAD_TRENT, AILIST_TRENT_WAITING, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357TRENT, CHR_TRENT, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357LX) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_RTRACKED | SPAWNFLAG_BLUESIGHT, CHR_PRESIDENT, PAD_AZT_01B6, BODY_PRESIDENT, HEAD_PRESIDENT, AILIST_INIT_PRESIDENT, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_RTRACKED, CHR_PRES_CLONE, PAD_AZT_0086, BODY_PRESIDENT_CLONE2, HEAD_PRESIDENT, 0x041a, -1, -1, 1000, 20, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_09, -1, 0, 2, 0, 20, 0) + chr(SPAWNFLAG_00000200, CHR_2A, PAD_AZT_0088, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_INIT_BLONDE, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_09, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_2A, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_2B, PAD_AZT_0087, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_INIT_BLONDE, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_09, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_2B, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_2C, PAD_AZT_0085, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_INIT_BLONDE, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_09, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_2C, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_2D, PAD_AZT_019E, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_INIT_BLONDE, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_0A, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_2D, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_2E, PAD_AZT_018E, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_INIT_BLONDE, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_0A, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_2E, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_2F, PAD_AZT_01A7, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_INIT_BLONDE, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_0A, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_2F, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, CHR_30, PAD_AZT_002D, BODY_STRIPES, HEAD_RANDOM, AILIST_SPAWNER, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_30, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, CHR_31, PAD_AZT_0029, BODY_STRIPES, HEAD_RANDOM, AILIST_SPAWNER, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_31, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_32, PAD_AZT_009A, BODY_STRIPES, HEAD_RANDOM, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_32, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_33, PAD_AZT_009B, BODY_STRIPES, HEAD_RANDOM, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_33, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_34, PAD_AZT_01B7, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, CHR_34, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_00000200, CHR_35, PAD_AZT_0004, BODY_STRIPES, HEAD_RANDOM, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, CHR_35, PAD_AZT_01B8, BODY_STRIPES, HEAD_RANDOM, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN | CHRFLAG0_NOHEAR, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRAVENGER, CHR_35, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, CHR_36, PAD_AZT_01B9, BODY_STRIPES, HEAD_RANDOM, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_BACKOFF | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, CHR_36, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_00000200, CHR_37, PAD_AZT_0012, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, CHR_37, PAD_AZT_01BA, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_STARTING_AREA_GUARD, -1, -1, 100, 13, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN | CHRFLAG0_NOHEAR, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSNIPERRIFLE, CHR_37, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(0, CHR_MRBLONDE, PAD_AZT_0121, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, CHR_SKEDAR, PAD_AZT_012F, BODY_SKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + tag(0x00, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x01, 1) + stdobject(0x0100, MODEL_PRESCAPSULE, PAD_AZT_01D8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_00000100, OBJFLAG3_INTERACTABLE, 12000) + tag(0x03, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_00000100 | OBJFLAG2_REMOVEWHENDESTROYED, 0, 12500) + tag(0x02, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_AZT_000C, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PLAYERUNDROPPABLE, WEAPON_PRESIDENTSCANNER) + autogun(0x0100, MODEL_GROUNDGUN, PAD_AZT_0043, OBJFLAG_00000001, 0, 0, 4000, 0x003d, 0x00020000, 0xfffe0000, 0x0000016c, 0x001e0000) + autogun(0x0100, MODEL_GROUNDGUN, PAD_AZT_003B, OBJFLAG_00000001, 0, 0, 4000, 0x0038, 0x00020000, 0xfffe0000, 0x0000016c, 0x001e0000) + tag(0x06, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_AZT_0106, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x07, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_AZT_0090, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x08, 1) +#if VERSION >= VERSION_NTSC_1_0 + weapon(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_AZT_0106, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, WEAPON_PROXIMITYMINE) +#else + weapon(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_AZT_000C, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, WEAPON_PROXIMITYMINE) +#endif + pad_effect(PADEFFECT_SPARKS, 0x000001db) + pad_effect(PADEFFECT_SMOKE, 0x000001dc) + pad_effect(PADEFFECT_SPARKS, 0x000001dd) + pad_effect(PADEFFECT_SPARKS, 0x000001de) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_SNOW) + intro_weapon(WEAPON_FALCON2_SCOPE, -1) + ammo(AMMOTYPE_PISTOL, 50) + ammo(AMMOTYPE_RIFLE, 100) + intro_weapon(WEAPON_REMOTEMINE, -1) + ammo(AMMOTYPE_REMOTE_MINE, 3) + intro_weapon(WEAPON_NIGHTVISION, -1) + intro_weapon(WEAPON_HORIZONSCANNER, -1) + spawn(PAD_AZT_00B8) + endintro +}; + +s32 path00[] = { + PAD_AZT_0059, + PAD_AZT_0096, + PAD_AZT_0095, + PAD_AZT_0094, + PAD_AZT_00BE, + PAD_AZT_00BD, + PAD_AZT_009E, + -1, +}; + +s32 path01[] = { + PAD_AZT_00D1, + PAD_AZT_00D2, + PAD_AZT_00D3, + PAD_AZT_00B1, + PAD_AZT_00CD, + PAD_AZT_00A6, + PAD_AZT_00B3, + PAD_AZT_00C3, + -1, +}; + +s32 path02[] = { + PAD_AZT_004C, + PAD_AZT_0057, + PAD_AZT_005E, + PAD_AZT_005D, + PAD_AZT_005B, + PAD_AZT_005F, + -1, +}; + +s32 path03[] = { + PAD_AZT_005F, + PAD_AZT_005B, + PAD_AZT_005C, + PAD_AZT_005D, + PAD_AZT_0066, + PAD_AZT_005D, + PAD_AZT_005C, + PAD_AZT_005B, + -1, +}; + +s32 path04[] = { + PAD_AZT_004D, + PAD_AZT_0051, + PAD_AZT_0050, + PAD_AZT_0053, + PAD_AZT_0054, + PAD_AZT_0056, + PAD_AZT_006E, + -1, +}; + +s32 path05[] = { + PAD_AZT_0055, + PAD_AZT_0052, + PAD_AZT_0054, + PAD_AZT_0056, + PAD_AZT_006E, + -1, +}; + +s32 path06[] = { + PAD_AZT_0030, + PAD_AZT_002F, + PAD_AZT_0167, + PAD_AZT_0166, + PAD_AZT_0165, + PAD_AZT_0164, + PAD_AZT_016A, + PAD_AZT_0169, + PAD_AZT_016B, + -1, +}; + +s32 path07[] = { + PAD_AZT_016C, + PAD_AZT_016D, + PAD_AZT_016E, + PAD_AZT_016F, + PAD_AZT_0170, + PAD_AZT_0171, + PAD_AZT_0172, + PAD_AZT_0173, + -1, +}; + +s32 path08[] = { + PAD_AZT_0048, + PAD_AZT_0049, + PAD_AZT_004A, + PAD_AZT_0182, + PAD_AZT_0183, + PAD_AZT_0180, + PAD_AZT_0181, + -1, +}; + +s32 path09[] = { + PAD_AZT_017E, + PAD_AZT_017F, + PAD_AZT_017B, + PAD_AZT_017C, + PAD_AZT_017D, + PAD_AZT_0034, + -1, +}; + +s32 path10[] = { + PAD_AZT_0177, + PAD_AZT_0175, + PAD_AZT_0176, + PAD_AZT_0189, + -1, +}; + +s32 path11[] = { + PAD_AZT_0189, + PAD_AZT_0188, + PAD_AZT_0187, + PAD_AZT_0186, + PAD_AZT_0185, + PAD_AZT_0184, + -1, +}; + +s32 path12[] = { + PAD_AZT_0106, + PAD_AZT_0107, + PAD_AZT_00F6, + PAD_AZT_0104, + -1, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, + { path10, 10, 0 }, + { path11, 11, 0 }, + { path12, 12, 0 }, + { NULL, 0, 0 }, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_PRES_CLONE, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1011_setup_snow[] = { + enable_snow(TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_CRASHSITE_INTRO) + camera_movement(ANIM_CUT_AZT_INTRO_CAM) + cmd0175(60) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_hudpiece_visible(CHR_BOND, TRUE) + + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 300) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x65) \ + if_timer_gt(time, /*goto*/ 0x08) \ + endloop(loopid) \ + label(0x08) + + wait_until(724, 0x69) + speak(CHR_BOND, L_AZT_032, MP3_0759, CHANNEL_10, COLOR_09_BLUE) // "Ahhh... uuhhhh..." + + wait_until(830, 0x6a) + speak(CHR_BOND, L_AZT_034, MP3_0457, CHANNEL_10, COLOR_06_WHITE) // "Agent Dark! Please report!" + + wait_until(980, 0x6b) + speak(CHR_BOND, L_AZT_033, MP3_075A, CHANNEL_10, COLOR_09_BLUE) // "Ahhh... uhh... owww..." + + wait_until(1030, 0x6c) + speak(CHR_BOND, L_AZT_035, MP3_0458, CHANNEL_10, COLOR_06_WHITE) // "Perfect Dark, come in!" + + wait_until(1152, 0x6e) + speak(CHR_BOND, L_AZT_036, MP3_0459, CHANNEL_10, COLOR_09_BLUE) // "A-agent Dark reporting in..." + + wait_until(1372, 0x6f) + speak(CHR_BOND, L_AZT_037, MP3_045A, CHANNEL_10, COLOR_06_WHITE) // "Agent Dark! Please reply!" + + wait_until(1610, 0x6d) + speak(CHR_BOND, L_AZT_038, MP3_045B, CHANNEL_10, COLOR_09_BLUE) // "Something's jamming my transmissions... It's comin..." + + wait_until(1875, 0x70) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_10, COLOR_00_GREEN) + + wait_until(1900, 0x71) + speak(CHR_BOND, -1, SFX_FOOTSTEP_818A, CHANNEL_10, COLOR_00_GREEN) + + wait_until(1926, 0x72) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8188, CHANNEL_7, COLOR_00_GREEN) + + wait_until(1958, 0x73) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_10, COLOR_00_GREEN) + + wait_until(2000, 0x74) + speak(CHR_BOND, L_AZT_039, MP3_045C, CHANNEL_10, COLOR_09_BLUE) // "I'd better find the jamming device and check that ..." + + wait_until(2116, 0x75) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8188, CHANNEL_7, COLOR_00_GREEN) + + wait_until(2168, 0x76) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8187, CHANNEL_6, COLOR_00_GREEN) + + wait_until(2224, 0x78) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + + wait_until(2305, 0x79) + speak(CHR_BOND, -1, SFX_01DB, CHANNEL_5, COLOR_00_GREEN) + + wait_until(2392, 0x7a) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_7, COLOR_00_GREEN) + + wait_until(2412, 0x7b) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8187, CHANNEL_6, COLOR_00_GREEN) + + wait_until(2460, 0x7c) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8188, CHANNEL_7, COLOR_00_GREEN) + + wait_until(2513, 0x7d) + speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_6, COLOR_00_GREEN) + + wait_until(2685, 0x7e) + speak(CHR_BOND, -1, SFX_FOOTSTEP_818A, CHANNEL_7, COLOR_00_GREEN) + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x31) + goto_next(0x65) + + label(0x31) + if_controller_button_pressed(/*goto*/ 0x65) + label(0x31) + endloop(0x0a) + + label(0x65) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_10) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + stop_cutscene_track + stop_ambient_track + set_chr_hudpiece_visible(CHR_BOND, FALSE) + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_outro_from_menu[] = { + set_ailist(CHR_PRESIDENT_OUTRO, GAILIST_IDLE) + set_ailist(CHR_MRBLONDE, GAILIST_IDLE) + set_ailist(CHR_SKEDAR, GAILIST_IDLE) + set_ailist(CHR_ELVIS_OUTRO, GAILIST_IDLE) +#if VERSION >= VERSION_NTSC_FINAL + set_ailist(CHR_TRENT_OUTRO, GAILIST_IDLE) +#endif + disable_chr(CHR_ROBOT1) + disable_chr(CHR_ROBOT2) + disable_chr(CHR_ROBOT3) + disable_chr(CHR_ROBOT4) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func0402_outro[] = { + set_stage_flag(STAGEFLAG_OUTRO_STARTED) + disable_object(OBJ_HOVERBIKE) + set_ailist(CHR_PRESIDENT, GAILIST_IDLE) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x31) + set_target_chr(CHR_BOND) + goto_next(0x08) + label(0x31) + set_target_chr(CHR_COOP) + label(0x08) + camera_movement(ANIM_CUT_AZT_OUTRO_CAM) + play_cutscene_track(MUSIC_CRASHSITE_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_ailist(CHR_TARGET, GAILIST_IDLE) + + remove_chr(CHR_ELVIS) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + + set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_PRESIDENT, GAILIST_IDLE) + + set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) + + set_chr_chrflag(CHR_SKEDAR, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_SKEDAR, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR, 4) + + set_chr_chrflag(CHR_ELVIS_OUTRO, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_ELVIS_OUTRO, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS_OUTRO, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS_OUTRO, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS_OUTRO, 4) + +#if VERSION >= VERSION_NTSC_1_0 + set_chr_chrflag(CHR_TRENT_OUTRO, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TRENT_OUTRO, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TRENT_OUTRO, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TRENT_OUTRO, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT_OUTRO, 4) +#else + set_chr_chrflag(CHR_TRENT, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TRENT, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 4) +#endif + + set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MRBLONDE, 4) + + set_chr_chrflag(CHR_PRESIDENT_OUTRO, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_PRESIDENT_OUTRO, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_PRESIDENT_OUTRO, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_PRESIDENT_OUTRO, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_AZT_OUTRO_PRES, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_PRESIDENT_OUTRO, 4) + + enable_object(0x00) + set_object_flag2(OBJ_CRATE, OBJFLAG2_04000000) + set_object_flag3(OBJ_CRATE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_AZT_OUTRO_CRATE, OBJ_CRATE, 0x04, 0xffff) + restart_timer + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + set_cutscene_weapon(CHR_ELVIS_OUTRO, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS_OUTRO, WEAPON_HAMMER, WEAPON_NONE) + show_nonessential_chrs(FALSE) + + wait_until(146, 0x69) + play_sound(SFX_0594, CHANNEL_7) + + wait_until(200, 0x6a) + play_sound(SFX_0595, CHANNEL_6) + + wait_until(248, 0x6b) + speak(CHR_BOND, L_AZT_040, MP3_045D, CHANNEL_10, COLOR_09_BLUE) // "How are you feeling, Mr. President?" + + wait_until(414, 0x6c) + speak(CHR_BOND, L_AZT_041, MP3_045E, CHANNEL_10, COLOR_08_RED) // "Better now, young lady. Today, I think, will take ..." + + wait_until(490, 0x6e) + play_sound(SFX_0596, CHANNEL_5) + + wait_until(526, 0x6f) + play_sound(SFX_0597, CHANNEL_7) + + wait_until(578, 0x6d) + play_sound(SFX_0427, CHANNEL_6) + + wait_until(1078, 0x71) + play_sound(SFX_0596, CHANNEL_5) + + wait_until(1116, 0x72) + play_sound(SFX_0597, CHANNEL_7) + + wait_until(1200, 0x70) + speak(CHR_BOND, L_AZT_042, MP3_045F, CHANNEL_10, COLOR_09_BLUE) // "Just one thing, sir? What is the Pelagic II that T..." + + wait_until(1474, 0x74) + play_sound(SFX_ELVIS_HEHE, CHANNEL_5) + play_sound(SFX_00F8, CHANNEL_10) + + wait_until(1490, 0x75) + play_sound(SFX_0596, CHANNEL_7) + + wait_until(1492, 0x76) + play_sound(SFX_0594, CHANNEL_6) + + wait_until(1556, 0x77) + play_sound(SFX_00F8, CHANNEL_10) + + wait_until(1626, 0x73) + speak(CHR_BOND, L_AZT_043, MP3_0460, CHANNEL_10, COLOR_08_RED) // "It's a U.S. government deep sea research vessel, o..." + + wait_until(1807, 0x79) + play_sound(SFX_0595, CHANNEL_7) + + wait_until(1850, 0x7a) + play_sound(SFX_0597, CHANNEL_6) + + wait_until(1872, 0x7c) + play_sound(SFX_0595, CHANNEL_7) + + wait_until(2074, 0x7d) + play_sound(SFX_0594, CHANNEL_6) + + wait_until(2270, 0x7e) + play_sound(SFX_0596, CHANNEL_5) + + wait_until(2286, 0x7f) + play_sound(SFX_FOOTSTEP_818A, CHANNEL_7) + + wait_until(2296, 0x80) + play_sound(SFX_FOOTSTEP_8189, CHANNEL_6) + + wait_until(2316, 0x81) + play_sound(SFX_FOOTSTEP_8187, CHANNEL_5) + + wait_until(2335, 0x82) + play_sound(SFX_FOOTSTEP_8188, CHANNEL_7) + + wait_until(2450, 0x7b) + speak(CHR_BOND, L_AZT_044, MP3_0461, CHANNEL_10, COLOR_09_BLUE) // "Trent has a lot to answer for, but I don't think w..." + + wait_until(3150, 0x83) + speak(CHR_BOND, L_AZT_045, MP3_0462, CHANNEL_10, COLOR_03_RED) // "You have failed, Easton. You are a flawed device, ..." + + wait_until(3380, 0x88) + play_sound(SFX_FOOTSTEP_818A, CHANNEL_7) + + wait_until(3580, 0x87) + speak(CHR_BOND, L_AZT_046, MP3_0463, CHANNEL_10, COLOR_05_GREEN) // "Just try it, you Scandinavian freak!" + + wait_until(3747, 0x84) + play_sound(SFX_FOOTSTEP_8189, CHANNEL_5) + + wait_until(3875, 0x85) + play_sound(SFX_FOOTSTEP_8188, CHANNEL_7) + + wait_until(4054, 0x86) + play_sound(SFX_05A0, CHANNEL_5) + play_sound(SFX_CLOAK_OFF, CHANNEL_10) + set_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_CLOAKED) + + wait_until(4100, 0x95) + unset_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_CLOAKED) + play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) + + wait_until(4200, 0x78) + speak(CHR_BOND, L_AZT_047, MP3_0464, CHANNEL_10, COLOR_05_GREEN) // "Noooooooo!!!" + + wait_until(4240, 0x93) + play_sound(SFX_05C0, CHANNEL_10) + + wait_until(4296, 0x89) + play_sound(SFX_007D, CHANNEL_6) + + wait_until(4444, 0x8a) + play_sound(SFX_05A0, CHANNEL_5) + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until(4506, 0x8b) + play_sound(SFX_05A1, CHANNEL_7) + + wait_until(4544, 0x96) + set_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_CLOAKED) + + wait_until(4566, 0x8c) + play_sound(SFX_CLOAK_ON, CHANNEL_10) + unset_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_CLOAKED) + + wait_until(4576, 0x8d) + + wait_until(4622, 0x8e) + play_sound(SFX_FOOTSTEP_8187, CHANNEL_7) + + wait_until(4678, 0x8f) + play_sound(SFX_FOOTSTEP_8188, CHANNEL_7) + + wait_until(4752, 0x90) + play_sound(SFX_FOOTSTEP_8189, CHANNEL_7) + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x31) + goto_next(0x65) + + label(0x31) + if_controller_button_pressed(/*goto*/ 0x65) + label(0x31) + endloop(0x0a) + + label(0x65) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0407_init_blonde[] = { + set_accuracy(20) + set_reaction_speed(55) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(60) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0406_init_stripes[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(16) + set_reaction_speed(55) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1003_msg_therestheescapepod[] = { + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 1000, PAD_AZT_01D8, /*goto*/ 0x31) + endloop(0x06) + + label(0x31) + speak(CHR_P1P2, L_AZT_010, MP3_03CC, CHANNEL_6, COLOR_09_BLUE) // "There's the escape pod." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_msg_maybetheresabeacon[] = { + restart_timer + beginloop(0x06) + endloop(0x06) + + // Unreachable + label(0x31) + speak(CHR_BOND, L_AZT_011, MP3_03CD, CHANNEL_6, COLOR_09_BLUE) // "Maybe there's a beacon in there." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_msg_thejamming[] = { +#if VERSION >= VERSION_NTSC_1_0 + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0f) +#endif + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) +#if VERSION >= VERSION_NTSC_1_0 + if_objective_complete(2, /*goto*/ 0x0f) +#endif + if_chr_in_room(CHR_P1P2, 0x00, 0x0029, /*goto*/ 0x31) + endloop(0x06) + + label(0x31) + speak(CHR_P1P2, L_AZT_012, MP3_03CE, CHANNEL_6, COLOR_09_BLUE) // "The jamming... It's coming from that ship." +#if VERSION >= VERSION_NTSC_1_0 + label(0x0f) +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_msg_elvisbeable[] = { + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 1000, PAD_AZT_0105, /*goto*/ 0x31) + endloop(0x06) + + label(0x31) + speak(CHR_P1P2, L_AZT_013, MP3_03CF, CHANNEL_6, COLOR_09_BLUE) // "Elvis... He'll be able to protect the President." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_path(pathid, function) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(16) \ + set_reaction_speed(55) \ + set_chr_maxdamage(CHR_SELF, 60) \ + add_health_or_armor(0) \ + set_recovery_speed(30) \ + set_shield(0) \ + set_returnlist(CHR_SELF, function) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + +u8 func0408_start_path00[] = { + init_path(0, 0x0408) + endlist +}; + +u8 func0409_start_path01[] = { + init_path(1, 0x0409) + endlist +}; + +u8 func040a_start_path02[] = { + init_path(2, 0x040a) + endlist +}; + +u8 func040b_start_path03[] = { + init_path(3, 0x040b) + endlist +}; + +u8 func040c_start_path04[] = { + init_path(4, 0x040c) + endlist +}; + +u8 func040d_start_path05[] = { + init_path(5, 0x040d) + endlist +}; + +u8 func040e_start_path06[] = { + init_path(6, 0x040e) + endlist +}; + +u8 func040f_start_path07[] = { + init_path(7, 0x040f) + endlist +}; + +u8 func0410_start_path08[] = { + init_path(8, 0x0410) + endlist +}; + +u8 func0411_start_path09[] = { + init_path(9, 0x0411) + endlist +}; + +u8 func0412_start_path10[] = { + init_path(10, 0x0412) + endlist +}; + +u8 func0413_start_path11[] = { + init_path(11, 0x0413) + endlist +}; + +/** + * This function is unfinished. Target labels don't exist. + * + * Looks like it was intended to be a spawning function. + */ +u8 unregistered_function1[] = { + label(0x66) + restart_timer + + beginloop(0x67) + if_timer_lt(1800, /*goto*/ 0x98) + label(0x31) + if_num_chrs_in_squadron_gt(1, 0x0f, /*goto*/ 0x98) + call_rng + if_rand_gt(64, /*goto*/ 0x69) + if_rand_gt(128, /*goto*/ 0x6a) + if_rand_gt(196, /*goto*/ 0x6b) + label(0x98) + endloop(0x67) + + label(0x68) + yield + rebuild_teams + rebuild_squadrons + goto_first(0x66) + + endlist +}; + +u8 func0415_unused[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(16) + set_reaction_speed(55) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x00000000, /*goto*/ 0x08) + label(0x08) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_squadron(SQUADRON_0F) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +u8 func100c_spawn_dd_guards[] = { + label(0x66) + restart_timer + + beginloop(0x67) + if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) + if_stage_flag_eq(STAGEFLAG_ELVIS_GAVE_PROXYMINE, TRUE, /*goto*/ 0x31) + if_objective_complete(0, /*goto*/ 0x31) + if_objective_complete(1, /*goto*/ 0x31) + if_objective_complete(2, /*goto*/ 0x31) + if_objective_complete(3, /*goto*/ 0x31) + if_objective_complete(4, /*goto*/ 0x31) + endloop(0x67) + + label(0x31) + if_timer_lt(3600, /*goto*/ 0x98) + label(0x31) + if_num_chrs_in_squadron_gt(1, 0x0e, /*goto*/ 0x98) + call_rng + if_rand_gt(64, /*goto*/ 0x69) + if_rand_gt(128, /*goto*/ 0x6a) + if_rand_gt(196, /*goto*/ 0x6b) + + // 1 + if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) + try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_0126, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) + goto_next(0x98) + + // 2 + label(0x69) + if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) + try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_00E5, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) + goto_next(0x98) + + // 3 + label(0x6a) + if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) + try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_0130, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) + goto_next(0x98) + + // 4 + label(0x6b) + if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) + try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_00FD, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) + goto_next(0x98) + + // Spawn failed + label(0x98) + goto_first(0x67) + + // Spawn worked + label(0x68) + if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) + yield + rebuild_teams + rebuild_squadrons + goto_first(0x66) + + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0416_spawned_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(16) + set_reaction_speed(55) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x00000000, /*goto*/ 0x08) + label(0x08) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_squadron(SQUADRON_0E) + rebuild_teams + rebuild_squadrons + // Pad is next to UFO + run_to_pad(PAD_AZT_0105) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1008_escapepod[] = { + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_ESCAPEPOD, /*goto*/ 0x31) + + // Pod destroyed + mute_channel(CHANNEL_0) + show_hudmsg(CHR_BOND, L_AZT_015) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_ESCAPEPOD_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Pod healthy + label(0x31) + if_stage_flag_eq(STAGEFLAG_BEACON_ACTIVATED, TRUE, /*goto*/ 0x08) + if_chr_activated_object(CHR_P1P2, OBJ_ESCAPEPOD, /*goto*/ 0x31) + label(0x08) + reloop(0x06) + + label(0x31) + assign_sound(SFX_8115, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_ESCAPEPOD, 1, 800, 1600) + show_hudmsg(CHR_P1P2, L_AZT_014) // "Distress beacon has been activated." + set_stage_flag(STAGEFLAG_BEACON_ACTIVATED) + endloop(0x06) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_check_shuttle_destroyed[] = { + yield + yield + yield + yield + yield + + beginloop(0x06) + if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x31) + show_hudmsg(CHR_BOND, L_AZT_021) // "Jamming device has been shut down." + set_stage_flag(STAGEFLAG_SKEDAR_SHUTTLE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x31) + endloop(0x06) + + endlist +}; + +u8 func100a_check_president_dead[] = { + beginloop(0x06) + if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x31) + endloop(0x06) + + label(0x31) + show_hudmsg(CHR_BOND, L_AZT_022) // "President has been killed." + set_stage_flag(STAGEFLAG_PRESIDENT_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_clone_dead[] = { + beginloop(0x06) + if_chr_deadish(CHR_PRES_CLONE, /*goto*/ 0x31) + endloop(0x06) + + label(0x31) + show_hudmsg(CHR_BOND, L_AZT_023) // "Presidential clone has been eliminated." + set_stage_flag(STAGEFLAG_CLONE_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0403_init_elvis[] = { + set_shield(100) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_accuracy(100) + set_reaction_speed(100) + add_health_or_armor(1000) + set_chr_maxdamage(CHR_SELF, 1000) + set_self_chrflag(CHRCFLAG_RUNFASTER) + assign_path(12) + start_patrol + set_ailist(CHR_SELF, AILIST_ELVIS) + endlist +}; + +u8 func0404_elvis[] = { + set_shotlist(AILIST_ELVIS) + label(0x04) + restart_timer + + beginloop(0x06) + if_chr_idle(/*goto*/ 0x31) + if_patrolling(/*goto*/ 0x31) + restart_timer + start_patrol + label(0x31) + set_target_chr(CHR_BOND) + set_chrpreset(CHR_BOND) + if_stage_flag_eq(STAGEFLAG_ELVIS_GAVE_PROXYMINE, TRUE, /*goto*/ 0x31) + if_objective_complete(0, /*goto*/ 0x31) + if_objective_complete(1, /*goto*/ 0x31) + if_objective_complete(2, /*goto*/ 0x31) + if_objective_complete(3, /*goto*/ 0x31) + if_objective_complete(4, /*goto*/ 0x31) + if_can_see_target(/*goto*/ 0xa5) + set_target_chr(CHR_COOP) + set_chrpreset(CHR_COOP) + if_can_see_target(/*goto*/ 0xa5) + label(0x31) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + if_timer_gt(600, /*goto*/ 0x0b) + endloop(0x06) + + // 10 seconds passed + label(0x0b) + call_rng + if_rand_gt(128, /*goto*/ 0x31) + + // 50% chance of doing look around animation + call_rng + if_rand_lt(64, /*goto*/ 0x99) + if_rand_lt(128, /*goto*/ 0x9a) + if_rand_lt(196, /*goto*/ 0x9b) + + set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + chr_do_animation(ANIM_LOOK_AROUND_025B, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x31) + + label(0x99) + chr_do_animation(ANIM_LOOK_AROUND_025C, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x31) + + label(0x9a) + chr_do_animation(ANIM_LOOK_AROUND_025D, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x31) + + label(0x9b) + chr_do_animation(ANIM_LOOK_AROUND_025E, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + label(0x31) + goto_first(0x04) + + // Detected enemy + label(0x0a) + set_returnlist(CHR_SELF, AILIST_INIT_ELVIS) + set_shotlist(AILIST_INIT_ELVIS) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // Sees player + label(0xa5) + set_target_chr(CHR_PRESET) + try_run_to_target(/*goto*/ 0x12) + + beginloop(0x12) + if_distance_to_target_lt(300, /*goto*/ 0x13) + if_timer_gt(180, /*goto*/ 0x08) + endloop(0x12) + + // Running towards player for 3 seconds - check if can still see player + label(0x08) + if_can_see_target(/*goto*/ 0x31) + goto_first(0x04) + + label(0x31) + goto_first(0xa5) + + // Close to player + label(0x13) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_AZT_031, MP3_02E2, CHANNEL_6, COLOR_04_ORANGE) // "Take this; you should find it useful!" + give_object_to_chr(OBJ_PROXYMINE, CHR_TARGET) + + beginloop(0x14) + if_sound_finished(CHANNEL_6, /*goto*/ 0x31) + endloop(0x14) + + label(0x31) + stop_chr + set_stage_flag(STAGEFLAG_ELVIS_GAVE_PROXYMINE) + goto_first(0x04) + + endlist +}; + +u8 func0405_unused[] = { + jog_to_pad(PAD_AZT_0107) + beginloop(0x06) + endloop(0x06) + + endlist +}; + +u8 func0417_init_robot[] = { + set_accuracy(40) + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_chr_maxdamage(CHR_SELF, 250) + set_ailist(CHR_SELF, AILIST_ROBOT) + endlist +}; + +u8 func0418_robot[] = { + set_shotlist(AILIST_ROBOT) + label(0x66) + set_self_chrflag(CHRCFLAG_00040000) + if_chr_dead(CHR_SELF, /*goto*/ 0x11) + if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x11) + if_chr_knockedout(CHR_SELF, /*goto*/ 0x08) + goto_next(0x04) + label(0x08) + yield + damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) + goto_first(0x66) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0d) + if_target_in_sight(/*goto*/ 0x0d) + call_rng + if_rand_gt(5, /*goto*/ 0x31) + if_sound_finished(CHANNEL_5, /*goto*/ 0x08) + goto_next(0x31) + + // Make random noise + label(0x08) + call_rng + if_rand_lt(86, /*goto*/ 0x0b) + if_rand_lt(172, /*goto*/ 0x0c) + assign_sound(SFX_046A, CHANNEL_5) + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) + goto_next(0x31) + label(0x0b) + assign_sound(SFX_046B, CHANNEL_5) + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) + goto_next(0x31) + label(0x0c) + assign_sound(SFX_046C, CHANNEL_5) + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) + label(0x31) + endloop(0x04) + + // Alerted + label(0x0d) + increase_squadron_alertness(100) + restart_timer + if_distance_to_target_lt(300, /*goto*/ 0x31) + if_distance_to_target_gt(1000, /*goto*/ 0x15) + if_target_in_sight(/*goto*/ 0x13) + + // Distance > 1000 or not in sight + label(0x15) + try_jog_to_target(/*goto*/ 0x08) + + // Distance < 300 + label(0x31) + stop_chr + + label(0x08) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x0a) + say_quip(CHR_BOND, 0x1f, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + + beginloop(0x0a) + if_timer_gt(180, /*goto*/ 0x08) + if_distance_to_target_gt(1000, /*goto*/ 0x15) + if_target_in_sight(/*goto*/ 0x13) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x13) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + label(0x15) + endloop(0x0a) + + // Player in sight + label(0x13) + set_target_chr(CHR_P1P2) + restart_timer + try_attack_stand(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0e) + goto_first(0x04) + + beginloop(0x0e) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x0e) + + label(0x08) + goto_first(0x0d) + + label(0x11) + assign_sound(MP3_ROBOT_ALERT_UNDER_ATTACK, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to two stripes guards. + */ +u8 func0414_spawner[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x0a) + // Room 0x0029 is the skedar shuttle area + if_chr_in_room(CHR_P1P2, 0x00, 0x0029, /*goto*/ 0x0a) + reloop(0x06) + + label(0x0a) + label(0x31) + if_never_been_onscreen(/*goto*/ 0x52) + if_can_see_target(/*goto*/ 0x0a) + endloop(0x06) + + label(0x0a) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(0x52) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x52) + set_ailist(CHR_SELF, AILIST_SPAWNER) + + label(0x52) + try_spawn_clone2(CHR_SELF, GAILIST_ALERTED, 0, /*goto*/ 0x31) + set_ailist(CHR_SELF, AILIST_SPAWNER) + + label(0x31) + yield + set_ailist(CHR_SELF, AILIST_SPAWNER) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0419_unused[] = { + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0422_hide[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041a_pres_clone[] = { + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_self_chrflag(CHRCFLAG_RUNFASTER) + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x31) + if_target_outside_my_yvisang(/*goto*/ 0x08) + if_target_in_sight(/*goto*/ 0x31) + label(0x08) + endloop(0x06) + + // Alert, or player in sight and looking at clone + label(0x31) + run_to_pad(PAD_AZT_002C) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x31) + endloop(0x0a) + + label(0x31) + stop_chr + + label(0xa5) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x31) + endloop(0x10) + + label(0x31) + goto_first(0xa5) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041b_init_president[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_chr_maxdamage(CHR_SELF, 300) + set_shield(0) + set_ailist(CHR_SELF, AILIST_PRESIDENT_WAITING) + endlist +}; + +u8 func041c_president_waiting[] = { + set_shotlist(AILIST_PRESIDENT_WAITING) + if_chr_deadish(CHR_SELF, /*goto*/ 0x08) + goto_next(0x31) + + // Dying + label(0x08) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x31) + stop_chr + yield + + // Wait until trigger and can see player + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_PRESIDENT_RUNNING, TRUE, /*goto*/ 0x31) + goto_first(0x06) + + label(0x31) + if_can_see_target(/*goto*/ 0x31) + endloop(0x06) + + label(0x31) + set_shotlist(AILIST_PRESIDENT_RUNNING) + set_ailist(CHR_SELF, AILIST_PRESIDENT_RUNNING) + endlist +}; + +u8 func041d_president_running[] = { + set_self_chrflag(CHRCFLAG_PUSHABLE) + set_alertness(100) + set_shotlist(AILIST_PRESIDENT_RUNNING) + yield + if_chr_deadish(CHR_SELF, /*goto*/ 0x08) + goto_next(0x31) + + // Dying + label(0x08) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x9c) + if_timer_gt(15, /*goto*/ 0x08) + endloop(0x9c) + + label(0x08) + assign_sound(MP3_02BF, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x31) + if_just_injured(CHR_SELF, /*goto*/ 0x08) + goto_next(0x9d) + + // Injured + label(0x08) + restart_timer + assign_sound(MP3_02C2, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + + beginloop(0x9e) + if_num_times_shot_lt(1, /*goto*/ 0x08) + if_timer_lt(20, /*goto*/ 0x08) + label(0x08) + if_chr_stopped(/*goto*/ 0x9d) + endloop(0x9e) + + // Main logic + label(0x9d) + stop_chr + restart_timer + + beginloop(0x9f) + // Room 0x0014 = UFO area + // Yes, checking this 5 times is unnecessary + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_can_see_target(/*goto*/ 0x08) + goto_next(0xa0) + + label(0x08) + if_timer_gt(1250, /*goto*/ 0x31) + if_distance_to_target_gt(200, /*goto*/ 0xa0) + endloop(0x9f) + + // 20.8 seconds passed + // Pointless RNG check + label(0x31) + call_rng + if_rand_lt(64, /*goto*/ 0x31) + goto_first(0x9d) + label(0x31) + goto_first(0x9d) + + // Sees player + label(0x08) + goto_first(0x9d) + + // Can't see player, or distance > 200 + label(0xa0) + restart_timer + label(0x31) + if_distance_to_target_gt(300, /*goto*/ 0x31) + try_jog_to_target(/*goto*/ 0xa1) + label(0x31) + try_run_to_target(/*goto*/ 0xa1) + + beginloop(0xa1) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_distance_to_target_lt(100, /*goto*/ 0xa2) + if_chr_stopped(/*goto*/ 0xa2) + if_timer_gt(360, /*goto*/ 0x31) + endloop(0xa1) + + // 6 seconds passed while running + label(0x31) + goto_first(0xa0) + + // Unreachable + label(0x08) + goto_first(0xa0) + + // Next to player + label(0xa2) + goto_first(0x9d) + + // Unreachable + label(0xa3) + try_run_to_target(/*goto*/ 0xa4) + + // Unreachable + beginloop(0xa4) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) + endloop(0xa4) + + // Unreachable + label(0xa6) + goto_first(0x9d) + + // Jo is near UFO + label(0xa5) + run_to_pad(PAD_AZT_0105) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + stop_chr +#if VERSION >= VERSION_NTSC_1_0 + set_chr_team(CHR_SELF, TEAM_NONCOMBAT) + rebuild_teams + rebuild_squadrons +#endif + if_stage_flag_eq(STAGEFLAG_PRESIDENT_RESCUED, TRUE, /*goto*/ 0x31) + show_hudmsg(CHR_TARGET, L_AZT_025) // "President has been rescued." + set_stage_flag(STAGEFLAG_PRESIDENT_RESCUED) + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_check_robots_left[] = { + beginloop(0x06) + if_chr_deadish(CHR_ROBOT1, /*goto*/ 0x31) + if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) + goto_next(0x31) + label(0x08) + reloop(0x06) + + label(0x31) + if_chr_deadish(CHR_ROBOT2, /*goto*/ 0x31) + if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) + goto_next(0x31) + label(0x08) + reloop(0x06) + + label(0x31) + if_chr_deadish(CHR_ROBOT3, /*goto*/ 0x31) + if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) + goto_next(0x31) + label(0x08) + reloop(0x06) + + label(0x31) + if_chr_deadish(CHR_ROBOT4, /*goto*/ 0x31) + if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) + if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) + goto_next(0x31) + label(0x08) + reloop(0x06) + + label(0x31) + if_stage_flag_eq(STAGEFLAG_TRENT_RUNNING, TRUE, /*goto*/ 0x31) + goto_first(0x06) + + label(0x31) + set_stage_flag(STAGEFLAG_TRIGGER_PRESIDENT_RUNNING) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041e_trent_waiting[] = { + set_accuracy(0) + set_self_chrflag(CHRCFLAG_00000040) + set_shield(100) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x08) + endloop(0x06) + + label(0x08) + restart_timer + speak(CHR_P1P2, L_AZT_024, MP3_02CA, CHANNEL_6, COLOR_05_GREEN) // "You'll never save him now!" + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + set_ailist(CHR_SELF, AILIST_TRENT_SHOOTING) + endlist +}; + +u8 func041f_trent_shooting[] = { + label(0x04) + stop_chr + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x31) + if_target_in_sight(/*goto*/ 0x08) + endloop(0x06) + + label(0x31) + set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) + + label(0x08) + label(0xa8) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0xa7) + label(0xa7) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) + goto_next(0x31) + + // Shoot worked + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + goto_next(0x0b) + + // Unreachable + if_chr_dead(CHR_TARGET, /*goto*/ 0x0b) + goto_first(0x04) + + // Shoot failed + label(0x31) + goto_first(0x04) + + label(0x0b) + restart_timer + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0c) + if_timer_gt(120, /*goto*/ 0x08) + endloop(0x0c) + + label(0x08) + set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) + endlist +}; + +u8 func0420_trent_running[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_stage_flag(STAGEFLAG_TRENT_RUNNING) + restart_timer + run_to_pad(PAD_AZT_0027) + + beginloop(0x0a) + if_timer_gt(300, /*goto*/ 0x31) + endloop(0x0a) + + label(0x31) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x31) + goto_next(0x08) + + label(0x31) + if_chr_stopped(/*goto*/ 0x08) + goto_first(0x0a) + + // Player not in sight, or Trent has reached his destination + label(0x08) + if_nearly_in_targets_sight(30, /*goto*/ 0x31) + goto_next(0x08) + + label(0x31) + goto_first(0x0a) + + // Player definitely not in sight + label(0x08) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_check_end_level[] = { + beginloop(0x0a) + if_all_objectives_complete(/*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x31) + endloop(0x0b) + + label(0x31) + if_chr_deadish(CHR_BOND, /*goto*/ 0x31) + goto_next(0x08) + + label(0x31) + if_chr_deadish(CHR_COOP, /*goto*/ 0x31) + + // Jo or Velvet alive + label(0x08) + if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x32) + set_ailist(CHR_PRESIDENT, GAILIST_STOP_AND_IDLE) + + if_chr_deadish(CHR_BOND, /*goto*/ 0x31) + goto_next(0x08) + + // Both players dead + label(0x31) + if_chr_deadish(CHR_COOP, /*goto*/ 0x31) + goto_next(0x08) + + label(0x31) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x08) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + + // President dead + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to 4 stripes and 2 blondes near the starting area. + */ +u8 func0421_starting_area_guard[] = { + label(0x0a) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +u8 func1010_set_cave_lights[] = { + yield + set_lights_state(ROOM_AZT_0064, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0063, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0062, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0061, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0060, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_005F, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_005E, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_005D, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_005C, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_005B, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_005A, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0059, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0053, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0058, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(ROOM_AZT_0056, LIGHTOP_1, 0x06, 0x00, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_give_medicalscanner[] = { + yield + if_difficulty_gt(DIFF_A, /*goto*/ 0x31) + give_object_to_chr(OBJ_MEDICALSCANNER, CHR_BOND) + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_setup_rtracker[] = { + yield + set_object_flag3(OBJ_PROXYMINE, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_hide_hoverbike[] = { + yield + if_savefile_flag_is_set(GAMEFILEFLAG_CRASHSITE_BIKE, /*goto*/ 0x08) + disable_object(OBJ_HOVERBIKE) + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_setup_skedar_shuttle[] = { + yield + enable_object(OBJ_SKEDAR_SHUTTLE) + set_object_flag3(OBJ_SKEDAR_SHUTTLE, OBJFLAG3_00000010) + object_set_modelpart_visible(OBJ_SKEDAR_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + object_do_animation(ANIM_0486, OBJ_SKEDAR_SHUTTLE, 0x01, 0xffff) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1415_setup_environment[] = { + yield + configure_environment(ROOM_AZT_0001, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0001, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0009, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_000A, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_000A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_000B, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_000B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_000C, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_000C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_000D, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_000D, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_000E, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_000E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_000F, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_000F, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0016, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0018, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0019, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_001A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_001B, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_001B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_001C, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_001C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_001D, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_001E, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_001E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0025, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0026, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0028, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0029, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_002A, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_002A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_002B, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_002B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_002C, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_002C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_002E, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_002E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_002F, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_002F, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0030, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0031, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0032, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0033, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0035, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0036, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0038, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_003A, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_003A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_003B, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_003B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_003C, AIENVCMD_ROOM_SETAMBIENT, TRUE) +#if VERSION >= VERSION_NTSC_1_0 + configure_environment(ROOM_AZT_003C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) +#else + configure_environment(ROOM_AZT_003C_2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_003C_2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) +#endif + configure_environment(ROOM_AZT_003D, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_003D, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_003E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(ROOM_AZT_003F, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(ROOM_AZT_0065, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_msg_therestheescapepod, 0x1003 }, + { func1004_msg_maybetheresabeacon, 0x1004 }, + { func1005_msg_thejamming, 0x1005 }, + { func1006_msg_elvisbeable, 0x1006 }, + { func1008_escapepod, 0x1008 }, + { func1009_check_shuttle_destroyed, 0x1009 }, + { func100a_check_president_dead, 0x100a }, + { func100b_check_clone_dead, 0x100b }, + { func100c_spawn_dd_guards, 0x100c }, + { func100e_check_robots_left, 0x100e }, + { func100f_check_end_level, 0x100f }, + { func1010_set_cave_lights, 0x1010 }, + { func1011_setup_snow, 0x1011 }, + { func1012_give_medicalscanner, 0x1012 }, + { func1013_setup_rtracker, 0x1013 }, + { func1014_setup_skedar_shuttle, 0x1014 }, + { func1415_setup_environment, 0x1415 }, + { func1016_hide_hoverbike, 0x1016 }, + { func1002_intro, 0x0401 }, + { func0402_outro, 0x0402 }, + { func0403_init_elvis, 0x0403 }, + { func0404_elvis, 0x0404 }, + { func0405_unused, 0x0405 }, + { func1002_intro, 0x0c00 }, + { func0402_outro_from_menu, 0x0c01 }, + { func0406_init_stripes, 0x0406 }, + { func0407_init_blonde, 0x0407 }, + { func0408_start_path00, 0x0408 }, + { func0409_start_path01, 0x0409 }, + { func040a_start_path02, 0x040a }, + { func040b_start_path03, 0x040b }, + { func040c_start_path04, 0x040c }, + { func040d_start_path05, 0x040d }, + { func040e_start_path06, 0x040e }, + { func040f_start_path07, 0x040f }, + { func0410_start_path08, 0x0410 }, + { func0411_start_path09, 0x0411 }, + { func0412_start_path10, 0x0412 }, + { func0413_start_path11, 0x0413 }, + { func0414_spawner, 0x0414 }, + { func0415_unused, 0x0415 }, + { func0416_spawned_guard, 0x0416 }, + { func0417_init_robot, 0x0417 }, + { func0418_robot, 0x0418 }, + { func0419_unused, 0x0419 }, + { func041a_pres_clone, 0x041a }, + { func041c_president_waiting, 0x041c }, + { func041b_init_president, 0x041b }, + { func041d_president_running, 0x041d }, + { func041e_trent_waiting, 0x041e }, + { func041f_trent_shooting, 0x041f }, + { func0420_trent_running, 0x0420 }, + { func0421_starting_area_guard, 0x0421 }, + { func0422_hide, 0x0422 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupcat.c b/src/ailists/setupcat.c new file mode 100644 index 000000000..d4be4efe4 --- /dev/null +++ b/src/ailists/setupcat.c @@ -0,0 +1,38 @@ +// +// Stage ID 0x28 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupcave.c b/src/ailists/setupcave.c new file mode 100644 index 000000000..1fcddaad7 --- /dev/null +++ b/src/ailists/setupcave.c @@ -0,0 +1,4405 @@ +// +// Air Base +// + +#include "stagesetup.h" + +// Characters +#define CHR_STEWARDESS 0x38 +#define CHR_SECRETARY 0x39 +#define CHR_OFFICE1 0x3c +#define CHR_OFFICE2 0x3d +#define CHR_TRENT 0x47 +#define CHR_OUTRO_NSA 0x49 + +// Objects +#define OBJ_BRIEFCASE1 0x00 +#define OBJ_CONSOLE 0x01 +#define OBJ_UNIFORM 0x02 +#define OBJ_FLIGHTPLANS 0x03 +#define OBJ_BAGGAGE_CARRIER 0x04 +#define OBJ_LASER_PANEL 0x05 +#define OBJ_BRIEFCASE2 0x06 +#define OBJ_ALARM 0x19 +#define OBJ_SAFE_SWITCH 0x1a +#define OBJ_SAFE_SWITCH_COVER 0x1f +#define OBJ_VERTICAL_LIFT 0x21 // the one leading to the plane - not briefcase office +#define OBJ_REMOTEMINE 0x2b +#define OBJ_SAFEDOOR 0x2d +#define OBJ_PLANE 0x2e +#define OBJ_DIAGONAL_LIFT 0x36 + +// Stage flags +#define STAGEFLAG_SECURITY_SHUT_DOWN 0x00000100 +#define STAGEFLAG_STEWARDESS_ENTERED_BASE 0x00000200 +#define STAGEFLAG_CIVILIANS_KILLED 0x00000400 +#define STAGEFLAG_DISGUISE_UNCOVERED 0x00000800 +#define STAGEFLAG_DISGUISED 0x00001000 +#define STAGEFLAG_RECEPTIONIST_CALLED_SECURITY 0x00002000 +#define STAGEFLAG_SUITCASE_DEPOSITED 0x00004000 +#define STAGEFLAG_WEAPONS_DETECTED 0x00008000 +#define STAGEFLAG_SUITCASE_SCANNED 0x00010000 +#define STAGEFLAG_BOARDED_PLANE 0x00020000 +#define STAGEFLAG_LASERS_OVERLOADED 0x00040000 +#define STAGEFLAG_TOO_MANY_NEUTRALS_KILLED 0x00080000 +#define STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE 0x00100000 +#define STAGEFLAG_OFFICE1_DEAD 0x00200000 +#define STAGEFLAG_OFFICE2_DEAD 0x00400000 +#define STAGEFLAG_DISGUISED2 0x00800000 +#define STAGEFLAG_SECRETARY_DEAD 0x01000000 +#define STAGEFLAG_CONSOLE_DESTROYED 0x02000000 +#define STAGEFLAG_ENTERED_BASE 0x04000000 +#define STAGEFLAG_TROLLEY_SHUT_DOWN_WITHOUT_BRIEFCASE 0x08000000 +#define STAGEFLAG_CONSOLE_ACTIVATED 0x10000000 + +// AI Lists +#define AILIST_INIT_STRIPES 0x0402 +#define AILIST_BECOME_UNALERTED 0x0406 +#define AILIST_STEWARDESS 0x0407 +#define AILIST_SECRETARY 0x0408 +#define AILIST_OFFICE1 0x0409 +#define AILIST_OFFICE2 0x040a +#define AILIST_INIT_SECRETARY 0x040c +#define AILIST_INIT_OFFICE1 0x040d +#define AILIST_INIT_OFFICE2 0x040e +#define AILIST_NSA 0x040f +#define AILIST_TAKEOVER_LACKEY 0x0411 +#define AILIST_INIT_TAKEOVER_LACKEY 0x0412 +#define AILIST_ALASKAN_CONSOLE_GUARD 0x0413 +#define AILIST_OFFICEWORKER 0x0414 +#define AILIST_ALASKAN_MOUNTAINLIFT_GUARD 0x0415 +#define AILIST_REMOVE_OR_UNALERT 0x0417 +#define AILIST_REMOVE_OR_COWER 0x0418 +#define AILIST_DRAW_MAGNUM 0x041a +#define AILIST_INIT_ALASKAN_GUARD 0x0426 +#define AILIST_INIT_POSTTAKEOVER_GUARD 0x0427 +#define AILIST_POSTTAKEOVER_GUARD 0x0428 +#define AILIST_FOYER_SPAWNER 0x042a +#define AILIST_INIT_FOYER_CLONE 0x042b +#define AILIST_FOYER_CLONE 0x042c + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_CAVE_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_CAVE_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_CAVE_002) + briefing(BRIEFINGTYPE_TEXT_A, L_CAVE_003) + + beginobjective(0, L_CAVE_005, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Obtain disguise and enter base" + complete_flags(STAGEFLAG_DISGUISED2) + complete_flags(STAGEFLAG_ENTERED_BASE) + fail_flags(STAGEFLAG_CIVILIANS_KILLED) + fail_flags(STAGEFLAG_DISGUISE_UNCOVERED) + fail_flags(STAGEFLAG_STEWARDESS_ENTERED_BASE) + fail_flags(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY) + fail_flags(STAGEFLAG_TOO_MANY_NEUTRALS_KILLED) + fail_flags(STAGEFLAG_SECRETARY_DEAD) + endobjective + + beginobjective(1, L_CAVE_006, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Check in equipment" + complete_flags(STAGEFLAG_SUITCASE_DEPOSITED) + fail_flags(STAGEFLAG_WEAPONS_DETECTED) + fail_flags(STAGEFLAG_TROLLEY_SHUT_DOWN_WITHOUT_BRIEFCASE) + endobjective + + beginobjective(2, L_CAVE_007, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Subvert security monitoring system" + complete_flags(STAGEFLAG_SECURITY_SHUT_DOWN) + fail_flags(STAGEFLAG_SUITCASE_SCANNED) + fail_flags(STAGEFLAG_CONSOLE_DESTROYED) + endobjective + + beginobjective(3, L_CAVE_008, (DIFFBIT_PA | DIFFBIT_PD)) // "Obtain flight plans from safe" + require_object_collected(OBJ_FLIGHTPLANS) + endobjective + + beginobjective(4, L_CAVE_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Board Air Force One" + complete_flags(STAGEFLAG_BOARDED_PLANE) + endobjective + + chr(SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME, 0x00, PAD_CAVE_00C8, BODY_ALASKAN_GUARD, HEAD_RANDOM, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0000, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME, 0x01, PAD_CAVE_00D0, BODY_ALASKAN_GUARD, HEAD_RANDOM, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 7, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_BLUESIGHT, 0x38, PAD_CAVE_00D1, BODY_STEWARDESS_COAT, HEAD_ANKA, GAILIST_IDLE, -1, -1, 200, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 7, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME, 0x02, PAD_CAVE_00D3, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_ALASKAN_MOUNTAINLIFT_GUARD, 0x0135, -1, 200, 20, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 2, 0, 7, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME, 0x03, PAD_CAVE_0012, BODY_ALASKAN_GUARD, HEAD_RANDOM, 0x041b, 0x0135, -1, 200, 15, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 2, 0, 5, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME, 0x04, PAD_CAVE_00CA, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, 0x0135, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME, 0x05, PAD_CAVE_00CB, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, 0x0135, -1, 200, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0005, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x07, PAD_CAVE_00C7, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, -1, -1, 200, 14, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x06, PAD_CAVE_00E8, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, -1, -1, 200, 14, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x39, PAD_CAVE_00C9, BODY_SECRETARY, HEAD_SECRETARY, AILIST_INIT_SECRETARY, -1, -1, 200, 14, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x3c, PAD_CAVE_00C6, BODY_OFFICEWORKER, HEAD_RANDOM, AILIST_INIT_OFFICE1, -1, -1, 200, 8, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_05, 0x24, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x3d, PAD_CAVE_00C5, BODY_OFFICEWORKER, HEAD_RANDOM, AILIST_INIT_OFFICE2, -1, -1, 200, 8, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_05, 0x25, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x08, PAD_CAVE_00C3, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x09, PAD_CAVE_0031, BODY_ALASKAN_GUARD, HEAD_RANDOM, 0x041c, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x10, PAD_CAVE_003A, BODY_NSA_LACKEY, HEAD_RANDOM, AILIST_NSA, 0x003a, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_PUNCHAIEXTRADAMAGE, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0a, PAD_CAVE_003D, BODY_ALASKAN_GUARD, HEAD_RANDOM, 0x041d, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0b, PAD_CAVE_005B, BODY_ALASKAN_GUARD, HEAD_RANDOM, 0x041e, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x11, PAD_CAVE_0072, BODY_NSA_LACKEY, HEAD_RANDOM, AILIST_NSA, 0x0072, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_PUNCHAIEXTRADAMAGE, TEAM_ENEMY, SQUADRON_05, -1, 0, 1, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x0c, PAD_CAVE_00C2, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_ALASKAN_CONSOLE_GUARD, 0x0156, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 5, 0, 0) + chr(SPAWNFLAG_00000200, 0x12, PAD_CAVE_00C1, BODY_NSA_LACKEY, HEAD_RANDOM, AILIST_INIT_TAKEOVER_LACKEY, -1, -1, 200, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PUNCHAIEXTRADAMAGE, TEAM_ENEMY, SQUADRON_06, -1, 0, 2, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + tag(0x30, 2) + tag(0x31, 2) + weapon(0x0100, MODEL_CHRDY357, 0x0012, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_DY357MAGNUM) + weapon(0x0100, MODEL_CHRDY357, 0x0012, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_DY357MAGNUM) + link_guns(-1, -2) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0d, PAD_CAVE_00C0, BODY_ALASKAN_GUARD, HEAD_RANDOM, 0x041f, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0e, PAD_CAVE_00BF, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x3a, PAD_CAVE_00BE, BODY_OFFICEWORKER, HEAD_RANDOM, AILIST_OFFICEWORKER, -1, -1, 200, 4, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0f, PAD_CAVE_00BC, BODY_ALASKAN_GUARD, HEAD_RANDOM, AILIST_INIT_ALASKAN_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x13, PAD_CAVE_00BA, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x14, PAD_CAVE_0123, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x16, PAD_CAVE_0124, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x18, PAD_CAVE_0125, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x1a, PAD_CAVE_0126, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x1c, PAD_CAVE_0127, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x1b, PAD_CAVE_0090, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x19, PAD_CAVE_008E, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x1d, PAD_CAVE_0096, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x1e, PAD_CAVE_0128, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x20, PAD_CAVE_0129, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x21, PAD_CAVE_00B4, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x22, PAD_CAVE_012A, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x23, PAD_CAVE_00B2, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x24, PAD_CAVE_012B, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x25, PAD_CAVE_0026, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x26, PAD_CAVE_012C, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x27, PAD_CAVE_002C, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x28, PAD_CAVE_012D, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x2a, PAD_CAVE_00D9, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x2b, PAD_CAVE_012E, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x2c, PAD_CAVE_00DA, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x2d, PAD_CAVE_012F, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x2e, PAD_CAVE_00D8, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x2f, PAD_CAVE_0130, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x30, PAD_CAVE_00B1, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x31, PAD_CAVE_0131, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x32, PAD_CAVE_00DC, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x33, PAD_CAVE_0132, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x34, PAD_CAVE_00B0, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x35, PAD_CAVE_0133, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0035, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x36, PAD_CAVE_00DB, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION | CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0036, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x37, PAD_CAVE_0134, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0037, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x44, PAD_CAVE_0132, BODY_CIAGUY, HEAD_RANDOM, 0x0419, 0x0132, -1, 1000, 6, CHRFLAG0_GP1 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x45, PAD_CAVE_00B1, BODY_STEWARDESS, HEAD_RANDOM, 0x0419, 0x00b1, -1, 1000, 9, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x46, PAD_CAVE_00E6, BODY_STEWARD, HEAD_RANDOM, 0x0419, 0x00e6, -1, 1000, 10, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 1, 0, 0, 0) + chr(0, 0x42, PAD_CAVE_0136, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0042, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x43, PAD_CAVE_0137, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0043, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x47, PAD_CAVE_0138, BODY_TRENT, HEAD_TRENT, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + chr(SPAWNFLAG_FORCESUNGLASSES, 0x48, PAD_CAVE_0139, BODY_STEWARDESS_COAT, HEAD_ANKA, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + chr(0, 0x49, PAD_CAVE_013A, BODY_NSA_LACKEY, HEAD_RANDOM, GAILIST_INVINCIBLE_AND_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0049, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x4a, PAD_CAVE_013B, BODY_NSA_LACKEY, HEAD_RANDOM, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x004a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x4b, PAD_CAVE_013C, BODY_ALASKAN_GUARD, HEAD_RANDOM, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x004b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(0, 0x4c, PAD_CAVE_013D, BODY_ALASKAN_GUARD, HEAD_RANDOM, GAILIST_IDLE, 0x0135, -1, 20, 20, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 3, 0, 0, 7, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x004c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + tag(0x00, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_CAVE_0113, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_SUITCASE) + rename_object(-1, WEAPON_SUITCASE, L_CAVE_010, L_CAVE_011, L_CAVE_012, L_CAVE_013, L_CAVE_014) // "Obtain suitcase." + tag(0x01, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_CAVE_0156, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 0, 0) + tag(0x02, 1) + weapon(0x0080, MODEL_STEWARDESS_TROLLEY, PAD_CAVE_00B6, OBJFLAG_00000008, 0, 0, WEAPON_DISGUISE41) + rename_object(-1, WEAPON_DISGUISE41, L_CAVE_015, L_CAVE_016, L_CAVE_017, L_CAVE_018, L_CAVE_019) // "Obtain air stewardess uniform." + tag(0x06, 1) + stdobject(0x0100, MODEL_CHRBRIEFCASE, PAD_CAVE_00C4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000 | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x42, 6) + tag(0x43, 6) + tag(0x48, 6) + tag(0x49, 6) + tag(0x20, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_CAVE_013F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x013f, 0x013e, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x15000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_019A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_019B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0198, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0199, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + tag(0x04, 1) + lift(0x0100, MODEL_BAGGAGECARRIER, PAD_CAVE_0144, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE, 1000, 0x0144, 0x0145, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + tag(0x3b, 6) + tag(0x37, 3) + tag(0x36, 1) + lift(0x0100, MODEL_AIRBASE_LIFT_ANGLE, PAD_CAVE_0146, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0146, 0x0147, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x00000aaa, 0x00320000, 0x15000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0184, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0185, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_019D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_019E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x000000b4, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + tag(0x3c, 10) + tag(0x3d, 10) + tag(0x3e, 10) + tag(0x3f, 10) + tag(0x40, 10) + tag(0x41, 10) + tag(0x38, 10) + tag(0x39, 10) + tag(0x21, 1) + lift(0x0100, MODEL_AIRBASE_LIFT_ENCLOSED, PAD_CAVE_0140, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0140, 0x0141, 0x0142, 0x0143, 0x00000001, 0x00000003, 0x00000005, 0x00000007, 0x0000071c, 0x0010aaaa, 0x16000000) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0196, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0197, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0194, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0195, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0192, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0193, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0190, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0191, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0196, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0197, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0194, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0195, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0192, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0193, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0190, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0191, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) +#endif + lift_door(-8, -9, 0) + lift_door(-8, -10, 0) + lift_door(-8, -11, 1) + lift_door(-8, -12, 1) + lift_door(-8, -13, 2) + lift_door(-8, -14, 2) + lift_door(-8, -15, 3) + lift_door(-8, -16, 3) + tag(0x05, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_CAVE_0153, OBJFLAG_00000002 | OBJFLAG_00000100, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x07, 17) + tag(0x08, 17) + tag(0x09, 17) + tag(0x0a, 17) + tag(0x0b, 17) + tag(0x0c, 17) + tag(0x0d, 17) + tag(0x0e, 17) + tag(0x0f, 17) + tag(0x10, 17) + tag(0x11, 17) + tag(0x12, 17) + tag(0x13, 17) + tag(0x14, 17) + tag(0x15, 17) + tag(0x16, 17) + tag(0x17, 17) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0168, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0169, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_016A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_016B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_016C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_016D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_016E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_016F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0170, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0177, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0171, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0172, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0173, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0176, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0174, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0175, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_017A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_017B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_017C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0178, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_CAVE_0179, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0157, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0158, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0159, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_015A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_015B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_015C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_015D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_015E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_015F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0160, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0161, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0162, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0163, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0164, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0165, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0166, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_CAVE_0167, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_CAVE_0180, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_CAVE_017F, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_003B, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + escastep(0x0100, MODEL_ESCA_STEP, PAD_CAVE_002D, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_00200000, 0, 1000) + tag(0x18, 1) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_0183, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_0186, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x35, 1) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_0187, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x27, 1) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_018A, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x29, 1) + stdobject(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_01A0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_80000000, 0, 0, 1000) + tag(0x28, 1) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_018E, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x2a, 1) + stdobject(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_01A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_018B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x2d, 1) + door(0x0100, MODEL_AIRBASE_SAFEDOOR, PAD_CAVE_018C, 0, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000080, 0x000005dc, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_018D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_AF1_INNERDOOR, PAD_CAVE_018F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x19, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_CAVE_0154, OBJFLAG_00000002 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3, 3, 3, 0) + hovercar(0x0080, MODEL_TESTERBOT, PAD_CAVE_01BA, OBJFLAG_00000008 | OBJFLAG_20000000 | OBJFLAG_HOVERCAR_40000000 | OBJFLAG_HOVERCAR_ISHOVERBOT, 0, 0, 100, 0x0000042e) + hovercar(0x0080, MODEL_HOOVERBOT, PAD_CAVE_01BA, OBJFLAG_00000008 | OBJFLAG_20000000 | OBJFLAG_HOVERCAR_40000000 | OBJFLAG_HOVERCAR_ISHOVERBOT, 0, 0, 100, 0x0000042f) + hovercar(0x0080, MODEL_HOOVERBOT, PAD_CAVE_01C3, OBJFLAG_00000008 | OBJFLAG_20000000 | OBJFLAG_HOVERCAR_40000000 | OBJFLAG_HOVERCAR_ISHOVERBOT, 0, 0, 100, 0x00000431) + hovercar(0x004c, MODEL_TESTERBOT, PAD_CAVE_01C3, OBJFLAG_00000008 | OBJFLAG_20000000 | OBJFLAG_HOVERCAR_40000000 | OBJFLAG_HOVERCAR_ISHOVERBOT, 0, 0, 100, 0x00000432) + tag(0x03, 1) + weapon(0x0040, MODEL_SAFEITEM, PAD_CAVE_00D6, OBJFLAG_00000008, 0, OBJFLAG3_PLAYERUNDROPPABLE, WEAPON_FLIGHTPLANS) + rename_object(-1, WEAPON_FLIGHTPLANS, L_CAVE_020, L_CAVE_021, L_CAVE_022, L_CAVE_023, L_CAVE_024) // "Obtain flight plans from safe." + tag(0x1f, 1) + lift(0x0100, MODEL_DD_LIFTDOOR, PAD_CAVE_0151, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE, 1000, 0x0151, 0x0150, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x01000000) + tag(0x1a, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH2, PAD_CAVE_0155, OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_INTERACTCHECKLOS, OBJFLAG3_INTERACTABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01CE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01CF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01D0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01D1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01D2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01D4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01D5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01D7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + tag(0x24, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01D9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOANTI, 0, 1000) + tag(0x25, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01DA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01DB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x26, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_CAVE_01DD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01D3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTRUBBER, PAD_CAVE_01DE, OBJFLAG_00000001 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_CAVE_01DF, OBJFLAG_00000001 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIKE, PAD_CAVE_01E0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_PLANTRUBBER, PAD_CAVE_01E1, OBJFLAG_00000001 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_CAVE_01E2, OBJFLAG_00000001 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIKE, PAD_CAVE_01E3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_PLANTRUBBER, PAD_CAVE_01E4, OBJFLAG_00000001 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIKE, PAD_CAVE_01E7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_CAVE_01EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x23, 1) + door(0x0100, MODEL_DOOR2A_G5, PAD_CAVE_019C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x000007ae, 0, DOORTYPE_SLIDING, 0x00000002, 0x000000f0, 0x00000000, 0x00000000, 0x00000000) + tag(0x22, 1) + stdobject(0x0100, MODEL_CABLE_CAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2f, 1) + stdobject(0x0100, MODEL_BINOCULARS, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01EC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00640190) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01ED, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00640190) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01EE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000, 0x00640190) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01EF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x00640190) + tag(0x46, 2) + tag(0x47, 2) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01F0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x00640190) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01F1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x00640190) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01F2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x00640190) + tag(0x2b, 1) + weapon(0x0100, MODEL_CHRREMOTEMINE, PAD_CAVE_0111, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_00020000 | OBJFLAG2_INVISIBLE, 0, WEAPON_REMOTEMINE) + tag(0x2e, 1) + stdobject(0x0100, MODEL_AIRFORCE1, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x45, 1) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_CAVE_01EB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, 0, 1000, 0x00c80320) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_CAVE_01F9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_SHUTTLEDOOR, PAD_CAVE_01A2, OBJFLAG_DEACTIVATED, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000, 0x0000c000, 0x0000f333, 0x0002c71c, 0x0002c71c, 0x00000888, DOORFLAG_0004 | DOORFLAG_AUTOMATIC, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_SHUTTLEDOOR, PAD_CAVE_01A3, OBJFLAG_DEACTIVATED, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000, 0x0000c000, 0x0000f333, 0x0002c71c, 0x0002c71c, 0x00000888, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x33, 1) + shield(0x0100, MODEL_CHRSHIELD, 0x0011, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x34, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_CAVE_00D6, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x44, 1) + weapon(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_CAVE_00B5, 0, 0, 0, WEAPON_PROXIMITYMINE) + endprops +}; + +s32 intro[] = { + spawn(PAD_CAVE_011E) + intro_weapon(WEAPON_CROSSBOW, -1) + intro_weapon(WEAPON_HORIZONSCANNER, -1) + ammo(AMMOTYPE_CROSSBOW, 12) + ammo(AMMOTYPE_PROXY_MINE, 3) + ammo(AMMOTYPE_RIFLE, 30) + intro_weapon(WEAPON_EYESPY, -1) + outfit(OUTFIT_SNOW) + endintro +}; + +s32 path06[] = { + PAD_CAVE_000E, + PAD_CAVE_000D, + PAD_CAVE_000D, + PAD_CAVE_000E, + PAD_CAVE_0012, + -1, +}; + +s32 path07[] = { + PAD_CAVE_002D, + PAD_CAVE_0031, + PAD_CAVE_002E, + PAD_CAVE_002F, + PAD_CAVE_0030, + PAD_CAVE_0031, + -1, +}; + +s32 path08[] = { + PAD_CAVE_004D, + PAD_CAVE_004F, + PAD_CAVE_004D, + PAD_CAVE_004C, + PAD_CAVE_003D, + PAD_CAVE_003E, + PAD_CAVE_003C, + PAD_CAVE_003E, + PAD_CAVE_003D, + PAD_CAVE_004C, + -1, +}; + +s32 path09[] = { + PAD_CAVE_005B, + PAD_CAVE_0053, + PAD_CAVE_0051, + PAD_CAVE_0052, + PAD_CAVE_0054, + PAD_CAVE_0053, + -1, +}; + +s32 path10[] = { + PAD_CAVE_0041, + PAD_CAVE_0042, + PAD_CAVE_0043, + PAD_CAVE_0044, + PAD_CAVE_0045, + PAD_CAVE_0044, + PAD_CAVE_0043, + PAD_CAVE_0042, + -1, +}; + +s32 path11[] = { + PAD_CAVE_008E, + PAD_CAVE_008D, + PAD_CAVE_008C, + PAD_CAVE_008D, + -1, +}; + +s32 path12[] = { + PAD_CAVE_0095, + PAD_CAVE_0090, + PAD_CAVE_008F, + PAD_CAVE_008E, + PAD_CAVE_008F, + PAD_CAVE_0090, + -1, +}; + +s32 path13[] = { + PAD_CAVE_0099, + PAD_CAVE_0098, + PAD_CAVE_0097, + PAD_CAVE_0096, + PAD_CAVE_0095, + PAD_CAVE_0096, + PAD_CAVE_0097, + PAD_CAVE_0098, + -1, +}; + +s32 path14[] = { + PAD_CAVE_0030, + PAD_CAVE_002C, + PAD_CAVE_0039, + PAD_CAVE_002C, + -1, +}; + +s32 path15[] = { + PAD_CAVE_0019, + PAD_CAVE_0012, + -1, +}; + +s32 path00[] = { + PAD_CAVE_01BA, + PAD_CAVE_01BB, + PAD_CAVE_01BC, + PAD_CAVE_01BD, + PAD_CAVE_01BD, + -1, +}; + +s32 path01[] = { + PAD_CAVE_01BA, + PAD_CAVE_01BE, + PAD_CAVE_01BF, + PAD_CAVE_01C0, + PAD_CAVE_01BA, + -1, +}; + +s32 path02[] = { + PAD_CAVE_01BA, + PAD_CAVE_01C1, + PAD_CAVE_01C2, + PAD_CAVE_01BE, + PAD_CAVE_01BA, + -1, +}; + +s32 path03[] = { + PAD_CAVE_01C3, + PAD_CAVE_01C4, + PAD_CAVE_01C5, + PAD_CAVE_01C6, + PAD_CAVE_01C3, + -1, +}; + +s32 path04[] = { + PAD_CAVE_01C3, + PAD_CAVE_01C7, + PAD_CAVE_01C8, + PAD_CAVE_01C9, + PAD_CAVE_01C3, + -1, +}; + +s32 path05[] = { + PAD_CAVE_01C3, + PAD_CAVE_01CA, + PAD_CAVE_01CB, + PAD_CAVE_01CC, + PAD_CAVE_01C3, + -1, +}; + +s32 unregistered_path1[] = { + PAD_CAVE_003B, + PAD_CAVE_003E, + PAD_CAVE_003D, + PAD_CAVE_004C, + PAD_CAVE_004D, + PAD_CAVE_004F, + PAD_CAVE_0050, + PAD_CAVE_004E, + PAD_CAVE_004D, + PAD_CAVE_004C, + PAD_CAVE_003D, + PAD_CAVE_003E, + PAD_CAVE_003B, + PAD_CAVE_003B, + -1, +}; + +struct path paths[] = { + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, + { path10, 10, 0 }, + { path11, 11, 0 }, + { path12, 12, 0 }, + { path13, 13, 0 }, + { path14, 14, 0 }, + { path15, 15, 0 }, + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { NULL, 0, 0 }, +}; + +u8 func1002_objectives_failed_msg[] = { + yield + give_object_to_chr(OBJ_UNIFORM, CHR_STEWARDESS) + set_chr_chrflag(0x00, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x01, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x02, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x03, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x04, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x05, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x06, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x07, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x08, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x09, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0a, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0b, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0c, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0d, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0e, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0f, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_SECRETARY, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x3a, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x3b, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_OFFICE1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_OFFICE2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x44, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x45, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x46, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1000_rebuild_groups[] = { + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1401_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_04) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 unregistered_function1[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, 0x0401) + endlist +}; + +/** + * @unused + */ +u8 func0401_unused_cutscene[] = { + chr_draw_weapon_in_cutscene(CHR_BOND, WEAPON_FALCON2) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_AIRBASE_OUTRO_LONG) + camera_movement(ANIM_CUT_CAVE_BETA_CAM) + cmd0175(60) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_BETA_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_hudpiece_visible(CHR_BOND, TRUE) + set_chr_chrflag(0x00, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x00, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x00, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_BETA_GUARD1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x00, 4) + set_chr_chrflag(0x01, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x01, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x01, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_BETA_GUARD2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x01, 4) + set_chr_chrflag(0x02, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x02, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x02, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_BETA_GUARD3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x02, 4) + set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_STEWARDESS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_BETA_STEWARDESS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_STEWARDESS, 4) + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + beginloop(0x04) + if_camera_animating(/*goto*/ 0x31) + goto_next(0x48) + + label(0x31) + if_controller_button_pressed(/*goto*/ 0x48) + label(0x31) + endloop(0x04) + + label(0x48) + label(0x02) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_ailist(0x00, 0x0405) + set_ailist(0x01, 0x0405) + remove_chr(0x02) + set_ailist(CHR_STEWARDESS, 0x040b) + stop_cutscene_track + stop_ambient_track + set_ailist(CHR_SELF, GAILIST_END_CINEMA) + endlist +}; + +u8 func0425_outro[] = { + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + camera_movement(ANIM_CUT_CAVE_OUTRO_CAM) + play_cutscene_track(MUSIC_AIRBASE_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + + set_chr_chrflag(CHR_OUTRO_NSA, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_OUTRO_NSA, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_OUTRO_NSA, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_NSA, 4) + + enable_object(OBJ_PLANE) + set_object_flag2(OBJ_PLANE, OBJFLAG2_04000000) + set_object_flag3(OBJ_PLANE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_CAVE_OUTRO_PLANE, OBJ_PLANE, 0x04, 0xffff) + + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + show_nonessential_chrs(FALSE) + restart_timer + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x48) \ + if_timer_gt(time, /*goto*/ 0x02) \ + endloop(loopid) \ + label(0x02) + + wait_until(38, 0x92) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_10) + + wait_until(84, 0x93) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_10) + + wait_until(130, 0x94) + play_sound(SFX_FOOTSTEP_80C6, CHANNEL_10) + + wait_until(176, 0x95) + play_sound(SFX_FOOTSTEP_80C7, CHANNEL_10) + + wait_until(220, 0x96) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_10) + + wait_until(274, 0x97) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_10) + + wait_until(320, 0x98) + play_sound(SFX_FOOTSTEP_80C6, CHANNEL_10) + + wait_until(365, 0x99) + play_sound(SFX_FOOTSTEP_80C7, CHANNEL_10) + + beginloop(0x04) + if_camera_animating(/*goto*/ 0x31) + goto_next(0x48) + + label(0x31) + if_controller_button_pressed(/*goto*/ 0x48) + label(0x31) + endloop(0x04) + + label(0x48) + mute_channel(CHANNEL_10) + label(0x02) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) +#if VERSION < VERSION_PAL_FINAL + disable_object(OBJ_PLANE) +#endif + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_init_stripes[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_guard_activation[] = { + set_object_flag(0x29, OBJFLAG_INVINCIBLE) + set_object_flag2(0x29, OBJFLAG2_INVISIBLE) + unset_object_flag(0x29, OBJFLAG_00000100) + set_object_flag(0x2a, OBJFLAG_INVINCIBLE) + set_object_flag2(0x2a, OBJFLAG2_INVISIBLE) + unset_object_flag(0x2a, OBJFLAG_00000100) + set_object_flag2(OBJ_REMOTEMINE, OBJFLAG2_00020000) + set_object_flag(OBJ_REMOTEMINE, OBJFLAG_INVINCIBLE) + set_object_flag2(OBJ_REMOTEMINE, OBJFLAG2_INVISIBLE) + yield + yield + disable_chr(0x13) + disable_chr(0x15) + disable_chr(0x17) + disable_chr(0x19) + disable_chr(0x1b) + disable_chr(0x1d) + disable_chr(0x1f) + disable_chr(0x21) + disable_chr(0x23) + disable_chr(0x25) + disable_chr(0x27) + disable_chr(0x2a) + disable_chr(0x2c) + disable_chr(0x2e) + disable_chr(0x30) + disable_chr(0x32) + disable_chr(0x34) + disable_chr(0x36) + disable_chr(0x42) + disable_chr(0x43) + disable_chr(0x14) + disable_chr(0x16) + disable_chr(0x18) + disable_chr(0x1a) + disable_chr(0x1c) + disable_chr(0x1e) + disable_chr(0x20) + disable_chr(0x22) + disable_chr(0x24) + disable_chr(0x26) + disable_chr(0x28) + disable_chr(0x2b) + disable_chr(0x2d) + disable_chr(0x2f) + disable_chr(0x31) + disable_chr(0x33) + disable_chr(0x35) + disable_chr(0x37) + + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + disable_object(0x27) + disable_object(0x28) + unset_object_flag(0x29, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x29, OBJFLAG2_INVISIBLE) + set_object_flag(0x29, OBJFLAG_00000100) + unset_object_flag(0x2a, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x2a, OBJFLAG2_INVISIBLE) + set_object_flag(0x2a, OBJFLAG_00000100) + + #define remove_alaskan_guard(chr) \ + set_chr_flag_bankx(chr, CHRFLAG1_PREWARNED, BANK_1) \ + set_ailist(chr, AILIST_REMOVE_OR_UNALERT) \ + set_chr_flag_bankx(chr, CHRFLAG0_AIVSAI, BANK_0) \ + yield + + remove_alaskan_guard(0x00) + remove_alaskan_guard(0x01) + remove_alaskan_guard(0x02) + remove_alaskan_guard(0x03) + remove_alaskan_guard(0x04) + remove_alaskan_guard(0x05) + remove_alaskan_guard(0x06) + remove_alaskan_guard(0x07) + remove_alaskan_guard(0x08) + remove_alaskan_guard(0x09) + remove_alaskan_guard(0x0a) + remove_alaskan_guard(0x0b) + remove_alaskan_guard(0x0d) + remove_alaskan_guard(0x0e) + remove_alaskan_guard(0x0f) + + set_ailist(CHR_SECRETARY, AILIST_REMOVE_OR_COWER) + set_ailist(CHR_STEWARDESS, AILIST_REMOVE_OR_COWER) + set_ailist(CHR_OFFICE1, AILIST_REMOVE_OR_COWER) + set_ailist(CHR_OFFICE2, AILIST_REMOVE_OR_COWER) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + set_ailist(0x10, AILIST_INIT_POSTTAKEOVER_GUARD) + set_ailist(0x11, AILIST_INIT_POSTTAKEOVER_GUARD) + + #define enable_takeover_guard2(chr, function) \ + enable_chr(chr) \ + set_ailist(chr, function) \ + unset_chr_hiddenflag(chr, CHRHFLAG_ANTINONINTERACTABLE) \ + unset_chr_chrflag(chr, CHRCFLAG_HIDDEN) \ + yield + + enable_takeover_guard2(0x15, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x17, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x21, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x23, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x25, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x27, 0x0423) + enable_takeover_guard2(0x2a, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x2c, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x2e, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x30, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x32, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x34, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x36, AILIST_INIT_POSTTAKEOVER_GUARD) + + enable_chr(0x42) + set_ailist(0x42, AILIST_FOYER_SPAWNER) + yield + + enable_chr(0x43) + set_ailist(0x43, AILIST_FOYER_SPAWNER) + yield + + enable_takeover_guard2(0x22, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x24, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x26, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x28, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x2b, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x2d, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x2f, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x31, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x33, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x35, AILIST_INIT_POSTTAKEOVER_GUARD) + enable_takeover_guard2(0x37, AILIST_INIT_POSTTAKEOVER_GUARD) + + set_ailist(0x10, AILIST_DRAW_MAGNUM) + set_ailist(0x11, AILIST_DRAW_MAGNUM) + unset_object_flag(0x2b, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x2b, OBJFLAG2_INVISIBLE) + + beginloop(0x6d) + if_chr_y(CHR_P1P2, -2000, OPERATOR_LESS_THAN, /*goto*/ 0x02) + endloop(0x6d) + + #define enable_bottom_guard(chr) \ + enable_chr(chr) \ + set_ailist(chr, AILIST_INIT_POSTTAKEOVER_GUARD) \ + unset_chr_hiddenflag(chr, CHRHFLAG_ANTINONINTERACTABLE) \ + unset_chr_chrflag(chr, CHRCFLAG_HIDDEN) \ + yield + + label(0x02) + enable_bottom_guard(0x13) + enable_bottom_guard(0x14) + enable_bottom_guard(0x16) + enable_bottom_guard(0x18) + enable_bottom_guard(0x1a) + enable_bottom_guard(0x1c) + enable_bottom_guard(0x1f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0405_start_path15[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + restart_timer + + beginloop(0x05) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + assign_path(15) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Assigned to the stewardess from another unused function. + */ +u8 func040b_unused[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, 0x040b) + endlist +}; + +u8 func0407_stewardess[] = { + set_shotlist(AILIST_STEWARDESS) + if_chr_dead(CHR_SELF, /*goto*/ 0x02) + if_chr_knockedout(CHR_SELF, /*goto*/ 0x02) + goto_next(0x31) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x31) + if_just_injured(CHR_SELF, /*goto*/ 0x02) + goto_next(0x4c) + + // Injured + label(0x02) + restart_timer + + beginloop(0x4d) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) + if_distance_to_target_gt(200, /*goto*/ 0x75) + set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) + label(0x75) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x02) + if_num_times_shot_lt(1, /*goto*/ 0x02) + if_timer_lt(20, /*goto*/ 0x02) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x02) + if_chr_stopped(/*goto*/ 0x4c) + endloop(0x4d) + + // Not injured, or recovered + label(0x4c) + if_chr_knockedout(CHR_SELF, /*goto*/ 0x02) + goto_next(0x16) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + restart_timer + + beginloop(0x11) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) + if_distance_to_target_gt(200, /*goto*/ 0x75) + set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) + label(0x75) + if_self_flag_bankx_eq(CHRFLAG0_CAN_EXAMINE_BODY, FALSE, BANK_0, /*goto*/ 0x31) + if_saw_death(0x00, /*goto*/ 0x0f) + label(0x31) + if_distance_to_target_gt(500, /*goto*/ 0x31) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + label(0x31) + if_target_outside_my_yvisang(/*goto*/ 0x02) + if_target_in_sight(/*goto*/ 0x04) + label(0x02) + if_timer_gt(120, /*goto*/ 0x16) + endloop(0x11) + + // Loaded + label(0x16) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x31) + walk_to_pad(PAD_CAVE_0012) // outside front door + goto_next(0x00) + + label(0x31) + walk_to_pad(PAD_CAVE_0026) // top of escalators + + // Walking + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) + if_distance_to_target_gt(200, /*goto*/ 0x75) + set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) + label(0x75) + if_self_flag_bankx_eq(CHRFLAG0_CAN_EXAMINE_BODY, FALSE, BANK_0, /*goto*/ 0x31) + if_saw_death(0x00, /*goto*/ 0x0f) + label(0x31) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + if_target_outside_my_yvisang(/*goto*/ 0x02) + if_target_in_sight(/*goto*/ 0x04) + label(0x02) + if_chr_stopped(/*goto*/ 0x0b) + endloop(0x00) + + // Saw player + label(0x04) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) + + beginloop(0x05) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(60, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + speak(CHR_TARGET, L_CAVE_025, MP3_02DC, CHANNEL_4, COLOR_07_RED) // "Look out - it's an intruder..." + increase_squadron_alertness(100) + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x06) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x06) + + label(0x02) + jog_to_pad(PAD_CAVE_001D) // alcove in foyer + + beginloop(0x07) + if_chr_stopped(/*goto*/ 0x0b) + endloop(0x07) + + label(0x0b) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x31) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + chr_do_animation(ANIM_SNEEZE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x69) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x69) + + label(0x02) + goto_first(0x16) + + label(0x31) + set_stage_flag(STAGEFLAG_STEWARDESS_ENTERED_BASE) + + label(0x62) + set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) + chr_do_animation(ANIM_COWER_0229, -1, 190, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x63) + if_chr_stopped(/*goto*/ 0x31) + endloop(0x63) + + label(0x31) + goto_first(0x62) + + label(0x0f) + try_jog_to_chr(CHR_SEEDIE, /*goto*/ 0x49) + + beginloop(0x49) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) + if_distance_to_target_gt(200, /*goto*/ 0x75) + set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) + label(0x75) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e) + if_target_outside_my_yvisang(/*goto*/ 0x31) + if_target_in_sight(/*goto*/ 0x02) + label(0x31) + if_distance_to_chr_lt(200, 0xfb, /*goto*/ 0x4a) + if_chr_stopped(/*goto*/ 0x4a) + endloop(0x49) + + label(0x4a) + unset_self_flag_bankx(CHRFLAG0_CAN_EXAMINE_BODY, BANK_0) + speak(CHR_TARGET, L_CAVE_027, MP3_02DD, CHANNEL_4, COLOR_07_RED) // "Is he OK?" + stop_chr + restart_timer + + beginloop(0x4b) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) + if_distance_to_target_gt(200, /*goto*/ 0x75) + set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) + label(0x75) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e) + if_timer_gt(240, /*goto*/ 0x02) + endloop(0x4b) + + label(0x02) + speak(CHR_TARGET, L_CAVE_028, MP3_02DE, CHANNEL_4, COLOR_07_RED) // "I'll go and get some help." + restart_timer + stop_chr + + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) + if_distance_to_target_gt(200, /*goto*/ 0x75) + set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) + label(0x75) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x10) + + label(0x02) + unset_self_flag_bankx(CHRFLAG0_CAN_EXAMINE_BODY, BANK_0) + jog_to_pad(PAD_CAVE_0026) + goto_first(0x00) + + label(0x4e) + goto_first(0x04) + + endlist +}; + +u8 func0406_become_unalerted[] = { + set_self_chrflag(CHRCFLAG_00000040) + label(0x00) + yield + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x02) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + label(0x02) + if_target_is_player(/*goto*/ 0x02) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x02) + set_shotlist(AILIST_BECOME_UNALERTED) + set_returnlist(CHR_SELF, AILIST_BECOME_UNALERTED) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1005_check_civilians_killed[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) + if_chr_dead(CHR_STEWARDESS, /*goto*/ 0x31) + if_chr_dead(CHR_SECRETARY, /*goto*/ 0x31) + if_chr_dead(CHR_OFFICE1, /*goto*/ 0x31) + if_chr_dead(CHR_OFFICE2, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + show_hudmsg(CHR_BOND, L_CAVE_026) // "Innocent civilians have been killed." + set_stage_flag(STAGEFLAG_CIVILIANS_KILLED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_path(reaction, health, armor, recovery, pathid) \ + set_accuracy(12) \ + set_reaction_speed(reaction) \ + set_chr_maxdamage(CHR_SELF, health) \ + add_health_or_armor(armor) \ + set_recovery_speed(recovery) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED) + +u8 func041b_start_path06[] = { + init_path(70, 40, 0, 0, 0x06) + endlist +}; + +u8 func041c_start_path07[] = { + init_path(70, 40, 0, 0, 0x07) + endlist +}; + +u8 func041d_start_path08[] = { + init_path(70, 40, 0, 0, 0x08) + endlist +}; + +u8 func041e_start_path09[] = { + init_path(70, 40, 0, 0, 0x09) + endlist +}; + +u8 func041f_start_path10[] = { + init_path(70, 40, 0, 0, 0x0a) + endlist +}; + +u8 func0420_start_path11[] = { + init_path(45, 60, 40, 30, 0x0b) + endlist +}; + +u8 func0421_start_path12[] = { + init_path(45, 60, 40, 30, 0x0c) + endlist +}; + +/** + * Assigned to a stripes guard near the plane. + */ +u8 func0422_start_path13[] = { + set_chr_team(CHR_SELF, TEAM_04) + set_accuracy(12) + set_reaction_speed(45) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(30) + set_shield(0) + rebuild_teams + rebuild_squadrons + assign_path(13) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0423_start_path14[] = { + set_chr_team(CHR_SELF, TEAM_04) + set_accuracy(12) + set_reaction_speed(45) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(30) + set_shield(0) + rebuild_teams + rebuild_squadrons + assign_path(14) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0424_start_path15_unused[] = { + set_accuracy(12) + set_reaction_speed(45) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(30) + set_shield(0) + assign_path(15) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040c_init_secretary[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_SECRETARY) + endlist +}; + +/** + * The secretary uses morale to track things. + * + * 0 = Not done anything + * 1 = Not used + * 2 = Said "good afternoon" + * 3 = Said "you'll have to check that weapon" + * 4 = Said "weapons are not allowed" + */ +u8 func0408_secretary[] = { + set_shotlist(AILIST_SECRETARY) + set_morale(0) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x00) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) +#define LABEL_MAIN_LOOP 0x00 +#define LABEL_BECOME_ALERT1 0x66 +#define LABEL_BECOME_ALERT2 0x68 + + // + // MAIN LOOP + // + beginloop(LABEL_MAIN_LOOP) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + set_view_distance(100) + if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT1) + if_saw_death(0x00, /*goto*/ LABEL_BECOME_ALERT1) + set_view_distance(14) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT1) + if_target_in_sight(/*goto*/ 0x02) + if_can_hear_alarm(/*goto*/ 0x67) + endloop(LABEL_MAIN_LOOP) + + // Joanna within 14 units (?) of distance + label(0x02) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) + + beginloop(0x05) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(60, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + if_stage_flag_eq(STAGEFLAG_DISGUISED, TRUE, /*goto*/ 0x07) + + // + // BECOMING ALERT + // + label(LABEL_BECOME_ALERT1) + mute_channel(CHANNEL_4) + yield + label(0x02) + speak(CHR_TARGET, L_CAVE_032, SFX_8162, CHANNEL_4, COLOR_06_WHITE) // "Oh, my God!" + + label(0x67) + increase_squadron_alertness(100) + restart_timer + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x06) + if_chr_stopped(/*goto*/ 0x4f) + endloop(0x06) + + label(0x4f) + set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x31) + endloop(0x0f) + + label(0x31) + if_stage_flag_eq(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY, TRUE, /*goto*/ 0x31) + goto_next(0x77) + + label(0x31) + goto_first(0x4f) + + // Unreachable + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Seen Jo while disguised + label(0x07) + if_morale_lt(2, /*goto*/ 0x32) + goto_next(0x02) + + // + // FIRST TALK + // + label(0x32) + speak(CHR_TARGET, L_CAVE_029, SFX_8161, CHANNEL_4, COLOR_06_WHITE) // "Good afternoon." + chr_do_animation(ANIM_TALKING_0231, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + restart_timer + set_morale(2) + + beginloop(0x08) + if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) + if_timer_gt(60, /*goto*/ 0x02) + if_can_see_target(/*goto*/ 0x31) + goto_first(LABEL_MAIN_LOOP) + + label(0x31) + endloop(0x08) + + // + // SECOND TALK/WEAPON CHECK + // + label(0x02) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x0c) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x0c) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x0c) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x0c) + if_morale_lt(3, /*goto*/ 0x32) + goto_next(0x02) + + // + // WEAPON TALK 1 + // + label(0x32) + speak(CHR_TARGET, L_CAVE_031, MP3_0273, CHANNEL_4, COLOR_06_WHITE) // "You'll have to check that weapon in here." + restart_timer + chr_do_animation(ANIM_TALKING_0232, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + set_morale(3) + + beginloop(0x09) + if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) + if_timer_gt(400, /*goto*/ 0x02) + if_can_see_target(/*goto*/ 0x31) + goto_first(LABEL_MAIN_LOOP) + + label(0x31) + endloop(0x09) + + // 6.66 seconds since weapon talk + label(0x02) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) + if_morale_lt(4, /*goto*/ 0x32) + goto_next(0x02) + + label(0x32) + speak(CHR_TARGET, L_CAVE_033, MP3_0274, CHANNEL_4, COLOR_06_WHITE) // "Weapons are not allowed in the base." + restart_timer + chr_do_animation(ANIM_TALKING_0233, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + set_morale(4) + + beginloop(0x0a) + if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) + if_timer_gt(400, /*goto*/ 0x0c) + if_can_see_target(/*goto*/ 0x31) + goto_first(LABEL_MAIN_LOOP) + + label(0x31) + endloop(0x0a) + + // Wait 1.5 seconds, check weapon equipped and call security if so + label(0x0c) + restart_timer + + beginloop(0x0d) + if_timer_gt(90, /*goto*/ 0x31) + endloop(0x0d) + + label(0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) + + // Calling security + label(0x77) + speak(CHR_TARGET, L_CAVE_034, MP3_0276, CHANNEL_4, COLOR_06_WHITE) // "Right, I'm calling security." + set_stage_flag(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY) + activate_alarm + restart_timer + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0b) + if_timer_gt(180, /*goto*/ 0x02) + endloop(0x0b) + + label(0x02) + goto_first(0x4f) + + // Unreachable + set_ailist(CHR_SELF, GAILIST_IDLE) + + // + // TALK 2 + // + label(0x31) + speak(CHR_TARGET, L_CAVE_030, MP3_0272, CHANNEL_4, COLOR_06_WHITE) // "OK, you know the way from here." + chr_do_animation(ANIM_TALKING_0232, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + unlock_door(0x18, 0x02) + + beginloop(0x0e) + if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) + if_saw_death(0x00, /*goto*/ LABEL_BECOME_ALERT2) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) + endloop(0x0e) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_BECOME_ALERT2) + goto_first(LABEL_BECOME_ALERT1) + + endlist +}; + +u8 unregistered_function2[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ 0x02) + if_stage_flag_eq(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY, TRUE, /*goto*/ 0x02) + set_stage_flag(STAGEFLAG_DISGUISED) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_console_activation[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x0c) + + label(0x31) + if_chr_activated_object(CHR_P1P2, OBJ_CONSOLE, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + set_stage_flag(STAGEFLAG_CONSOLE_ACTIVATED) + set_object_image(OBJ_CONSOLE, 0, TVCMDLIST_0F) + set_object_image(OBJ_CONSOLE, 1, TVCMDLIST_0F) + set_chr_flag_bankx(0x12, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + show_hudmsg(CHR_P1P2, L_CAVE_035) // "System shutdown initiated..." + mute_channel(CHANNEL_1) + assign_sound(SFX_01B9, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_CONSOLE, TRUE) + restart_timer + + beginloop(0x04) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x0c) + + label(0x31) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x04) + + label(0x02) + set_object_image(OBJ_CONSOLE, 0, TVCMDLIST_14) + mute_channel(CHANNEL_1) + assign_sound(SFX_0479, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_CONSOLE, TRUE) + show_hudmsg(CHR_P1P2, L_CAVE_036) // "Security systems have been shut down." + set_stage_flag(STAGEFLAG_SECURITY_SHUT_DOWN) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + restart_timer + + beginloop(0x05) + if_timer_gt(120, /*goto*/ 0x31) + endloop(0x05) + + label(0x31) + set_object_image(OBJ_CONSOLE, 1, TVCMDLIST_14) + play_x_track(XREASON_DEFAULT, 88, 88) + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -2000, OPERATOR_LESS_THAN, /*goto*/ 0x02) + endloop(0x06) + + label(0x02) + stop_x_track(XREASON_DEFAULT) + + label(0x0c) + mute_channel(CHANNEL_1) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define weapon_detection_logic(chr) \ + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) \ + \ + label(0x00) \ + yield \ + mute_channel(CHANNEL_6) \ + set_lights_state(0x0039, LIGHTOP_3, 0x78, 0xff, 0x3c) \ + set_lights_state(0x003a, LIGHTOP_3, 0x78, 0xff, 0x3c) \ + set_lights_state(0x003b, LIGHTOP_3, 0x78, 0xff, 0x3c) \ + set_lights_state(0x0041, LIGHTOP_3, 0x78, 0xff, 0x3c) \ + set_lights_state(0x0042, LIGHTOP_3, 0x78, 0xff, 0x3c) \ + set_lights_state(0x0043, LIGHTOP_3, 0x78, 0xff, 0x3c) \ + \ + beginloop(0x65) \ + if_stage_flag_eq(STAGEFLAG_SUITCASE_DEPOSITED, TRUE, /*goto*/ 0x08) \ + if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ + endloop(0x65) \ + \ + /* In hallway with weapons */ \ + label(0x31) \ + set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x3c) \ + set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x3c) \ + set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x3c) \ + set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x3c) \ + set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x3c) \ + set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x3c) \ + play_sound(SFX_ALARM_INFILTRATION, CHANNEL_6) \ + restart_timer \ + \ + beginloop(0x04) \ + if_timer_gt(60, /*goto*/ 0x02) \ + if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ + goto_first(0x00) \ + \ + label(0x31) \ + endloop(0x04) \ + \ + /* In hallway with weapons for over 60 frames */ \ + label(0x02) \ + restart_timer \ + set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x32) \ + set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x32) \ + set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x32) \ + set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x32) \ + set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x32) \ + set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x32) \ + \ + beginloop(0x05) \ + if_timer_gt(40, /*goto*/ 0x02) \ + if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ + goto_first(0x00) \ + \ + label(0x31) \ + endloop(0x05) \ + \ + /* In hallway with weapons for over 100 frames */ \ + label(0x02) \ + restart_timer \ + set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x28) \ + set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x28) \ + set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x28) \ + set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x28) \ + set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x28) \ + set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x28) \ + \ + beginloop(0x06) \ + if_timer_gt(1, /*goto*/ 0x02) \ + if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ + goto_first(0x00) \ + \ + label(0x31) \ + endloop(0x06) \ + \ + /* In hallway with weapons for over 101 frames */ \ + label(0x02) \ + restart_timer \ + set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x1e) \ + set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x1e) \ + set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x1e) \ + set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x1e) \ + set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x1e) \ + set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x1e) \ + \ + beginloop(0x07) \ + yield \ + yield \ + yield \ + yield \ + yield \ + yield \ + yield \ + yield \ + yield \ + if_timer_gt(30, /*goto*/ 0x02) \ + if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ + if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ + goto_first(0x00) \ + \ + label(0x31) \ + endloop(0x07) \ + \ + label(0x02) \ + show_hudmsg(chr, 0x0e25) /* "Weapons have been detected." */ \ + set_stage_flag(STAGEFLAG_WEAPONS_DETECTED) \ + label(0x31) \ + mute_channel(CHANNEL_6) \ + yield \ + activate_alarm \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + /* Agent, or suitcase deposited */ \ + label(0x08) \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 func1020_weapon_scanning_bond[] = { + yield + weapon_detection_logic(CHR_BOND) + endlist +}; + +u8 func1021_weapon_scanning_coop[] = { + yield + set_target_chr(CHR_COOP) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) + goto_next(0x02) + + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x02) + weapon_detection_logic(CHR_COOP) + endlist +}; + +u8 func1009_carousel_activation[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_BAGGAGE_CARRIER, /*goto*/ 0x02) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x31) + reloop(0x00) + + // Shut down without depositing + label(0x31) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) + show_hudmsg(CHR_BOND, L_CAVE_066) // "Hover trolley has been shut down." + set_stage_flag(STAGEFLAG_TROLLEY_SHUT_DOWN_WITHOUT_BRIEFCASE) + yield + show_hudmsg(CHR_BOND, L_CAVE_067) // "Equipment cannot be checked in." + label(0x09) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Carrier activated + label(0x02) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_SUITCASE, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + show_hudmsg(CHR_P1P2, L_CAVE_038) // "Suitcase has been deposited." + chr_draw_weapon_in_cutscene(CHR_P1P2, WEAPON_UNARMED) + set_stage_flag(STAGEFLAG_SUITCASE_DEPOSITED) + play_sound(SFX_80AA, CHANNEL_7) + unset_object_flag2(OBJ_BRIEFCASE2, OBJFLAG2_INVISIBLE) + move_object_to_pad(OBJ_BRIEFCASE2, PAD_CAVE_00DE) + yield + restart_timer + + beginloop(0x05) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + clear_inventory(CHR_BOND) + unset_object_flag(OBJ_BAGGAGE_CARRIER, OBJFLAG_DEACTIVATED) + open_door(0x23) + restart_timer + + beginloop(0x04) + if_timer_gt(400, /*goto*/ 0x02) + endloop(0x04) + + label(0x02) + set_object_flag(OBJ_BAGGAGE_CARRIER, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_suitcase_scanning[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_SUITCASE_DEPOSITED, TRUE, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + restart_timer + if_difficulty_lt(DIFF_SA, /*goto*/ 0x07) + if_difficulty_lt(DIFF_PA, /*goto*/ 0xb7) + + // PA + set_countdown_timer(30) + show_countdown_timer + start_countdown_timer + + beginloop(0x06) + if_stage_flag_eq(STAGEFLAG_CONSOLE_ACTIVATED, TRUE, /*goto*/ 0x07) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) + if_countdown_timer_lt(1, /*goto*/ 0x02) + endloop(0x06) + + // SA + label(0xb7) + set_countdown_timer(45) + show_countdown_timer + start_countdown_timer + + beginloop(0x05) + if_stage_flag_eq(STAGEFLAG_CONSOLE_ACTIVATED, TRUE, /*goto*/ 0x07) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) + if_countdown_timer_lt(1, /*goto*/ 0x02) + endloop(0x05) + + // Scanned + label(0x02) + show_hudmsg(CHR_BOND, L_CAVE_039) // "Suitcase has been scanned." + set_stage_flag(STAGEFLAG_SUITCASE_SCANNED) + + // Agent + label(0x07) + stop_countdown_timer + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_init_office1[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_OFFICE1) + endlist +}; + +u8 func0409_office1[] = { +#define LABEL_RUN_TO_FOYER 0x4f + + set_self_chrflag(CHRCFLAG_00040000) + set_morale(0) + set_shotlist(AILIST_OFFICE1) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x42) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x42) + chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x02) + if_saw_injury(0x00, /*goto*/ LABEL_RUN_TO_FOYER) + if_stage_flag_eq(STAGEFLAG_OFFICE2_DEAD, TRUE, /*goto*/ LABEL_RUN_TO_FOYER) + if_object_in_good_condition(0x45, /*goto*/ 0x33) + goto_next(LABEL_RUN_TO_FOYER) + + label(0x33) + if_chr_idle(/*goto*/ 0x31) + goto_first(0x42) + + label(0x31) + endloop(0x00) + + // Jo in sight + label(0x02) + if_stage_flag_eq(STAGEFLAG_DISGUISED, FALSE, /*goto*/ 0x07) + + // Disguised + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) + goto_next(0x07) + + // Disguised and unarmed-ish + label(0x31) + chr_do_animation(ANIM_SITTING_0265, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + speak(CHR_TARGET, L_CAVE_041, MP3_02E6, CHANNEL_4, COLOR_08_RED) // "Are you new around here?" + + beginloop(0x09) + if_saw_injury(0x00, /*goto*/ LABEL_RUN_TO_FOYER) + if_stage_flag_eq(STAGEFLAG_OFFICE2_DEAD, TRUE, /*goto*/ LABEL_RUN_TO_FOYER) + if_chr_has_object(CHR_TARGET, OBJ_BRIEFCASE1, /*goto*/ 0x02) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) + goto_next(0x07) + + label(0x31) + if_chr_idle(/*goto*/ 0x31) + goto_next(0x7b) + + label(0x31) + reloop(0x09) + + label(0x7b) + chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + endloop(0x09) + + // Picked up briefcase + label(0x02) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + beginloop(0x0b) + if_sound_finished(CHANNEL_4, /*goto*/ 0x31) + reloop(0x0b) + + label(0x31) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(60, /*goto*/ 0x02) + endloop(0x0b) + + label(0x02) + speak(CHR_TARGET, L_CAVE_042, MP3_02E7, CHANNEL_4, COLOR_08_RED) // "Hey - give me back my case." + restart_timer + increase_squadron_alertness(100) + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x0a) + + label(0x02) + goto_next(LABEL_RUN_TO_FOYER) + + // Not disguised, or disguised with weapon equipped + label(0x07) + object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) + + beginloop(0x05) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(60, /*goto*/ 0x02) + endloop(0x05) + + label(0x72) + label(0x02) + speak(CHR_TARGET, L_CAVE_040, MP3_02E5, CHANNEL_4, COLOR_08_RED) // "Hey, you - this is a restricted area." + increase_squadron_alertness(100) + restart_timer + chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x06) + if_timer_gt(180, /*goto*/ LABEL_RUN_TO_FOYER) + endloop(0x06) + + // Run to foyer + label(LABEL_RUN_TO_FOYER) + jog_to_pad(PAD_CAVE_001B) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x08) + + label(0x02) + speak(CHR_TARGET, L_CAVE_044, MP3_02E8, CHANNEL_4, COLOR_08_RED) // "Upstairs...there's an intruder." + increase_squadron_alertness(100) + set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) + activate_alarm + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040e_init_office2[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_OFFICE2) + endlist +}; + +u8 func040a_office2[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_morale(0) + set_shotlist(AILIST_OFFICE2) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x42) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x42) + chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x00) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x02) + if_saw_injury(0x00, /*goto*/ 0x72) + if_stage_flag_eq(STAGEFLAG_OFFICE1_DEAD, TRUE, /*goto*/ 0x72) + if_chr_idle(/*goto*/ 0x31) + goto_first(0x42) + + label(0x31) + endloop(0x00) + + // Alert + label(0x02) + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x02) + if_saw_injury(0x00, /*goto*/ 0x02) + if_stage_flag_eq(STAGEFLAG_OFFICE1_DEAD, TRUE, /*goto*/ 0x72) + endloop(0x09) + + label(0x72) + label(0x02) + object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) + + // Wait for other guy to finish talking + beginloop(0x05) + if_sound_finished(CHANNEL_4, /*goto*/ 0x31) + reloop(0x05) + + label(0x31) + yield + yield + yield + yield + yield + if_sound_finished(CHANNEL_4, /*goto*/ 0x31) + reloop(0x05) + + label(0x31) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(60, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + if_chr_deadish(CHR_OFFICE1, /*goto*/ 0x02) + speak(CHR_TARGET, L_CAVE_043, MP3_02E9, CHANNEL_4, COLOR_09_BLUE) // "You get security - I'll deal with her..." + increase_squadron_alertness(100) + restart_timer + + beginloop(0x06) + if_chr_stopped(/*goto*/ 0x02) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x06) + + // Attack player + label(0x02) + set_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + // Unreachable + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_check_end_level[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_objective_complete(0, /*goto*/ 0x31) + goto_first(0x00) + + label(0x31) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x31) + if_objective_complete(1, /*goto*/ 0x31) + goto_first(0x00) + + label(0x31) + if_objective_complete(2, /*goto*/ 0x31) + goto_first(0x00) + + label(0x31) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x31) + if_objective_complete(3, /*goto*/ 0x31) + goto_first(0x00) + + label(0x31) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_CAVE_00E9, /*goto*/ 0x04) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_CAVE_00D5, /*goto*/ 0x05) + endloop(0x00) + + // Pad 0x00e9 + label(0x04) + set_stage_flag(STAGEFLAG_BOARDED_PLANE) + unset_savefile_flag(GAMEFILEFLAG_AF1_ENTRY) + if_chr_deadish(CHR_BOND, /*goto*/ 0x31) + goto_next(0x02) + + label(0x31) + if_chr_deadish(CHR_COOP, /*goto*/ 0x31) + goto_next(0x02) + + // Both players dead + label(0x31) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x02) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, 0x0425) + + // Pad 0x00d5 + label(0x05) + set_stage_flag(STAGEFLAG_BOARDED_PLANE) + set_savefile_flag(GAMEFILEFLAG_AF1_ENTRY) + if_chr_deadish(CHR_BOND, /*goto*/ 0x31) + goto_next(0x02) + + label(0x31) + if_chr_deadish(CHR_COOP, /*goto*/ 0x31) + goto_next(0x02) + + // Both players dead + label(0x31) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x02) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, 0x0425) + endlist +}; + +u8 func100d_laser_panel[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LASER_PANEL, /*goto*/ 0x04) + if_object_in_good_condition(OBJ_LASER_PANEL, /*goto*/ 0x02) + goto_next(0x05) + + label(0x02) + reloop(0x00) + + label(0x04) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_LASER_PANEL, TRUE) + show_hudmsg(CHR_P1P2, L_CAVE_045) // "Laser grid access denied." + endloop(0x00) + + label(0x05) + set_stage_flag(STAGEFLAG_LASERS_OVERLOADED) + show_hudmsg(CHR_P1P2, L_CAVE_046) // "Laser grid system has been overloaded." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_check_alaskans_killed[] = { + set_chr_chrflag(0x00, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x01, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x02, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x03, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x04, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x05, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x06, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x07, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x08, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x09, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0a, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0b, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0c, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0d, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0e, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0f, CHRCFLAG_KILLCOUNTABLE) + + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) + if_kill_count_gt(2, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + show_hudmsg(CHR_BOND, L_CAVE_047) // "Too many neutral casualties inflicted." + set_stage_flag(STAGEFLAG_TOO_MANY_NEUTRALS_KILLED) + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func0410_unused[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(22) + set_reaction_speed(80) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_00000040) + set_chr_chrflag(CHR_SELF, CHRCFLAG_00040000) + set_ailist(CHR_SELF, AILIST_NSA) + endlist +}; + +u8 func040f_nsa[] = { + set_shotlist(AILIST_NSA) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x44) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x44) + if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_PRESET, /*goto*/ 0x02) + + // Return to pad + walk_to_pad(PAD_PRESET) + + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_distance_to_target_lt(250, /*goto*/ 0x64) + if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, TRUE, BANK_0, /*goto*/ 0x33) + if_chr_in_room(CHR_TARGET, 0x00, 0x006b, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x006c, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x006d, /*goto*/ 0x31) + goto_first(0x00) + + label(0x33) + if_chr_in_room(CHR_TARGET, 0x00, 0x003c, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x003d, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x003e, /*goto*/ 0x31) + if_chr_y(CHR_TARGET, -257, OPERATOR_LESS_THAN, /*goto*/ 0x6d) // gone down an escalator + goto_next(0x76) + + label(0x6d) + if_chr_in_room(CHR_TARGET, 0x00, 0x003f, /*goto*/ 0x31) + label(0x76) + goto_first(0x00) + + label(0x31) + if_can_see_target(/*goto*/ 0x04) + if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_PRESET, /*goto*/ 0x02) + endloop(0x06) + + // At pad + label(0x02) + stop_chr + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x0b) + if_can_see_target(/*goto*/ 0x31) + endloop(0x00) + + // Seen player + label(0x31) + if_chr_y(CHR_TARGET, -330, OPERATOR_LESS_THAN, /*goto*/ 0x02) + goto_first(0x00) + + // Seen player down escalator + label(0x02) + if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, TRUE, BANK_0, /*goto*/ 0x33) + if_chr_in_room(CHR_TARGET, 0x00, 0x006b, /*goto*/ 0x04) + if_chr_in_room(CHR_TARGET, 0x00, 0x006c, /*goto*/ 0x04) + if_chr_in_room(CHR_TARGET, 0x00, 0x006d, /*goto*/ 0x04) + goto_first(0x00) + + label(0x33) + if_chr_in_room(CHR_TARGET, 0x00, 0x003c, /*goto*/ 0x04) + if_chr_in_room(CHR_TARGET, 0x00, 0x003d, /*goto*/ 0x04) + if_chr_in_room(CHR_TARGET, 0x00, 0x003e, /*goto*/ 0x04) + if_chr_y(CHR_TARGET, -257, OPERATOR_LESS_THAN, /*goto*/ 0x6d) + goto_next(0x76) + + // Seen player down escalator but not in security hall + label(0x6d) + if_chr_in_room(CHR_TARGET, 0x00, 0x003f, /*goto*/ 0x04) // escalator room + label(0x76) + goto_first(0x00) + + // Seen player in security hall or escalator room + label(0x04) + restart_timer + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_target_out_of_fov_left(245, /*goto*/ 0x02) + if_timer_gt(60, /*goto*/ 0x02) + endloop(0x09) + + label(0x02) + chr_do_animation(ANIM_TALKING_0098, 0, 90, 0, 16, CHR_SELF, 2) + say_quip(CHR_BOND, 0x1c, 0xff, 0x02, 0xff, 0x81, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x0a) + + label(0x02) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + // Unreachable + restart_timer + set_target_chr(CHR_P1P2) + try_walk_to_target(/*goto*/ 0x05) + + // Also unreachable + label(0x31) + restart_timer + set_target_chr(CHR_BOND) + try_run_to_target(/*goto*/ 0x05) + + beginloop(0x05) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + if_chr_stopped(/*goto*/ 0x32) + if_timer_gt(30, /*goto*/ 0x32) + if_chr_y(CHR_TARGET, -330, OPERATOR_LESS_THAN, /*goto*/ 0x02) + goto_next(0x07) + + label(0x02) + if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, TRUE, BANK_0, /*goto*/ 0x33) + if_chr_in_room(CHR_TARGET, 0x00, 0x006b, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x006c, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x006d, /*goto*/ 0x31) + goto_next(0x07) + + label(0x33) + if_chr_in_room(CHR_TARGET, 0x00, 0x003c, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x003d, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x003e, /*goto*/ 0x31) + if_chr_in_room(CHR_TARGET, 0x00, 0x003f, /*goto*/ 0x31) + goto_next(0x07) + + label(0x31) + if_distance_to_target_lt(250, /*goto*/ 0x02) + endloop(0x05) + + label(0x32) + goto_first(0x04) + + label(0x64) + label(0x02) + set_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_returnlist(CHR_SELF, AILIST_NSA) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + + label(0x07) + chr_do_animation(ANIM_TALKING_0098, 0, 90, 0, 16, CHR_SELF, 2) + say_quip(CHR_BOND, 0x1d, 0xff, 0x02, 0xff, 0x81, 0x00, 0x00) + label(0x08) + yield + if_chr_stopped(/*goto*/ 0x02) + goto_first(0x08) + + label(0x02) + goto_first(0x44) + + label(0x0b) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0412_init_takeover_lackey[] = { + set_shotlist(GAILIST_ALERTED) + set_self_chrflag(CHRCFLAG_00000040) + set_chr_dodge_rating(2, 10) + set_accuracy(60) + set_reaction_speed(80) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_TAKEOVER_LACKEY) + endlist +}; + +u8 func0411_takeover_lackey[] = { + set_shotlist(GAILIST_ALERTED) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x00) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_deadish(0x0c, /*goto*/ 0x7b) + if_target_in_sight(/*goto*/ 0x31) + goto_next(0x02) + + label(0x31) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x02) + label(0x02) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ 0x31) + if_target_in_sight(/*goto*/ 0x02) + label(0x31) + endloop(0x00) + + // Alaskan guard is dead + label(0x7b) + label(0x02) + set_chr_team(CHR_SELF, TEAM_04) + if_chr_deadish(0x0c, /*goto*/ 0x02) + set_target_chr(0x0c) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x31) + label(0x31) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) + + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x04) + + label(0x02) + speak(CHR_TARGET, L_CAVE_065, SFX_WERE_TAKING_OVER, CHANNEL_6, COLOR_08_RED) // "We're taking over!!" + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x09) + + label(0x02) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) + set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISE_UNCOVERED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func0413_alaskan_console_guard[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 unregistered_function3[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_OFFICEWORKER) + endlist +}; + +u8 func0414_officeworker[] = { + set_morale(0) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x00) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x44) + chr_do_animation(ANIM_SITTING_DORMANT, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) + if_chr_idle(/*goto*/ 0x02) + goto_next(0x08) + + label(0x02) + if_target_in_sight(/*goto*/ 0x02) + label(0x33) + endloop(0x00) + + label(0x02) + chr_do_animation(ANIM_SITTING_0265, 0, 120, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + say_quip(CHR_BOND, 0x20, 0xff, 0x0a, 0xff, BANK_1, 0x00, 0x00) + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) + if_chr_idle(/*goto*/ 0x02) + goto_next(0x08) + + label(0x02) + if_timer_gt(180, /*goto*/ 0x02) + endloop(0x09) + + label(0x02) + goto_first(0x00) + + label(0x08) + goto_first(0x44) + + // After takeover + label(0x07) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x6d) + set_chr_hiddenflag(0x3a, CHRHFLAG_00100000) + chr_move_to_pad(0x3a, PAD_CAVE_00D7, 0x00, /*goto*/ 0x31) + + label(0x31) + chr_do_animation(ANIM_SITTING_DORMANT, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + + label(0x77) + chr_do_animation(ANIM_COWER_0229, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x02) + if_chr_idle(/*goto*/ 0x31) + goto_first(0x77) + + label(0x31) + endloop(0x04) + + label(0x02) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x78) + + beginloop(0x78) + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(40, /*goto*/ 0x02) + endloop(0x78) + + label(0x02) + do_preset_animation(PRESETANIM_TALK7) + speak(CHR_TARGET, L_CAVE_054, MP3_0338, CHANNEL_4, COLOR_08_RED) // "Stop them - they're breaking into the safe..." + + beginloop(0x05) + if_sound_finished(CHANNEL_4, /*goto*/ 0x79) + endloop(0x05) + + label(0x79) + chr_do_animation(ANIM_COWER_0229, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x06) + if_chr_idle(/*goto*/ 0x02) + goto_first(0x79) + + label(0x02) + endloop(0x06) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x6d) + damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) + if_chr_dead(CHR_SELF, /*goto*/ 0x31) + endloop(0x6d) + + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_alaskan_mountainlift_guard[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1010_setup_baggage_carrier[] = { + set_object_flag(OBJ_BAGGAGE_CARRIER, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define laser_overloaded_logic(laser1, laser2, time) \ + beginloop(0x00) \ + if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x04) \ + endloop(0x00) \ + \ + label(0x04) \ + restart_timer \ + open_door(laser1) \ + open_door(laser2) \ + \ + beginloop(0x05) \ + if_timer_gt(time, /*goto*/ 0x02) \ + endloop(0x05) \ + \ + label(0x02) \ + close_door(laser1) \ + close_door(laser2) \ + \ + beginloop(0x05) \ + if_timer_gt(time, /*goto*/ 0x02) \ + endloop(0x05) \ + \ + label(0x02) \ + goto_first(0x04) \ + \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 func1011_lasers1[] = { + laser_overloaded_logic(0x07, 0x0c, 120) + endlist +}; + +u8 func1012_lasers2[] = { + laser_overloaded_logic(0x0e, 0x10, 180) + endlist +}; + +u8 func1013_lasers3[] = { + laser_overloaded_logic(0x0b, 0x12, 90) + endlist +}; + +u8 func1014_lasers4[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x04) + endloop(0x00) + + label(0x04) + restart_timer + open_door(0x11) + + beginloop(0x05) + if_timer_gt(180, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + close_door(0x11) + + beginloop(0x05) + if_timer_gt(180, /*goto*/ 0x02) + endloop(0x05) + + label(0x02) + goto_first(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This is the first laser, which gets disabled permanently. + */ +u8 func1017_laser5[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x04) + endloop(0x00) + + label(0x04) + restart_timer + disable_object(0x13) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + open_door(0x13) + + beginloop(0x05) + if_door_state(0x13, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x31) + endloop(0x05) + + label(0x31) + goto_first(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0403_unused[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(45) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(30) + set_shield(0) + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_unhide_laser_guards[] = { + // These are all invalid chrs. They must have been removed. + // They would have appeared when the lasers were overloaded. + disable_chr(0x3e) + disable_chr(0x3f) + disable_chr(0x40) + disable_chr(0x41) + set_chr_chrflag(0x3e, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x3f, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x40, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x41, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + unset_chr_chrflag(0x3e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x3f, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x40, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x41, CHRCFLAG_HIDDEN) + enable_chr(0x3e) + set_ailist(0x3e, 0x0404) + enable_chr(0x3f) + set_ailist(0x3f, GAILIST_ALERTED) + enable_chr(0x40) + set_ailist(0x40, GAILIST_ALERTED) + enable_chr(0x41) + set_ailist(0x41, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * After overloading the lasers, some guards would have been unhidden who will + * chase you down. This function would have been assigned to one of them. + * + * @unused + */ +u8 func0404_laser_guard[] = { + set_shotlist(GAILIST_UNALERTED) + run_to_pad(PAD_CAVE_0002) + label(0x04) + yield + label(0x02) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_console_noises[] = { + yield + assign_sound(SFX_8141, CHANNEL_0) + play_sound_from_object(CHANNEL_0, 0x04, 1, 600, 800) + yield + assign_sound(SFX_8143, CHANNEL_2) + play_sound_from_object(CHANNEL_2, 0x05, 1, 500, 1000) + yield + play_sound_from_pad(PAD_CAVE_0114, SFX_81A7) + yield + play_sound_from_pad(PAD_CAVE_0115, SFX_81A7) + yield + play_sound_from_pad(PAD_CAVE_01AC, SFX_811B) + + label(0x42) + restart_timer + + beginloop(0x00) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x09) + + label(0x31) + if_timer_gt(180, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + yield + if_object_in_good_condition(0x01, /*goto*/ 0x31) + goto_next(0x09) + + label(0x31) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x09) + call_rng + if_rand_lt(100, /*goto*/ 0x76) + if_rand_lt(150, /*goto*/ 0x77) + if_rand_lt(200, /*goto*/ 0x78) + goto_first(0x42) + + // Rand 1 + label(0x76) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x09) + + label(0x31) + mute_channel(CHANNEL_1) + yield + yield + yield + yield + yield + assign_sound(SFX_8112, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_CONSOLE, 1, 600, 800) + goto_first(0x42) + + // Rand 2 + label(0x77) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x09) + + label(0x31) + mute_channel(CHANNEL_1) + yield + yield + yield + yield + yield + assign_sound(SFX_813F, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_CONSOLE, 1, 600, 800) + goto_first(0x42) + + // Rand 3 + label(0x78) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x09) + + label(0x31) + mute_channel(CHANNEL_1) + yield + yield + yield + yield + yield + assign_sound(SFX_8140, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_CONSOLE, 1, 600, 800) + goto_first(0x42) + + label(0x09) + mute_channel(CHANNEL_1) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0426_init_alaskan_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Assigned to stripes guards and NSA lackeys during takeover. + */ +u8 func0427_init_posttakeover_guard[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_team(CHR_SELF, TEAM_04) + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(45) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(30) + set_shield(0) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_POSTTAKEOVER_GUARD) + endlist +}; + +/** + * Wait until not in sight by any human player, + * then assign AILIST_BECOME_UNALERTED. + */ +u8 func0428_posttakeover_guard[] = { + beginloop(0x00) + set_target_chr(CHR_BOND) + if_nearly_in_targets_sight(30, /*goto*/ 0x31) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x02) + set_target_chr(CHR_COOP) + if_nearly_in_targets_sight(30, /*goto*/ 0x31) + + label(0x02) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x02) + set_target_chr(CHR_ANTI) + if_nearly_in_targets_sight(30, /*goto*/ 0x31) + + label(0x02) + unset_self_chrflag(CHRCFLAG_HIDDEN) + unset_self_chrflag(CHRCFLAG_00040000) + set_ailist(CHR_SELF, AILIST_BECOME_UNALERTED) + + label(0x31) + restart_timer + + beginloop(0x6d) + if_timer_gt(300, /*goto*/ 0x02) + endloop(0x6d) + + label(0x02) + endloop(0x00) + + endlist +}; + +/** + * @unused + */ +u8 func0429_unused[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(22) + set_reaction_speed(80) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Assigned to two stripes guards in the foyer during takeover. + */ +u8 func042a_foyer_spawner[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(12) + set_reaction_speed(45) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(30) + set_shield(0) + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) + if_chr_y(CHR_TARGET, -4800, OPERATOR_LESS_THAN, /*goto*/ 0x09) + reloop(0x00) + + // Security shut down + label(0x02) + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + if_never_been_onscreen(/*goto*/ 0x6a) + if_can_see_target(/*goto*/ 0x04) + reloop(0x00) + + label(0x04) + set_ailist(CHR_SELF, AILIST_FOYER_CLONE) + + label(0x6a) + unset_self_chrflag(CHRCFLAG_HIDDEN) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x6a) + reloop(0x00) + + label(0x6a) + try_spawn_clone2(CHR_SELF, AILIST_INIT_FOYER_CLONE, 0, /*goto*/ 0x31) + label(0x31) + yield + endloop(0x00) + + // Player has gone to bottom without disabling security + label(0x09) + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +u8 func042b_init_foyer_clone[] = { + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + label(0x00) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x42, /*goto*/ 0x02) + label(0x02) + set_ailist(CHR_SELF, AILIST_FOYER_CLONE) + endlist +}; + +u8 func042c_foyer_clone[] = { + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +#define hoverbot_do_paths(path1, path2, path3) \ + /* Path 1 */ \ + label(0x44) \ + begin_hovercar_path(path1) \ + label(0x31) \ + set_vehicle_speed(512, 120) \ + \ + beginloop(0x04) \ + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 3, /*goto*/ 0x02) \ + endloop(0x04) \ + \ + /* Path 2 */ \ + label(0x02) \ + begin_hovercar_path(path2) \ + label(0x31) \ + set_vehicle_speed(512, 120) \ + \ + beginloop(0x05) \ + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 3, /*goto*/ 0x02) \ + endloop(0x05) \ + \ + /* Path 3 */ \ + label(0x02) \ + begin_hovercar_path(path3) \ + label(0x31) \ + set_vehicle_speed(512, 120) \ + \ + beginloop(0x06) \ + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 3, /*goto*/ 0x02) \ + endloop(0x06) \ + \ + label(0x02) \ + goto_first(0x44) \ + \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 func042d_hoverbot1[] = { + hoverbot_do_paths(0, 1, 2) + endlist +}; + +u8 func042e_hoverbot2[] = { + hoverbot_do_paths(1, 2, 0) + endlist +}; + +u8 func042f_hoverbot3[] = { + hoverbot_do_paths(2, 0, 1) + endlist +}; + +u8 func0430_hoverbot4[] = { + hoverbot_do_paths(3, 4, 5) + endlist +}; + +u8 func0431_hoverbot5[] = { + hoverbot_do_paths(4, 5, 3) + endlist +}; + +u8 func0432_hoverbot6[] = { + hoverbot_do_paths(5, 3, 4) + endlist +}; + +/** + * This looks to be copied from Chicago? But is assigned to an chr called + * steward. + */ +u8 func0419_ba8c[] = { + set_alertness(255) + set_returnlist(CHR_SELF, 0x0419) + set_shotlist(0x0419) + if_chr_deadish(CHR_SELF, /*goto*/ 0x02) + goto_next(0x31) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x31) + if_chr_idle(/*goto*/ 0x6b) + if_num_times_shot_lt(1, /*goto*/ 0x00) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x02) + endloop(0x0c) + + label(0x02) + goto_next(0x0b) + + // Unreachable + restart_timer + + beginloop(0x6b) + if_saw_death(0x00, /*goto*/ 0x4f) + if_saw_injury(0x00, /*goto*/ 0x0f) + if_timer_gt(180, /*goto*/ 0x02) + endloop(0x6b) + + label(0x02) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x33) + stop_chr + goto_next(0x00) + + label(0x33) + start_patrol + + label(0x00) + yield + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x6c) + call_rng + if_rand_gt(128, /*goto*/ 0x6c) + + label(0x6d) + restart_timer + + label(0x07) + stop_chr + if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x31) + call_rng + if_rand_gt(128, /*goto*/ 0x31) + call_rng + if_rand_lt(64, /*goto*/ 0x6e) + if_rand_lt(128, /*goto*/ 0x6f) + if_rand_lt(196, /*goto*/ 0x70) + set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + chr_do_animation(ANIM_SMOKE_CIGARETTE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x72) + + label(0x6e) + chr_do_animation(ANIM_SCRATCH_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x72) + + label(0x6f) + chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x72) + + label(0x70) + chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x72) + + label(0x71) + chr_do_animation(ANIM_TWO_GUN_HOLD, 0, 100, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x72) + + label(0x31) + unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_PRESET, /*goto*/ 0x02) + goto_next(0x31) + + label(0x02) + call_rng + if_rand_lt(64, /*goto*/ 0x6e) + if_rand_lt(128, /*goto*/ 0x6f) + if_rand_lt(196, /*goto*/ 0x70) + try_set_target_pad_to_something(0x08, /*goto*/ 0x31) + label(0x6e) + try_set_target_pad_to_something(0x02, /*goto*/ 0x31) + label(0x6f) + try_set_target_pad_to_something(0x04, /*goto*/ 0x31) + label(0x70) + try_set_target_pad_to_something(0x08, /*goto*/ 0x31) + goto_next(0x72) + label(0x31) + go_to_target_pad(GOPOSFLAG_WALK) + restart_timer + label(0x72) + yield + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_saw_death(0x00, /*goto*/ 0x4f) + if_saw_injury(0x00, /*goto*/ 0x0f) + if_target_in_sight(/*goto*/ 0x02) + if_chr_stopped(/*goto*/ 0x73) + if_chr_idle(/*goto*/ 0x31) + if_timer_gt(180, /*goto*/ 0x73) + label(0x31) + goto_first(0x72) + + label(0x73) + goto_first(0x00) + + label(0x6c) + if_saw_death(0x00, /*goto*/ 0x4f) + if_saw_injury(0x00, /*goto*/ 0x0f) + if_target_in_sight(/*goto*/ 0x02) + goto_first(0x00) + + label(0x02) + restart_timer + label(0x04) + yield + if_saw_death(0x00, /*goto*/ 0x4f) + if_saw_injury(0x00, /*goto*/ 0x0f) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) + goto_next(0x02) + label(0x31) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x31) + if_distance_to_target_gt(450, /*goto*/ 0x31) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_returnlist(CHR_SELF, 0x0419) + set_ailist(CHR_SELF, GAILIST_CIVILIAN_SAY_COMMENT) + label(0x31) + if_timer_lt(600, /*goto*/ 0x31) + unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + label(0x31) + goto_first(0x00) + + label(0x0f) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + label(0x08) + yield + if_target_in_fov_left(10, /*goto*/ 0x02) + if_timer_gt(40, /*goto*/ 0x02) + goto_first(0x08) + + label(0x4f) + restart_timer + chr_do_animation(ANIM_LOOK_AROUND_FRANTIC, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + label(0x0f) + yield + if_timer_gt(90, /*goto*/ 0x0b) + goto_first(0x0f) + + label(0x02) + say_quip(CHR_BOND, 0x24, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + label(0x09) + yield + if_timer_gt(120, /*goto*/ 0x0b) + goto_first(0x09) + + label(0x0b) + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x02) + goto_next(0x0e) + label(0x31) + goto_first(0x04) + + label(0x02) + try_run_to_chr(CHR_PRESET, /*goto*/ 0x05) + label(0x05) + yield + if_detected_chr(CHR_PRESET, /*goto*/ 0x02) + goto_first(0x05) + + label(0x02) + increase_squadron_alertness(100) + say_quip(CHR_BOND, 0x25, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) + label(0x0e) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) + label(0x0a) + yield + if_chr_stopped(/*goto*/ 0x31) + goto_first(0x0a) + + label(0x31) + goto_first(0x0e) + + endlist +}; + +u8 func041a_draw_magnum[] = { + set_chr_team(CHR_SELF, TEAM_04) + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x00) + label(0x00) + unset_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_self_flag_bankx(CHRFLAG1_PREWARNED, BANK_1) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func141b_setup_lifts[] = { + activate_lift(1, 0x20) + activate_lift(2, 0x21) + activate_lift(9, 0x36) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_safe_switch[] = { + set_object_flag2(OBJ_FLIGHTPLANS, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) + + // Wait for player to activate switch + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_SAFE_SWITCH, /*goto*/ 0x31) + endloop(0x00) + + // Raise switch cover + label(0x31) + unset_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) + + beginloop(0x05) + if_lift_stationary(OBJ_SAFE_SWITCH_COVER, /*goto*/ 0x31) + endloop(0x05) + + label(0x31) + set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) + + // Wait for player to press button again + beginloop(0x06) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_SAFE_SWITCH, /*goto*/ 0x31) + endloop(0x06) + + // Open safe + label(0x31) + play_sound(SFX_PRESS_SWITCH, -1) + yield + yield + yield + yield + yield + open_door(OBJ_SAFEDOOR) + yield + set_object_flag(OBJ_SAFEDOOR, OBJFLAG_DOOR_KEEPOPEN) + + unset_object_flag2(OBJ_FLIGHTPLANS, OBJFLAG2_INVISIBLE) + unset_object_flag(OBJ_FLIGHTPLANS, OBJFLAG_UNCOLLECTABLE) + set_object_flag(OBJ_FLIGHTPLANS, OBJFLAG_COLLECTABLE) + set_object_flag2(OBJ_FLIGHTPLANS, OBJFLAG2_PICKUPWITHOUTLOS) + + // 0x32 = a shield + set_object_flag2(0x34, OBJFLAG2_PICKUPWITHOUTLOS) + unset_object_flag(0x34, OBJFLAG_UNCOLLECTABLE) + + // 0x32 = invalid object + unset_object_flag2(0x32, OBJFLAG2_INVISIBLE) + unset_object_flag(0x32, OBJFLAG_UNCOLLECTABLE) + + label(0x31) + + beginloop(0x08) + if_door_state(OBJ_SAFEDOOR, DOORSTATE_CLOSING, /*goto*/ 0x31) + reloop(0x08) + + label(0x31) + open_door(OBJ_SAFEDOOR) + endloop(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_safe_switch_cover[] = { + set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) + + beginloop(0x00) + if_chr_activated_object(CHR_ANY, OBJ_SAFE_SWITCH_COVER, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + unset_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) + yield + yield + + beginloop(0x04) + if_lift_stationary(OBJ_SAFE_SWITCH_COVER, /*goto*/ 0x31) + endloop(0x04) + + label(0x31) + set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_CANNOT_ACTIVATE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_check_disguise_used[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + show_hudmsg(CHR_P1P2, L_CAVE_049) // "Disguise worn." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_intro[] = { + label(0x31) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_AIRBASE_INTRO) + camera_movement(ANIM_CUT_CAVE_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_hudpiece_visible(CHR_BOND, TRUE) + set_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TRENT, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 4) + set_chr_chrflag(0x48, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x48, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x48, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x48, 4) + set_chr_chrflag(0x49, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x49, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x49, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x49, 4) + set_chr_chrflag(0x4a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x4a, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x4a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x4a, 4) + set_chr_chrflag(0x4b, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x4b, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x4b, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_GUARD1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x4b, 4) + set_chr_chrflag(0x4c, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x4c, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x4c, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_GUARD2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x4c, 4) + enable_object(0x22) + set_object_flag2(0x22, OBJFLAG2_04000000) + set_object_flag3(0x22, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_CAVE_INTRO_CABLECAR, 0x22, 0x04, 0xffff) + enable_object(0x2f) + set_object_flag2(0x2f, OBJFLAG2_04000000) + set_object_flag3(0x2f, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_CAVE_INTRO_BINOCULARS, 0x2f, 0x04, 0xffff) + restart_timer + fade_to_color(0x000000ff, 0x0000) + fade_to_color(0x00000000, 0x006e) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + wait_until(30, 0x6d) + speak(CHR_BOND, L_CAVE_055, MP3_0447, CHANNEL_7, COLOR_09_BLUE) // "Agent Dark in position. I can see the main entranc..." + + wait_until(312, 0x89) + play_sound(SFX_0594, CHANNEL_10) + + wait_until(346, 0x8a) + play_sound(SFX_0595, CHANNEL_10) + + wait_until(580, 0x76) + speak(CHR_BOND, L_CAVE_056, MP3_0448, CHANNEL_10, COLOR_06_WHITE) // "Excellent, Joanna. That cable car is your way in....." + + wait_until(968, 0x8b) + play_sound(SFX_0596, CHANNEL_10) + + wait_until(1315, 0x77) + speak(CHR_BOND, L_CAVE_057, MP3_07DB, CHANNEL_10, COLOR_09_BLUE) // "That they're probably innocent of any involvement ..." + + wait_until(1411, 0x8e) + play_sound(SFX_04AF, CHANNEL_0) + + wait_until(1735, 0x85) + mute_channel(CHANNEL_0) + play_sound(SFX_04EA, CHANNEL_10) + + wait_until(1800, 0x86) + play_sound(SFX_04EB, CHANNEL_10) + + wait_until(1890, 0x87) + play_sound(SFX_04EC, CHANNEL_10) + + wait_until(1900, 0x78) + speak(CHR_BOND, L_CAVE_058, MP3_0449, CHANNEL_5, COLOR_06_WHITE) // "I don't know how far the conspiracy has spread thr..." + + wait_until(1970, 0x8c) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(1980, 0x88) + + wait_until(2013, 0x8d) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(2048, 0x8f) + play_sound(SFX_0596, CHANNEL_10) + + wait_until(2076, 0x92) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(2088, 0x93) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(2116, 0x94) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(2140, 0x95) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(2154, 0x96) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(2184, 0x97) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(2202, 0x98) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(2246, 0x99) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(2296, 0x9a) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(2332, 0x9b) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(2376, 0x9c) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(2418, 0x9d) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(2446, 0x9e) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(2486, 0x9f) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(2526, 0xa0) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(2558, 0xa1) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(2674, 0xa2) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(2700, 0x79) + speak(CHR_BOND, L_CAVE_059, MP3_044A, CHANNEL_7, COLOR_09_BLUE) // "Yes, and protect him from his abductors. Do you ha..." + + wait_until(2704, 0xa3) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(2720, 0xa4) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(2770, 0xa5) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(2796, 0xa6) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(2812, 0xa7) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(2830, 0xa8) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(2846, 0xa9) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(2856, 0xaa) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(2890, 0xab) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(2946, 0xac) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(2976, 0xad) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(3008, 0xae) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(3116, 0xaf) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(3154, 0xb0) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3188, 0xb1) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(3230, 0xb2) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(3250, 0x7a) + speak(CHR_BOND, L_CAVE_060, MP3_044B, CHANNEL_5, COLOR_06_WHITE) // "Only vague suspicions, and I won't distract you wi..." + + wait_until(3387, 0xb3) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(3427, 0xb4) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(3448, 0xb5) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(3656, 0xb6) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(3723, 0x90) + + wait_until(3796, 0x91) + play_sound(SFX_04FC, CHANNEL_10) + + beginloop(0x04) + if_camera_animating(/*goto*/ 0x31) + goto_next(0x48) + + label(0x31) + if_controller_button_pressed(/*goto*/ 0x48) + label(0x31) + endloop(0x04) + + label(0x48) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_10) + disable_object(0x22) + disable_object(0x2f) + label(0x02) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x48, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x49, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x4a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x4b, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x4c, CHRCFLAG_UNPLAYABLE) + remove_chr(CHR_TRENT) + remove_chr(0x48) + remove_chr(0x4a) + remove_chr(0x4b) + remove_chr(0x4c) + set_chr_chrflag(0x49, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x49, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x49, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x49, 2) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_CAVE_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + set_chr_hudpiece_visible(CHR_BOND, FALSE) + unset_object_flag2(0x22, OBJFLAG2_04000000) + set_object_flag3(0x22, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_CAVE_INTRO_CABLECAR, 0x22, 0x01, 0xfffe) + set_ailist(0x00, 0x0405) + set_ailist(0x01, 0x0405) + set_ailist(CHR_STEWARDESS, AILIST_STEWARDESS) + stop_cutscene_track + stop_ambient_track + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_msg_nowsyourchance[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + speak(CHR_BOND, L_CAVE_050, SFX_8182, CHANNEL_6, COLOR_09_BLUE) // "Now's your chance! Grab the stewardess's bag and g..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_msg_usethatcase[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) + + restart_timer + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_BRIEFCASE1, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + restart_timer + + beginloop(0x04) + if_timer_gt(600, /*goto*/ 0x31) + reloop(0x04) + + label(0x31) + if_sound_finished(CHANNEL_4, /*goto*/ 0x31) + endloop(0x04) + + label(0x31) + speak(CHR_P1P2, L_CAVE_051, SFX_8183, CHANNEL_4, COLOR_09_BLUE) // "Use that case to conceal your equipment." + + label(0x09) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_msg_casewillgetstopped[] = { + beginloop(0x00) + if_objective_complete(1, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + restart_timer + + beginloop(0x04) + if_timer_gt(120, /*goto*/ 0x31) + endloop(0x04) + + label(0x31) + speak(CHR_BOND, L_CAVE_052, SFX_8184, CHANNEL_6, COLOR_09_BLUE) // "The case will get stopped unless you do something." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_msg_smallerthanithought[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0025, /*goto*/ 0x31) + if_chr_in_room(CHR_P1P2, 0x00, 0x001c, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + speak(CHR_P1P2, L_CAVE_053, MP3_03C7, CHANNEL_6, COLOR_09_BLUE) // "So that's Air Force One? ... Huh, smaller than I t..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_check_office1_dead[] = { + beginloop(0x00) + if_chr_deadish(CHR_OFFICE1, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + set_stage_flag(STAGEFLAG_OFFICE1_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1023_check_office2_dead[] = { + beginloop(0x00) + if_chr_deadish(CHR_OFFICE2, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + set_stage_flag(STAGEFLAG_OFFICE2_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1024_double_dy357[] = { + set_object_flag(0x30, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(0x30, OBJFLAG2_INVISIBLE) + set_object_flag(0x31, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(0x31, OBJFLAG2_INVISIBLE) + + beginloop(0x00) + if_chr_knockedout(0x10, /*goto*/ 0x31) + reloop(0x00) + + label(0x31) + if_chr_knockedout(0x11, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + unset_object_flag(0x30, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x30, OBJFLAG2_INVISIBLE) + unset_object_flag(0x31, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x31, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func0416_watch_flag[] = { + beginloop(0x00) + if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_ANTINONINTERACTABLE, /*goto*/ 0x31) + reloop(0x00) + + label(0x31) + endloop(0x00) + + endlist +}; + +u8 func101a_check_disguise_used2[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_UNIFORM, /*goto*/ 0x02) + endloop(0x00) + + label(0x02) + + beginloop(0x04) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x31) + endloop(0x04) + + label(0x31) + if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ 0x02) + if_stage_flag_eq(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY, TRUE, /*goto*/ 0x02) + set_stage_flag(STAGEFLAG_DISGUISED) + set_stage_flag(STAGEFLAG_DISGUISED2) + label(0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x00) + endlist +}; + +u8 func1026_check_alarm_destroyed[] = { + beginloop(0x00) + if_object_in_good_condition(OBJ_ALARM, /*goto*/ 0x31) + activate_alarm + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x31) + endloop(0x00) + + endlist +}; + +u8 func0417_remove_or_unalert[] = { + set_self_chrflag(CHRCFLAG_00040000) + + label(0x00) + yield + set_target_chr(CHR_BOND) + if_nearly_in_targets_sight(30, /*goto*/ 0x02) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) + set_target_chr(CHR_COOP) + if_nearly_in_targets_sight(30, /*goto*/ 0x02) + label(0x31) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x04) + set_target_chr(CHR_ANTI) + if_nearly_in_targets_sight(30, /*goto*/ 0x02) + label(0x04) + yield + chr_drop_weapon(CHR_SELF) + remove_chr(CHR_SELF) + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x02) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0418_remove_or_cower[] = { + set_self_chrflag(CHRCFLAG_00040000) + label(0x00) + yield + set_target_chr(CHR_BOND) + if_nearly_in_targets_sight(30, /*goto*/ 0x02) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) + set_target_chr(CHR_COOP) + if_nearly_in_targets_sight(30, /*goto*/ 0x02) + label(0x31) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x04) + set_target_chr(CHR_ANTI) + if_nearly_in_targets_sight(30, /*goto*/ 0x02) + label(0x04) + yield + remove_chr(CHR_SELF) + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x02) + label(0x62) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x63) + if_chr_stopped(/*goto*/ 0x31) + endloop(0x63) + + label(0x31) + goto_first(0x62) + + endlist +}; + +u8 func102a_setup_snow[] = { + enable_snow(TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1027_remotemine[] = { + beginloop(0x00) + if_object_in_good_condition(OBJ_REMOTEMINE, /*goto*/ 0x31) + goto_next(0x02) + + label(0x31) + reloop(0x00) + + label(0x02) + destroy_object(OBJ_REMOTEMINE) + yield + destroy_object(0x46) + yield + destroy_object(0x47) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x31) + endloop(0x00) + + endlist +}; + +u8 func141b_setup_lifts_and_doors[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x31) + + // SA and PA + unlock_door(0x35, 0x80) + goto_next(0x02) + + // Agent + label(0x31) + disable_object(0x09) + label(0x02) + set_object_flag(OBJ_DIAGONAL_LIFT, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_VERTICAL_LIFT, OBJFLAG_DEACTIVATED) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) + endloop(0x04) + + label(0x02) + unset_object_flag(OBJ_DIAGONAL_LIFT, OBJFLAG_DEACTIVATED) + unset_object_flag(OBJ_VERTICAL_LIFT, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1029_lift_doors[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x37, /*goto*/ 0x31) + if_chr_activated_object(CHR_P1P2, 0x38, /*goto*/ 0x31) + if_chr_activated_object(CHR_P1P2, 0x39, /*goto*/ 0x31) + if_chr_activated_object(CHR_P1P2, 0x42, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x43, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x3b, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x3c, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x3f, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x40, /*goto*/ 0x05) + if_chr_activated_object(CHR_P1P2, 0x41, /*goto*/ 0x05) + reloop(0x00) + + label(0x31) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x05) + show_hudmsg(CHR_P1P2, L_CAVE_061) // "Lift inoperative - security system is active." + restart_timer + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x05) + if_timer_gt(120, /*goto*/ 0x31) + endloop(0x04) + + label(0x31) + reloop(0x00) + + label(0x05) + play_sound(SFX_DOOR_81B0, -1) + restart_timer + + beginloop(0x06) + if_timer_gt(120, /*goto*/ 0x02) + endloop(0x06) + + label(0x02) + endloop(0x00) + + endlist +}; + +u8 func102b_check_secretary_dead[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x09) + if_chr_deadish(CHR_SECRETARY, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + if_door_locked(0x18, 0x02, /*goto*/ 0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x31) + show_hudmsg(CHR_BOND, L_CAVE_062) // "Critical mission personnel disabled." + set_stage_flag(STAGEFLAG_SECRETARY_DEAD) + label(0x09) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102c_lock_door_on_alarm[] = { + beginloop(0x00) + if_alarm_active(/*goto*/ 0x31) + endloop(0x00) + + label(0x31) + lock_door(0x18, 0x04) + close_door(0x18) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102d_check_console_destroyed[] = { + beginloop(0x00) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) + goto_next(0x02) + + label(0x31) + endloop(0x00) + + label(0x02) + mute_channel(CHANNEL_1) + if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x31) + set_stage_flag(STAGEFLAG_CONSOLE_DESTROYED) + show_hudmsg(CHR_BOND, L_CAVE_063) // "Critical mission object destroyed." + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102e_check_base_entered[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x002e, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + show_hudmsg(CHR_BOND, L_CAVE_064) // "Entrance to base secured." + set_stage_flag(STAGEFLAG_ENTERED_BASE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102f_undisguise_on_alarm[] = { + beginloop(0x00) + if_alarm_active(/*goto*/ 0x31) + endloop(0x00) + + label(0x31) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) + set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISE_UNCOVERED) + label(0x31) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1030_setup_rtracker[] = { + yield + set_object_flag3(0x30, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(0x31, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1031_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x007b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0080, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0081, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0082, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0083, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0083, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0084, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0085, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0086, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0086, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0087, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0087, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0088, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0088, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0089, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0090, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0091, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1032_unhide_guards_near_plane[] = { + // Wait until player is in a room near the plane. If you ride the vertical + // elevator all the way to the bottom, then come out and turn left, you'll + // walk through these rooms before reaching the stairs. + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0016, /*goto*/ 0x31) + if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x31) + endloop(0x00) + + label(0x31) + enable_chr(0x1b) + set_ailist(0x1b, 0x0422) + unset_chr_hiddenflag(0x1b, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_chrflag(0x1b, CHRCFLAG_HIDDEN) + yield + enable_chr(0x19) + set_ailist(0x19, AILIST_INIT_POSTTAKEOVER_GUARD) + unset_chr_hiddenflag(0x19, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_chrflag(0x19, CHRCFLAG_HIDDEN) + yield + enable_chr(0x1d) + set_ailist(0x1d, AILIST_INIT_POSTTAKEOVER_GUARD) + unset_chr_hiddenflag(0x1d, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_chrflag(0x1d, CHRCFLAG_HIDDEN) + yield + enable_chr(0x1e) + set_ailist(0x1e, AILIST_INIT_POSTTAKEOVER_GUARD) + unset_chr_hiddenflag(0x1e, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_chrflag(0x1e, CHRCFLAG_HIDDEN) + yield + enable_chr(0x20) + set_ailist(0x20, AILIST_INIT_POSTTAKEOVER_GUARD) + unset_chr_hiddenflag(0x20, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_chrflag(0x20, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1420_setup_portals[] = { + yield + set_room_flag(0x0080, ROOMFLAG_0800) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_rebuild_groups, 0x1000 }, + { func1401_setup_counterop, 0x1401 }, + { func1002_objectives_failed_msg, 0x1002 }, + { func1003_intro, 0x1003 }, + { func1004_guard_activation, 0x1004 }, + { func1005_check_civilians_killed, 0x1005 }, + { func1007_console_activation, 0x1007 }, + { func1009_carousel_activation, 0x1009 }, + { func100b_suitcase_scanning, 0x100b }, + { func100c_check_end_level, 0x100c }, + { func100d_laser_panel, 0x100d }, + { func100e_check_alaskans_killed, 0x100e }, + { func1010_setup_baggage_carrier, 0x1010 }, + { func1011_lasers1, 0x1011 }, + { func1012_lasers2, 0x1012 }, + { func1013_lasers3, 0x1013 }, + { func1014_lasers4, 0x1014 }, + { func1015_unhide_laser_guards, 0x1015 }, + { func1016_console_noises, 0x1016 }, + { func1017_laser5, 0x1017 }, + { func1018_safe_switch, 0x1018 }, + { func1018_safe_switch_cover, 0x1019 }, + { func101a_check_disguise_used, 0x101a }, + { func141b_setup_lifts, 0x141b }, + { func101c_msg_nowsyourchance, 0x101c }, + { func101d_msg_usethatcase, 0x101d }, + { func101e_msg_casewillgetstopped, 0x101e }, + { func101f_msg_smallerthanithought, 0x101f }, + { func1020_weapon_scanning_bond, 0x1020 }, + { func1021_weapon_scanning_coop, 0x1021 }, + { func1022_check_office1_dead, 0x1022 }, + { func1023_check_office2_dead, 0x1023 }, + { func1024_double_dy357, 0x1024 }, + { func101a_check_disguise_used2, 0x1025 }, + { func1026_check_alarm_destroyed, 0x1026 }, + { func1027_remotemine, 0x1027 }, + { func141b_setup_lifts_and_doors, 0x1028 }, + { func1029_lift_doors, 0x1029 }, + { func102a_setup_snow, 0x102a }, + { func102b_check_secretary_dead, 0x102b }, + { func102c_lock_door_on_alarm, 0x102c }, + { func102d_check_console_destroyed, 0x102d }, + { func102e_check_base_entered, 0x102e }, + { func102f_undisguise_on_alarm, 0x102f }, + { func1030_setup_rtracker, 0x1030 }, + { func1031_setup_environment, 0x1031 }, + { func1032_unhide_guards_near_plane, 0x1032 }, + { func1420_setup_portals, 0x1420 }, + { func0404_laser_guard, 0x0404 }, + { func0403_unused, 0x0403 }, + { func0402_init_stripes, 0x0402 }, + { func0401_unused_cutscene, 0x0401 }, + { func0405_start_path15, 0x0405 }, + { func0406_become_unalerted, 0x0406 }, + { func041b_start_path06, 0x041b }, + { func041c_start_path07, 0x041c }, + { func041d_start_path08, 0x041d }, + { func041e_start_path09, 0x041e }, + { func041f_start_path10, 0x041f }, + { func0420_start_path11, 0x0420 }, + { func0421_start_path12, 0x0421 }, + { func0422_start_path13, 0x0422 }, + { func0423_start_path14, 0x0423 }, + { func0424_start_path15_unused, 0x0424 }, + { func0407_stewardess, 0x0407 }, + { func0408_secretary, 0x0408 }, + { func0409_office1, 0x0409 }, + { func040a_office2, 0x040a }, + { func040b_unused, 0x040b }, + { func040c_init_secretary, 0x040c }, + { func040d_init_office1, 0x040d }, + { func040e_init_office2, 0x040e }, + { func040f_nsa, 0x040f }, + { func0410_unused, 0x0410 }, + { func0411_takeover_lackey, 0x0411 }, + { func0412_init_takeover_lackey, 0x0412 }, + { func0413_alaskan_console_guard, 0x0413 }, + { func0414_officeworker, 0x0414 }, + { func0415_alaskan_mountainlift_guard, 0x0415 }, + { func0416_watch_flag, 0x0416 }, + { func0417_remove_or_unalert, 0x0417 }, + { func0418_remove_or_cower, 0x0418 }, + { func0419_ba8c, 0x0419 }, + { func041a_draw_magnum, 0x041a }, + { func0425_outro, 0x0425 }, + { func0426_init_alaskan_guard, 0x0426 }, + { func0427_init_posttakeover_guard, 0x0427 }, + { func0428_posttakeover_guard, 0x0428 }, + { func0429_unused, 0x0429 }, + { func042a_foyer_spawner, 0x042a }, + { func042b_init_foyer_clone, 0x042b }, + { func042c_foyer_clone, 0x042c }, + { func042d_hoverbot1, 0x042d }, + { func042e_hoverbot2, 0x042e }, + { func042f_hoverbot3, 0x042f }, + { func0430_hoverbot4, 0x0430 }, + { func0431_hoverbot5, 0x0431 }, + { func0432_hoverbot6, 0x0432 }, + { func1003_intro, 0x0c00 }, + { func0425_outro, 0x0c01 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupcrad.c b/src/ailists/setupcrad.c new file mode 100644 index 000000000..f15755b4d --- /dev/null +++ b/src/ailists/setupcrad.c @@ -0,0 +1,40 @@ +// +// Pipes (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2, -1) + ammo(AMMOTYPE_PISTOL, 100) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupcryp.c b/src/ailists/setupcryp.c new file mode 100644 index 000000000..60716c6ce --- /dev/null +++ b/src/ailists/setupcryp.c @@ -0,0 +1,39 @@ +// +// G5 Building (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2, -1) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupdam.c b/src/ailists/setupdam.c new file mode 100644 index 000000000..99ee04987 --- /dev/null +++ b/src/ailists/setupdam.c @@ -0,0 +1,2952 @@ +// +// Pelagic II +// + +#include "stagesetup.h" + +// Characters +#define CHR_ELVIS 0x00 +#define CHR_INTRO_GUARD 0x02 +#define CHR_PILOT1 0x3c +#define CHR_PILOT2 0x3e +#define CHR_PILOT3 0x3f +#define CHR_LABTECH1 0x4e +#define CHR_LABTECH3 0x4f +#define CHR_LABTECH2 0x50 +#define CHR_ANGRY_PILOT 0x60 + +// Objects +#define OBJ_BADHATCHSWITCH1 0x08 +#define OBJ_BADHATCHSWITCH2 0x09 +#define OBJ_BADHATCHSWITCH3 0x0a +#define OBJ_BADHATCHSWITCH4 0x0b +#define OBJ_HATCHSWITCH1 0x0c +#define OBJ_HATCHSWITCH2 0x0d +#define OBJ_HATCHSWITCH3 0x0e +#define OBJ_HATCHSWITCH4 0x0f +#define OBJ_REACTOR_SWITCH 0x13 +#define OBJ_RESEARCHDATA1 0x14 +#define OBJ_RESEARCHDATA2 0x15 +#define OBJ_RESEARCHDATA3 0x16 +#define OBJ_LIFT_SWITCH 0x17 +#define OBJ_MOONPOOL_SWITCH 0x1a +#define OBJ_OUTRO_SUBMARINE 0x1b +#define OBJ_OUTRO_GRATE 0x1c +#define OBJ_OUTRO_CRATE1 0x1d +#define OBJ_OUTRO_CRATE2 0x1e +#define OBJ_REACTOR_HATCH 0x26 + +// Stage flags +#define STAGEFLAG_ELVIS_WARPED_FROM_START 0x00000001 +#define STAGEFLAG_TRIGGER_ANGRY_PILOT 0x00000002 +#define STAGEFLAG_MOONPOOL_SWITCH_DESTROYED 0x00000004 +#define STAGEFLAG_GPS_DISABLED 0x00000100 +#define STAGEFLAG_AUTOPILOT_DISABLED 0x00000200 +#define STAGEFLAG_00000400 0x00000400 +#define STAGEFLAG_REACTOR_HATCH_OPEN 0x00000800 +#define STAGEFLAG_REACTOR_SHUT_DOWN 0x00001000 +#define STAGEFLAG_LOCATED_DIVING_AREA 0x00002000 +#define STAGEFLAG_COLLECTED_RESEARCH_DATA 0x00004000 +#define STAGEFLAG_LABTECH_DEAD 0x00008000 +#define STAGEFLAG_SAID_PULLTHEPLUG 0x00010000 +#define STAGEFLAG_SAID_SWITCHTHINGOFF 0x00020000 +#define STAGEFLAG_PILOT_DEAD 0x00040000 +#define STAGEFLAG_00080000 0x00080000 +#define STAGEFLAG_MOONPOOL_ACTIVATED 0x00100000 +#define STAGEFLAG_LIFT_UNLOCKED 0x00200000 +#define STAGEFLAG_HATCHSWITCH1_ACTIVATED 0x00400000 +#define STAGEFLAG_HATCHSWITCH2_ACTIVATED 0x00800000 +#define STAGEFLAG_HATCHSWITCH3_ACTIVATED 0x01000000 +#define STAGEFLAG_HATCHSWITCH4_ACTIVATED 0x02000000 +#define STAGEFLAG_HATCHSWITCHES_RESETTING 0x04000000 +#define STAGEFLAG_MET_ELVIS 0x08000000 +#define STAGEFLAG_ELVIS_APPEARED_AT_MOONPOOL 0x10000000 +#define STAGEFLAG_ELVIS_DEAD 0x20000000 +#define STAGEFLAG_JO_KILLED_A_PILOT 0x40000000 +#define STAGEFLAG_REACTOR_SWITCH_DESTROYED 0x80000000 + +// AI Lists +#define AILIST_PILOT 0x0401 +#define AILIST_INIT_PILOT 0x0402 +#define AILIST_PILOT_DYING 0x0403 +#define AILIST_ANGRY_PILOT 0x0404 +#define AILIST_GUARD_UNALERTED 0x0408 +#define AILIST_LABTECH1 0x040b +#define AILIST_LABTECH2 0x040c +#define AILIST_LABTECH3 0x040d +#define AILIST_INIT_LABTECH1 0x040e +#define AILIST_INIT_LABTECH2 0x040f +#define AILIST_INIT_LABTECH3 0x0410 +#define AILIST_LABTECH_ALERTED 0x0411 +#define AILIST_HIDE 0x0412 +#define AILIST_GUARD_ALERTED 0x0413 +#define AILIST_OUTRO 0x0414 +#define AILIST_ELVIS_AT_START 0x0415 +#define AILIST_ELVIS_LEADING 0x0416 +#define AILIST_ELVIS_PREPARE_LEADING 0x0417 +#define AILIST_ELVIS_AT_MOONPOOL 0x0418 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_DAM_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_DAM_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_DAM_002) + briefing(BRIEFINGTYPE_TEXT_A, L_DAM_003) + + beginobjective(0, L_DAM_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Disable primary power source" + complete_flags(STAGEFLAG_REACTOR_SHUT_DOWN) + fail_flags(STAGEFLAG_REACTOR_SWITCH_DESTROYED) + endobjective + + beginobjective(1, L_DAM_007, (DIFFBIT_PA | DIFFBIT_PD)) // "Secure laboratories and research data" + complete_flags(STAGEFLAG_COLLECTED_RESEARCH_DATA) + fail_flags(STAGEFLAG_LABTECH_DEAD) + endobjective + + beginobjective(2, L_DAM_005, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Deactivate GPS and autopilot" + complete_flags(STAGEFLAG_GPS_DISABLED) + complete_flags(STAGEFLAG_AUTOPILOT_DISABLED) + fail_flags(STAGEFLAG_00000400) + fail_flags(STAGEFLAG_PILOT_DEAD) + fail_flags(STAGEFLAG_JO_KILLED_A_PILOT) + endobjective + + beginobjective(3, L_DAM_008, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Activate Moon Pool lift" + complete_flags(STAGEFLAG_MOONPOOL_ACTIVATED) + fail_flags(STAGEFLAG_MOONPOOL_SWITCH_DESTROYED) + endobjective + + beginobjective(4, L_DAM_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Rendezvous and escape with Elvis" + complete_flags(STAGEFLAG_LOCATED_DIVING_AREA) + fail_flags(STAGEFLAG_ELVIS_DEAD) + endobjective + + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x00, PAD_DAM_0024, BODY_THEKING, HEAD_ELVIS_GOGS, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANPISTOL, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_PHOENIX) + chr(0, 0x02, PAD_DAM_0027, BODY_PELAGIC_GUARD, HEAD_MOTO, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FARSIGHT) + chr(SPAWNFLAG_00000200, 0x2e, PAD_DAM_014E, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2d, PAD_DAM_014D, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0214, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2f, PAD_DAM_014F, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0215, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x30, PAD_DAM_0150, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0215, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x31, PAD_DAM_0151, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0215, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x32, PAD_DAM_0152, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0215, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x33, PAD_DAM_0153, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0216, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x34, PAD_DAM_0154, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0216, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x35, PAD_DAM_0155, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0216, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0035, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x38, PAD_DAM_0158, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0217, -1, 1000, 7, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0038, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x39, PAD_DAM_0159, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0217, -1, 1000, 7, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0039, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3a, PAD_DAM_015A, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0217, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3b, PAD_DAM_015B, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0217, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x36, PAD_DAM_0156, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0218, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0036, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x37, PAD_DAM_0157, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, 0x0218, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0037, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x51, PAD_DAM_0002, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0405, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0051, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x52, PAD_DAM_0027, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0405, -1, -1, 1000, 100, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0052, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x53, PAD_DAM_0028, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0405, -1, -1, 1000, 100, CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0053, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x57, PAD_DAM_00DF, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0057, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x58, PAD_DAM_00DC, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0058, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x59, PAD_DAM_00EB, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0059, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x5a, PAD_DAM_00E8, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x005a, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x5b, PAD_DAM_0142, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, 0x0213, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_NONCOMBAT, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x005b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x5c, PAD_DAM_0143, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, 0x0213, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_NONCOMBAT, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x005c, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x5d, PAD_DAM_0144, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, 0x0213, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_NONCOMBAT, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x005d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, 0x5e, PAD_DAM_0145, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, 0x0213, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_NONCOMBAT, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x005e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x03, PAD_DAM_011F, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x04, PAD_DAM_0120, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x24, PAD_DAM_0140, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x25, PAD_DAM_0141, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x05, PAD_DAM_0121, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x06, PAD_DAM_0122, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x07, PAD_DAM_0123, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x08, PAD_DAM_0124, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x09, PAD_DAM_0125, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x0a, PAD_DAM_0126, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0b, PAD_DAM_0127, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x0c, PAD_DAM_0128, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0d, PAD_DAM_0129, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x0e, PAD_DAM_012A, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0f, PAD_DAM_012B, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x10, PAD_DAM_012C, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x11, PAD_DAM_012D, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x12, PAD_DAM_012E, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x13, PAD_DAM_012F, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x14, PAD_DAM_0130, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x15, PAD_DAM_0131, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x16, PAD_DAM_0132, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x17, PAD_DAM_0133, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x18, PAD_DAM_0134, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x19, PAD_DAM_0135, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x1a, PAD_DAM_0136, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x1b, PAD_DAM_0137, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x1c, PAD_DAM_0138, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x1d, PAD_DAM_0139, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x1e, PAD_DAM_013A, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x1f, PAD_DAM_013B, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x20, PAD_DAM_013C, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x21, PAD_DAM_013D, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x22, PAD_DAM_013E, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x23, PAD_DAM_013F, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2c, PAD_DAM_014C, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2b, PAD_DAM_014B, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2a, PAD_DAM_014A, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x29, PAD_DAM_0149, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x54, PAD_DAM_0004, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 100, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0054, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x28, PAD_DAM_0148, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x27, PAD_DAM_0147, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x26, PAD_DAM_0146, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x45, PAD_DAM_0165, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0045, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x46, PAD_DAM_0166, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0046, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x3c, PAD_DAM_015C, BODY_PILOTAF1, HEAD_RANDOM, AILIST_INIT_PILOT, -1, -1, 1000, 10, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR, 0, TEAM_04, SQUADRON_02, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x3e, PAD_DAM_015E, BODY_PILOTAF1, HEAD_RANDOM, AILIST_INIT_PILOT, -1, -1, 1000, 10, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR, 0, TEAM_04, SQUADRON_02, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x3f, PAD_DAM_015F, BODY_PILOTAF1, HEAD_RANDOM, AILIST_INIT_PILOT, -1, -1, 1000, 10, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR, 0, TEAM_04, SQUADRON_02, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x41, PAD_DAM_0161, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0041, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x42, PAD_DAM_0162, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0042, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x43, PAD_DAM_0163, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0043, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x44, PAD_DAM_0164, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0044, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x47, PAD_DAM_0167, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0047, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x48, PAD_DAM_0168, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0048, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x49, PAD_DAM_0169, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0049, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x4a, PAD_DAM_016A, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x4b, PAD_DAM_016B, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x4c, PAD_DAM_016C, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_04, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_00000200, 0x4d, PAD_DAM_016D, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_GUARD_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED, TEAM_04, SQUADRON_09, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x4d, PAD_DAM_016D, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ADJUSTPUNCHSPEED, TEAM_04, SQUADRON_09, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRCMP150, 0x004d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x55, PAD_DAM_0012, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0407, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_04, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0055, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x56, PAD_DAM_0014, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0407, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_04, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0056, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x4e, PAD_DAM_0209, BODY_DD_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH1, 0x00d8, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x50, PAD_DAM_0055, BODY_DD_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH2, 0x0089, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 1, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x4f, PAD_DAM_0057, BODY_DD_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH3, 0x008b, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 2, 0, 0, 0) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR2, PAD_DAM_00F5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00F9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00FA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + tag(0x29, 1) + door(0x0100, MODEL_PELAGICDOOR2, PAD_DAM_00FB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + tag(0x2a, 1) + door(0x0100, MODEL_PELAGICDOOR2, PAD_DAM_00FC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + tag(0x2b, 1) + door(0x0100, MODEL_PELAGICDOOR2, PAD_DAM_010A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + tag(0x2c, 1) + door(0x0100, MODEL_PELAGICDOOR2, PAD_DAM_0112, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + tag(0x2d, 1) + door(0x0100, MODEL_PELAGICDOOR2, PAD_DAM_0101, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00FD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00FE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_00FF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0100, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + tag(0x18, 2) + tag(0x19, 2) + door(0x0100, MODEL_BIGPELAGICDOOR, PAD_DAM_0103, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_BIGPELAGICDOOR, PAD_DAM_0102, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0104, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0105, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0106, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0107, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0108, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0109, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_010B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_010C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_010D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_010E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_010F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0110, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0111, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0113, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0114, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0115, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0116, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0117, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0118, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_0119, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_011A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_011C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + door(0x0100, MODEL_PELAGICDOOR, PAD_DAM_011B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x012c0320, 0x00000000, 0x00000300) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0180, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_017F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_017E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_017D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_017C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_017B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_017A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0179, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0178, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0177, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0176, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0175, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0174, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0173, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0172, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0171, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0170, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_016F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_016E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0181, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0182, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0186, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0187, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0185, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0183, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0189, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0188, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_018B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0184, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_018A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_018C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_018D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_018E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_018F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0191, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0192, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0193, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0194, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0195, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0196, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0197, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0198, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_0199, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_019A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_019B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_019C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_019D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_019E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_019F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01AD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01AE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01B9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01BA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01BB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01BC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01BD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01BE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01C8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01D4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01D5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01D7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01D8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01D9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01DA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01DB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01DD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01DE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01DF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01E0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01E1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01E2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_DAM_01E3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_00000200, 0, 1500) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01E6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01E7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01EB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01EC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01F1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01ED, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01EE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01EF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_BLASTSHIELD, PAD_DAM_01F0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x00, 8) + tag(0x01, 8) + tag(0x02, 8) + tag(0x03, 8) + tag(0x04, 8) + tag(0x05, 8) + tag(0x06, 8) + tag(0x07, 8) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F2, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F3, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F4, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F5, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F6, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F7, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F8, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01F9, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + tag(0x08, 1) + tag(0x09, 1) + tag(0x0a, 1) + tag(0x0b, 1) + tag(0x0c, 1) + tag(0x0d, 1) + tag(0x0e, 1) + tag(0x0f, 1) + tag(0x13, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_DAM_01FA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 19, 19, 19, 0) + tag(0x14, 1) + key(0x0080, MODEL_CHRBRIEFCASE, 0x004e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, 0, 0, 0) + rename_object(-1, WEAPON_RESEARCHTAPE, L_DAM_022, L_DAM_023, L_DAM_024, L_DAM_025, L_DAM_026) // "" + tag(0x15, 1) + key(0x0080, MODEL_CHRBRIEFCASE, 0x0050, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, 0, 0, 0) + rename_object(-1, WEAPON_RESEARCHTAPE, L_DAM_022, L_DAM_023, L_DAM_024, L_DAM_025, L_DAM_026) // "" + tag(0x16, 1) + key(0x0080, MODEL_CHRBRIEFCASE, 0x004f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, 0, 0, 0) + rename_object(-1, WEAPON_RESEARCHTAPE, L_DAM_022, L_DAM_023, L_DAM_024, L_DAM_025, L_DAM_026) // "" + tag(0x21, 5) + tag(0x22, 5) + tag(0x23, 5) + tag(0x24, 5) + tag(0x25, 5) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_01FB, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_01FC, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_01FD, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_01FE, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_01FF, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20) + tag(0x17, 1) +#if VERSION >= VERSION_PAL_BETA + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_0200, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) +#else + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_0200, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 3) +#endif + tag(0x1a, 1) +#if VERSION >= VERSION_PAL_BETA + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_0201, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) +#else + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_DAM_0201, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 3) +#endif + camera(0x00c0, MODEL_CCTV_PD, PAD_DAM_0219, OBJFLAG_00000002 | OBJFLAG_00000008, 0, 0, 400, 0x01f7, 0x00004000, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_DAM_021A, OBJFLAG_00000002 | OBJFLAG_00000008, 0, 0, 400, 0x00dd, 0x00004000, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_DAM_021B, OBJFLAG_00000002 | OBJFLAG_00000008, 0, 0, 400, 0x000a, 0x0000238e, 0x0000001e, 0x000002bc) + camera(0x00c0, MODEL_CCTV_PD, PAD_DAM_021C, OBJFLAG_00000002 | OBJFLAG_00000008, 0, 0, 400, 0x0112, 0x00000000, 0x00000000, 0x000002bc) + tag(0x1b, 1) + stdobject(0x0100, MODEL_SUBMARINE, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1c, 1) + stdobject(0x0100, MODEL_DD_GRATE, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1d, 1) + stdobject(0x0065, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1e, 1) + stdobject(0x0065, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x26, 1) + stdobject(0x0100, MODEL_COREHATCH, PAD_DAM_011E, OBJFLAG_00000001 | OBJFLAG_00000010 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_00400000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_DAM_021F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_DAM_0220, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_DAM_0221, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_DAM_0222, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_DAM_0223, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_DAM_0224, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3) + tag(0x1f, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_DAM_021D, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x20, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_DAM_021E, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x27, 2) + tag(0x28, 2) + weapon(0x0100, MODEL_CHRFALCON2SCOPE, 0x0034, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_FALCON2_SILENCER) + weapon(0x0100, MODEL_CHRFALCON2SCOPE, 0x0034, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_FALCON2_SILENCER) + link_guns(-1, -2) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_WETSUIT) + intro_weapon(WEAPON_FALCON2_SILENCER, -1) + ammo(AMMOTYPE_PISTOL, 100) + intro_weapon(WEAPON_LAPTOPGUN, -1) + ammo(AMMOTYPE_SMG, 100) + ammo(AMMOTYPE_NBOMB, 3) + intro_weapon(WEAPON_XRAYSCANNER, -1) + intro_weapon(WEAPON_NBOMB, -1) + spawn(PAD_DAM_0046) + endintro +}; + +s32 path00[] = { + PAD_DAM_0002, + PAD_DAM_0001, + PAD_DAM_0024, + PAD_DAM_0027, + PAD_DAM_002B, + PAD_DAM_0028, + PAD_DAM_002D, + PAD_DAM_002E, + PAD_DAM_002C, + -1, +}; + +s32 path01[] = { + PAD_DAM_0004, + PAD_DAM_0008, + PAD_DAM_000A, + PAD_DAM_0006, + PAD_DAM_0007, + PAD_DAM_000B, + -1, +}; + +s32 path02[] = { + PAD_DAM_0012, + PAD_DAM_0010, + PAD_DAM_0011, + PAD_DAM_0014, + PAD_DAM_0015, + PAD_DAM_0016, + PAD_DAM_0017, + PAD_DAM_0013, + -1, +}; + +s32 path03[] = { + PAD_DAM_00DD, + PAD_DAM_00DE, + PAD_DAM_00DF, + PAD_DAM_00E0, + PAD_DAM_00D9, + PAD_DAM_00DB, + PAD_DAM_00DC, + -1, +}; + +s32 path04[] = { + PAD_DAM_00E8, + PAD_DAM_00E7, + PAD_DAM_00E6, + PAD_DAM_00E5, + PAD_DAM_00EB, + PAD_DAM_00EA, + PAD_DAM_00E9, + -1, +}; + +struct path paths[] = { + { path00, 0, PATHFLAG_CIRCULAR }, + { path01, 1, 0 }, + { path02, 2, PATHFLAG_CIRCULAR }, + { path03, 3, PATHFLAG_CIRCULAR }, + { path04, 4, PATHFLAG_CIRCULAR }, + { NULL, 0, 0 }, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_PUSHABLE) + set_chr_chrflag(CHR_LABTECH1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH3, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PILOT1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PILOT2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PILOT3, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func0408_guard_unalerted[] = { + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_chr_dodge_rating(2, 10) + set_accuracy(18) + set_reaction_speed(60) + set_chr_maxdamage(CHR_SELF, 70) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1002_intro[] = { + play_cutscene_track(MUSIC_PELAGIC_INTRO) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + camera_movement(ANIM_CUT_DAM_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 4) + restart_timer + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x39) \ + if_timer_gt(time, /*goto*/ 0x04) \ + endloop(loopid) \ + label(0x04) + + wait_until(342, 0x3b) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(390, 0x3c) + play_sound(SFX_0172, CHANNEL_6) + + wait_until(438, 0x3d) + play_sound(SFX_0173, CHANNEL_5) + + wait_until(484, 0x48) + play_sound(SFX_0174, CHANNEL_7) + + wait_until(532, 0x4a) + play_sound(SFX_0175, CHANNEL_5) + + wait_until(574, 0x4b) + play_sound(SFX_0176, CHANNEL_7) + + wait_until(616, 0x49) + play_sound(SFX_0177, CHANNEL_6) + + wait_until(660, 0x4c) + play_sound(SFX_0178, CHANNEL_6) + + wait_until(712, 0x4d) + play_sound(SFX_0171, CHANNEL_5) + + wait_until(760, 0x4e) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(812, 0x4f) + play_sound(SFX_0173, CHANNEL_6) + + wait_until(1386, 0x50) + play_sound(SFX_0171, CHANNEL_5) + + wait_until(1482, 0x51) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(1628, 0x52) + play_sound(SFX_0173, CHANNEL_6) + + wait_until(1698, 0x53) + play_sound(SFX_0174, CHANNEL_5) + + wait_until(1860, 0x54) + play_sound(SFX_05A8, CHANNEL_7) + + wait_until(2180, 0x55) + play_sound(SFX_05A9, CHANNEL_6) + + wait_until(2260, 0x57) + play_sound(SFX_05AA, CHANNEL_7) + + wait_until(2274, 0x58) + play_sound(SFX_0175, CHANNEL_6) + + wait_until(2280, 0x59) + play_sound(SFX_0176, CHANNEL_5) + + wait_until(2294, 0x56) + play_sound(SFX_0177, CHANNEL_5) + + wait_until(2298, 0x5a) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(2316, 0x5b) + play_sound(SFX_0178, CHANNEL_6) + + wait_until(2474, 0x5c) + play_sound(SFX_0172, CHANNEL_5) + + wait_until(2489, 0x5d) + play_sound(SFX_01DB, CHANNEL_7) + + wait_until(2572, 0x5e) + play_sound(SFX_0171, CHANNEL_6) + + wait_until(2616, 0x5f) + play_sound(SFX_0173, CHANNEL_5) + + wait_until(2644, 0x60) + play_sound(SFX_0172, CHANNEL_5) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x07) + goto_next(0x39) + + label(0x07) + if_controller_button_pressed(/*goto*/ 0x39) + label(0x07) + endloop(0x0b) + + label(0x39) + mute_channel(CHANNEL_10) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) + unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) + disable_chr(CHR_INTRO_GUARD) + enter_firstperson + yield + set_ailist(CHR_ELVIS, AILIST_ELVIS_AT_START) + restart_timer + + beginloop(0x0c) + if_timer_gt(60, /*goto*/ 0x04) + endloop(0x0c) + + label(0x04) + stop_cutscene_track + stop_ambient_track + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c01_outro[] = { + camera_movement(ANIM_CUT_DAM_OUTRO_CAM) + play_cutscene_track(MUSIC_PELAGIC_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + + enable_object(OBJ_OUTRO_SUBMARINE) + set_object_flag2(OBJ_OUTRO_SUBMARINE, OBJFLAG2_04000000) + set_object_flag3(OBJ_OUTRO_SUBMARINE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_DAM_OUTRO_SUBMARINE, OBJ_OUTRO_SUBMARINE, 0x04, 0xffff) + + enable_object(OBJ_OUTRO_GRATE) + set_object_flag2(OBJ_OUTRO_GRATE, OBJFLAG2_04000000) + set_object_flag3(OBJ_OUTRO_GRATE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_DAM_OUTRO_GRATE, OBJ_OUTRO_GRATE, 0x04, 0xffff) + + enable_object(OBJ_OUTRO_CRATE1) + set_object_flag2(OBJ_OUTRO_CRATE1, OBJFLAG2_04000000) + set_object_flag3(OBJ_OUTRO_CRATE1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_DAM_OUTRO_CRATE1, OBJ_OUTRO_CRATE1, 0x04, 0xffff) + + enable_object(OBJ_OUTRO_CRATE2) + set_object_flag2(OBJ_OUTRO_CRATE2, OBJFLAG2_04000000) + set_object_flag3(OBJ_OUTRO_CRATE2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_DAM_OUTRO_CRATE2, OBJ_OUTRO_CRATE2, 0x04, 0xffff) + + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + show_nonessential_chrs(FALSE) + restart_timer + + wait_until(46, 0x3c) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(160, 0x3d) + play_sound(SFX_0172, CHANNEL_10) + play_sound_from_object2(0x0a, OBJ_OUTRO_SUBMARINE, SFX_042D, 0x00, 0x00) + + wait_until(180, 0x3b) + speak(CHR_BOND, L_DAM_039, MP3_0465, CHANNEL_10, COLOR_06_WHITE) // "Right. The diving operation has been disrupted on ..." + + wait_until(200, 0x48) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(232, 0x49) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(254, 0x4a) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(272, 0x66) + + wait_until(374, 0x4b) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(415, 0x4c) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(454, 0x4d) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(532, 0x4e) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(570, 0x4f) + speak(CHR_BOND, L_DAM_040, MP3_0466, CHANNEL_10, COLOR_09_BLUE) // "I hope the government don't want to use this ship ..." + + wait_until(582, 0x50) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(666, 0x51) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(706, 0x52) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(736, 0x64) + play_sound(SFX_05A8, CHANNEL_10) + + wait_until(806, 0x53) + play_sound(SFX_809F, CHANNEL_10) + + wait_until(854, 0x54) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(876, 0x55) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(906, 0x56) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(926, 0x57) + play_sound(SFX_80A2, CHANNEL_10) + + wait_until(950, 0x58) + speak(CHR_BOND, L_DAM_041, MP3_0467, CHANNEL_10, COLOR_06_WHITE) // "Do you think we were a little heavy-handed?" + + wait_until(1088, 0x59) + play_sound(SFX_80A3, CHANNEL_10) + + wait_until(1152, 0x5a) + play_sound(SFX_0176, CHANNEL_10) + + wait_until(1190, 0x5b) + speak(CHR_BOND, L_DAM_042, MP3_0468, CHANNEL_10, COLOR_09_BLUE) // "Naaahhhh." + + wait_until(1228, 0x5c) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(1258, 0x5d) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(1260, 0x5e) + play_sound(SFX_05B4, CHANNEL_10) + + wait_until(1300, 0x5f) + play_sound(SFX_JO_LANDING_05B6, CHANNEL_10) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(1309, 0x65) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(1358, 0x60) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(1382, 0x61) + play_sound(SFX_EXPLOSION_8098, CHANNEL_10) + + wait_until(1480, 0x62) + play_sound(SFX_80A3, CHANNEL_10) + + wait_until(1480, 0x63) + play_sound_from_object2(0x0a, OBJ_OUTRO_GRATE, SFX_00C1, 0x00, 0x00) + + wait_until(1500, 0x67) + play_sound_from_object2(0x0a, OBJ_OUTRO_SUBMARINE, SFX_042D, 0x00, 0x00) + + wait_until(1590, 0x68) + play_sound_from_object2(0x0a, OBJ_OUTRO_SUBMARINE, SFX_0434, 0x00, 0x00) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x07) + goto_next(0x39) + + label(0x07) + if_controller_button_pressed(/*goto*/ 0x39) + label(0x07) + endloop(0x0b) + + label(0x39) + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DAM_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function1[] = { + label(0x00) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_msg_controlledfrom[] = { + restart_timer + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0027, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + speak(CHR_P1P2, L_DAM_011, MP3_03D1, CHANNEL_6, COLOR_09_BLUE) // "This must be where the sub's controlled from." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_msg_withoutautopilot[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x007e, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + speak(CHR_P1P2, L_DAM_012, MP3_03D2, CHANNEL_6, COLOR_09_BLUE) // "Without the autopilot and the GPS, the ship will w..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_msg_conductoperations[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x007f, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + speak(CHR_P1P2, L_DAM_013, MP3_03D3, CHANNEL_6, COLOR_09_BLUE) // "They'll be unable to conduct any operations withou..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function2[] = { + // These are invalid object IDs + beginloop(0x00) + if_object_in_good_condition(0x11, /*goto*/ 0x07) + goto_next(0x04) + + label(0x07) + if_object_in_good_condition(0x10, /*goto*/ 0x07) + goto_next(0x04) + + label(0x07) + endloop(0x00) + + label(0x04) + show_hudmsg(CHR_BOND, L_DAM_016) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_00000400) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_open_reactor_hatch[] = { + // Wait for all switches active + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_HATCHSWITCH1_ACTIVATED, TRUE, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_stage_flag_eq(STAGEFLAG_HATCHSWITCH2_ACTIVATED, TRUE, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_stage_flag_eq(STAGEFLAG_HATCHSWITCH3_ACTIVATED, TRUE, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_stage_flag_eq(STAGEFLAG_HATCHSWITCH4_ACTIVATED, TRUE, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + disable_object(OBJ_REACTOR_HATCH) + set_object_flag2(OBJ_REACTOR_HATCH, OBJFLAG2_INVISIBLE) + show_hudmsg(CHR_P1P2, L_DAM_017) // "Reactor shutdown control hatch opened." + set_stage_flag(STAGEFLAG_REACTOR_HATCH_OPEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_reactor_switch[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_REACTOR_SWITCH, /*goto*/ 0x07) + show_hudmsg(CHR_BOND, L_DAM_036) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_REACTOR_SWITCH_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x07) + if_chr_activated_object(CHR_P1P2, OBJ_REACTOR_SWITCH, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_stage_flag_eq(STAGEFLAG_REACTOR_HATCH_OPEN, TRUE, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_1) + assign_sound(SFX_8147, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_REACTOR_SWITCH, TRUE) + set_lights_state(0x007f, LIGHTOP_3, 0xff, 0x06, 0x78) + set_object_image(OBJ_REACTOR_SWITCH, 0, TVCMDLIST_12) + set_object_image(OBJ_REACTOR_SWITCH, 1, TVCMDLIST_12) + set_object_image(OBJ_REACTOR_SWITCH, 2, TVCMDLIST_12) + show_hudmsg(CHR_P1P2, L_DAM_018) // "Reactor has been shut down." + set_stage_flag(STAGEFLAG_REACTOR_SHUT_DOWN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_diving_area_located[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_MET_ELVIS, TRUE, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_in_room(CHR_P1P2, 0x00, 0x0064, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0095, /*goto*/ 0x07) + if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0096, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + show_hudmsg(CHR_P1P2, L_DAM_019) // "Diving control center has been located." + set_stage_flag(STAGEFLAG_LOCATED_DIVING_AREA) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_check_end_level[] = { + beginloop(0x6f) + if_objective_complete(0, /*goto*/ 0x07) + reloop(0x6f) + + label(0x07) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x07) + if_objective_complete(1, /*goto*/ 0x07) + reloop(0x6f) + + label(0x07) + if_objective_complete(2, /*goto*/ 0x07) + reloop(0x6f) + + label(0x07) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x07) + if_objective_complete(3, /*goto*/ 0x07) + endloop(0x6f) + + label(0x07) + + beginloop(0x3b) + if_stage_flag_eq(STAGEFLAG_ELVIS_WARPED_FROM_START, TRUE, /*goto*/ 0x07) + endloop(0x3b) + + label(0x07) + if_stage_flag_eq(STAGEFLAG_ELVIS_APPEARED_AT_MOONPOOL, TRUE, /*goto*/ 0x00) + set_stage_flag(STAGEFLAG_ELVIS_APPEARED_AT_MOONPOOL) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_ELVIS, AILIST_ELVIS_AT_MOONPOOL) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0064, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0095, /*goto*/ 0x07) + if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0096, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_all_objectives_complete(/*goto*/ 0x07) + endloop(0x00) + + label(0x07) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x07) + endloop(0x0b) + + label(0x07) + if_chr_deadish(CHR_BOND, /*goto*/ 0x07) + goto_next(0x08) + + label(0x07) + if_chr_deadish(CHR_COOP, /*goto*/ 0x07) + + // Jo or Velvet alive + label(0x08) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x08) + + if_chr_deadish(CHR_BOND, /*goto*/ 0x07) + goto_next(0x04) + + // Both players dead - this check is redundant + label(0x07) + if_chr_deadish(CHR_COOP, /*goto*/ 0x07) + goto_next(0x04) + + // Both players dead + label(0x07) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x04) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + + // Elvis dead + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_check_labtech_dead[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0b) + + beginloop(0x00) + if_chr_death_animation_finished(CHR_LABTECH1, /*goto*/ 0x07) + if_chr_dead(CHR_LABTECH1, /*goto*/ 0x07) + if_chr_death_animation_finished(CHR_LABTECH2, /*goto*/ 0x07) + if_chr_dead(CHR_LABTECH2, /*goto*/ 0x07) + if_chr_death_animation_finished(CHR_LABTECH3, /*goto*/ 0x07) + if_chr_dead(CHR_LABTECH3, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + show_hudmsg(CHR_BOND, L_DAM_020) // "Critical mission personnel killed." + set_stage_flag(STAGEFLAG_LABTECH_DEAD) + label(0x0b) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_check_researchdata_collected[] = { + beginloop(0x00) + if_chr_has_object(CHR_BOND, OBJ_RESEARCHDATA1, /*goto*/ 0x07) + if_chr_has_object(CHR_COOP, OBJ_RESEARCHDATA1, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_has_object(CHR_BOND, OBJ_RESEARCHDATA2, /*goto*/ 0x07) + if_chr_has_object(CHR_COOP, OBJ_RESEARCHDATA2, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_has_object(CHR_BOND, OBJ_RESEARCHDATA3, /*goto*/ 0x07) + if_chr_has_object(CHR_COOP, OBJ_RESEARCHDATA3, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + show_hudmsg(CHR_BOND, L_DAM_021) // "Research data has been secured." + set_stage_flag(STAGEFLAG_COLLECTED_RESEARCH_DATA) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_path(pathid) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(18) \ + set_reaction_speed(60) \ + set_chr_maxdamage(CHR_SELF, 70) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + +u8 func0405_start_path00[] = { + init_path(0) + endlist +}; + +u8 func0409_start_path03[] = { + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + init_path(3) + endlist +}; + +u8 func040a_start_path04[] = { + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + init_path(4) + endlist +}; + +u8 func0406_start_path01[] = { + init_path(1) + endlist +}; + +u8 func0407_start_path02[] = { + init_path(2) + endlist +}; + +u8 func040e_init_labtech1[] = { + set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_LABTECH1) + endlist +}; + +u8 func040b_labtech1[] = { + set_shotlist(AILIST_LABTECH1) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Dying + label(0x07) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x04) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x0f) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0f) + if_chr_stopped(/*goto*/ 0x04) + goto_next(0x07) + label(0x04) + if_chr_idle(/*goto*/ 0x07) + call_rng + if_rand_lt(128, /*goto*/ 0x27) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x3b) + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x3c) + chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x27) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_0209, /*goto*/ 0x3b) + walk_to_pad(PAD_DAM_0209) + goto_next(0x07) + + label(0x3b) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020A, /*goto*/ 0x3c) + walk_to_pad(PAD_DAM_020A) + goto_next(0x07) + + label(0x3c) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020B, /*goto*/ 0x07) + walk_to_pad(PAD_DAM_020B) + goto_next(0x07) + + label(0x07) + endloop(0x00) + + label(0x0f) + set_ailist(CHR_SELF, AILIST_LABTECH_ALERTED) + endlist +}; + +u8 func040f_init_labtech2[] = { + set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_LABTECH2) + endlist +}; + +u8 func040c_labtech2[] = { + set_shotlist(AILIST_LABTECH2) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Dying + label(0x07) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x04) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x0f) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0f) + if_chr_stopped(/*goto*/ 0x04) + goto_next(0x07) + label(0x04) + if_chr_idle(/*goto*/ 0x07) + call_rng + if_rand_lt(128, /*goto*/ 0x27) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x3b) + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x3c) + chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x27) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020C, /*goto*/ 0x3b) + walk_to_pad(PAD_DAM_020C) + goto_next(0x07) + + label(0x3b) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020D, /*goto*/ 0x3c) + walk_to_pad(PAD_DAM_020D) + goto_next(0x07) + + label(0x3c) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020E, /*goto*/ 0x07) + walk_to_pad(PAD_DAM_020E) + goto_next(0x07) + + label(0x07) + endloop(0x00) + + label(0x0f) + set_ailist(CHR_SELF, AILIST_LABTECH_ALERTED) + endlist +}; + +u8 func0410_init_labtech3[] = { + set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_LABTECH3) + endlist +}; + +u8 func040d_labtech3[] = { + // @bug: Wrong onshot function. Under normal gameplay this labtech has 1HP + // anyway and will die in one shot. Theoretically, if you use PD mode with + // max health and shoot him with a weak weapon then he will start running to + // lab tech 1's pads. + set_shotlist(AILIST_LABTECH1) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Dying + label(0x07) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x04) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x0f) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x10) + if_chr_stopped(/*goto*/ 0x04) + goto_next(0x07) + label(0x04) + if_chr_idle(/*goto*/ 0x07) + call_rng + if_rand_lt(128, /*goto*/ 0x27) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x3b) + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x3c) + chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x07) + + label(0x27) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020F, /*goto*/ 0x3b) + walk_to_pad(PAD_DAM_020F) + goto_next(0x07) + + label(0x3b) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_0210, /*goto*/ 0x3c) + walk_to_pad(PAD_DAM_0210) + goto_next(0x07) + + label(0x3c) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_0211, /*goto*/ 0x07) + walk_to_pad(PAD_DAM_0211) + goto_next(0x07) + + label(0x07) + endloop(0x00) + + label(0x10) + set_alertness(100) + + label(0x0f) + set_ailist(CHR_SELF, AILIST_LABTECH_ALERTED) + endlist +}; + +u8 func0411_labtech_alerted[] = { + restart_timer + label(0x0b) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) + + beginloop(0x0c) + if_target_in_fov_left(10, /*goto*/ 0x04) + if_timer_gt(60, /*goto*/ 0x04) + endloop(0x0c) + + label(0x04) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + set_alertness(100) + say_quip(CHR_BOND, 0x2a, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x3e) + if_timer_gt(90, /*goto*/ 0x04) + endloop(0x3e) + + // Already alert (eg. by gunfire) + label(0x04) + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x3f) + goto_next(0x42) + + label(0x3f) + try_run_to_chr(CHR_PRESET, /*goto*/ 0x40) + goto_next(0x42) + + beginloop(0x40) + if_detected_chr(CHR_PRESET, /*goto*/ 0x41) + if_chr_stopped(/*goto*/ 0x41) + endloop(0x40) + + label(0x41) + increase_squadron_alertness(100) + say_quip(CHR_BOND, QUIP_WARNFRIENDS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + + label(0x42) + go_to_target_pad(GOPOSFLAG_RUN) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x13) + endloop(0x10) + + label(0x13) + restart_timer + if_can_see_target(/*goto*/ 0x07) + goto_next(0x00) + + label(0x07) + set_target_chr(CHR_P1P2) + if_distance_to_target_lt(300, /*goto*/ 0x04) + + label(0x00) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x11) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_timer_gt(1200, /*goto*/ 0x0d) + if_can_see_target(/*goto*/ 0x07) + goto_next(0x00) + + label(0x07) + if_distance_to_target_lt(300, /*goto*/ 0x04) + label(0x00) + if_chr_stopped(/*goto*/ 0x07) + endloop(0x11) + + label(0x07) + goto_first(0x13) + + label(0x0d) + goto_first(0x42) + + label(0x04) + retreat(GOPOSFLAG_RUN, 2) + restart_timer + + beginloop(0x14) + if_timer_gt(600, /*goto*/ 0x07) + endloop(0x14) + + label(0x07) + goto_first(0x13) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_hide[] = { + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_alarm_responders[] = { + yield + yield + set_chr_hiddenflag(0x57, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x58, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x59, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x5a, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x5b, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x5c, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x5d, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x5e, CHRHFLAG_CLOAKED) + disable_chr(0x57) + disable_chr(0x58) + disable_chr(0x59) + disable_chr(0x5a) + disable_chr(0x5b) + disable_chr(0x5c) + disable_chr(0x5d) + disable_chr(0x5e) + set_chr_hiddenflag(0x04, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x25, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x06, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x08, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x0a, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x0c, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x0e, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x10, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x12, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x14, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x16, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x18, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x1a, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x1c, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x1e, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x20, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(0x22, CHRHFLAG_CLOAKED) + disable_chr(0x04) + disable_chr(0x25) + disable_chr(0x06) + disable_chr(0x08) + disable_chr(0x0a) + disable_chr(0x0c) + disable_chr(0x0e) + disable_chr(0x10) + disable_chr(0x12) + disable_chr(0x14) + disable_chr(0x16) + disable_chr(0x18) + disable_chr(0x1a) + disable_chr(0x1c) + disable_chr(0x1e) + disable_chr(0x20) + disable_chr(0x22) + + beginloop(0x00) + if_alarm_active(/*goto*/ 0x07) + endloop(0x00) + + label(0x07) + enable_chr(0x57) + enable_chr(0x58) + enable_chr(0x59) + enable_chr(0x5a) + enable_chr(0x5b) + enable_chr(0x5c) + enable_chr(0x5d) + enable_chr(0x5e) + set_chr_team(0x57, TEAM_ENEMY) + set_chr_team(0x58, TEAM_ENEMY) + set_chr_team(0x59, TEAM_ENEMY) + set_chr_team(0x5a, TEAM_ENEMY) + set_chr_team(0x5b, TEAM_ENEMY) + set_chr_team(0x5c, TEAM_ENEMY) + set_chr_team(0x5d, TEAM_ENEMY) + set_chr_team(0x5e, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + yield + enable_chr(0x04) + enable_chr(0x25) + enable_chr(0x06) + enable_chr(0x08) + enable_chr(0x0a) + enable_chr(0x0c) + enable_chr(0x0e) + enable_chr(0x10) + enable_chr(0x12) + enable_chr(0x14) + enable_chr(0x16) + enable_chr(0x18) + enable_chr(0x1a) + enable_chr(0x1c) + enable_chr(0x1e) + enable_chr(0x20) + enable_chr(0x22) + set_chr_team(0x04, TEAM_ENEMY) + set_chr_team(0x25, TEAM_ENEMY) + set_chr_team(0x06, TEAM_ENEMY) + set_chr_team(0x08, TEAM_ENEMY) + set_chr_team(0x0a, TEAM_ENEMY) + set_chr_team(0x0c, TEAM_ENEMY) + set_chr_team(0x0e, TEAM_ENEMY) + set_chr_team(0x10, TEAM_ENEMY) + set_chr_team(0x12, TEAM_ENEMY) + set_chr_team(0x14, TEAM_ENEMY) + set_chr_team(0x16, TEAM_ENEMY) + set_chr_team(0x18, TEAM_ENEMY) + set_chr_team(0x1a, TEAM_ENEMY) + set_chr_team(0x1c, TEAM_ENEMY) + set_chr_team(0x1e, TEAM_ENEMY) + set_chr_team(0x20, TEAM_ENEMY) + set_chr_team(0x22, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + yield + set_ailist(0x57, 0x0409) + set_ailist(0x58, 0x0409) + set_ailist(0x59, 0x040a) + set_ailist(0x5a, 0x040a) + set_ailist(0x5b, AILIST_GUARD_ALERTED) + set_ailist(0x5c, AILIST_GUARD_ALERTED) + set_ailist(0x5d, AILIST_GUARD_ALERTED) + set_ailist(0x5e, AILIST_GUARD_ALERTED) + set_ailist(0x04, AILIST_GUARD_UNALERTED) + set_ailist(0x25, AILIST_GUARD_UNALERTED) + set_ailist(0x06, AILIST_GUARD_UNALERTED) + set_ailist(0x08, AILIST_GUARD_UNALERTED) + set_ailist(0x0a, AILIST_GUARD_UNALERTED) + set_ailist(0x0c, AILIST_GUARD_UNALERTED) + set_ailist(0x0e, AILIST_GUARD_UNALERTED) + set_ailist(0x10, AILIST_GUARD_UNALERTED) + set_ailist(0x12, AILIST_GUARD_UNALERTED) + set_ailist(0x14, AILIST_GUARD_UNALERTED) + set_ailist(0x16, AILIST_GUARD_UNALERTED) + set_ailist(0x18, AILIST_GUARD_UNALERTED) + set_ailist(0x1a, AILIST_GUARD_UNALERTED) + set_ailist(0x1c, AILIST_GUARD_UNALERTED) + set_ailist(0x1e, AILIST_GUARD_UNALERTED) + set_ailist(0x20, AILIST_GUARD_UNALERTED) + set_ailist(0x22, AILIST_GUARD_UNALERTED) + yield + unset_chr_chrflag(0x57, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x58, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x59, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x5a, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x5b, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x5c, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x5d, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x5e, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x57, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x58, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x59, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x5a, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x5b, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x5c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x5d, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x5e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x04, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x25, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x06, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x08, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x0a, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x0c, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x0e, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x10, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x12, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x14, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x18, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x1a, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x1c, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x1e, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x20, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x22, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x04, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x25, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x06, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x08, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0a, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x10, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x12, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x14, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x18, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1a, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x20, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x22, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_init_pilot[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_PILOT) + endlist +}; + +u8 func0401_pilot_dying[] = { + unset_stage_flag(STAGEFLAG_SAID_PULLTHEPLUG) + unset_stage_flag(STAGEFLAG_SAID_SWITCHTHINGOFF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0401_pilot[] = { + set_shotlist(AILIST_PILOT) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x00) + + // Dying + label(0x07) + set_ailist(CHR_SELF, AILIST_PILOT_DYING) + + // Alive - wait for player to arrive + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x07) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + endloop(0x00) + + // Seen player + label(0x07) + say_quip(CHR_BOND, QUIP_SURRENDER, 0xfe, 0x0a, 0xff, BANK_0, 0x00, 0x00) + + label(0x04) + increase_squadron_alertness(100) + surrender + + beginloop(0x0b) + // Wait for Jo nearby + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_distance_to_target_lt(200, /*goto*/ 0x07) + reloop(0x0b) + + // and for Jo's room entry speech to finish + label(0x07) + if_sound_finished(CHANNEL_6, /*goto*/ 0x07) + reloop(0x0b) + + // and for Jo to be in view + label(0x07) + if_chr_in_view(/*goto*/ 0x07) + endloop(0x0b) + + label(0x07) + if_stage_flag_eq(STAGEFLAG_AUTOPILOT_DISABLED, TRUE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_SAID_PULLTHEPLUG, FALSE, /*goto*/ 0x07) + goto_next(0x04) + + label(0x08) + if_chr_deadish(CHR_ANGRY_PILOT, /*goto*/ 0x09) + goto_first(0x0b) + + // Angry pilot dead or hasn't been chosen yet + label(0x09) + if_stage_flag_eq(STAGEFLAG_GPS_DISABLED, TRUE, /*goto*/ 0x04) + if_stage_flag_eq(STAGEFLAG_SAID_SWITCHTHINGOFF, FALSE, /*goto*/ 0x08) + + // GPS disabled + label(0x04) + say_quip(CHR_BOND, QUIP_SURRENDER, 0xfe, 0x0a, 0xff, BANK_0, 0x00, 0x00) + goto_first(0x0b) + + label(0x07) + speak(CHR_TARGET, L_DAM_043, MP3_JO_PULL_THE_PLUG, CHANNEL_7, COLOR_09_BLUE) // "Pull the plug on that now." + set_stage_flag(STAGEFLAG_SAID_PULLTHEPLUG) + goto_next(0x0c) + + label(0x08) + speak(CHR_TARGET, L_DAM_044, MP3_JO_SWITCH_THIS_THING_OFF, CHANNEL_7, COLOR_09_BLUE) // "Switch this thing off." + set_stage_flag(STAGEFLAG_SAID_SWITCHTHINGOFF) + goto_next(0x0c) + + beginloop(0x0c) + if_sound_finished(CHANNEL_7, /*goto*/ 0x07) + endloop(0x0c) + + label(0x07) + set_self_flag_bankx(CHRFLAG0_COVER_TYPE2, BANK_0) + if_stage_flag_eq(STAGEFLAG_SAID_SWITCHTHINGOFF, FALSE, /*goto*/ 0x07) + speak(CHR_TARGET, L_DAM_045, MP3_SCI_ILL_SHUT_IT_DOWN, CHANNEL_6, COLOR_04_ORANGE) // "I'll shut it down." + goto_next(0x08) + + label(0x07) + speak(CHR_TARGET, L_DAM_046, MP3_SCI_PLEASE_DONT_HURT_ME, CHANNEL_6, COLOR_04_ORANGE) // "Please don't hurt me." + label(0x08) + do_preset_animation(PRESETANIM_TALKRANDOM) + + beginloop(0x0f) + if_sound_finished(CHANNEL_6, /*goto*/ 0x08) + endloop(0x0f) + + // Choose which pad to walk to + label(0x08) + if_stage_flag_eq(STAGEFLAG_SAID_SWITCHTHINGOFF, TRUE, /*goto*/ 0x07) + walk_to_pad(PAD_DAM_015D) + goto_next(0x0d) + + label(0x07) + walk_to_pad(PAD_DAM_0160) + + // Walking to pad + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x07) + endloop(0x0d) + + // Push button + label(0x07) + chr_do_animation(ANIM_PUSH_BUTTON, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) +#if VERSION >= VERSION_NTSC_1_0 + restart_timer + + beginloop(0x0e) + if_chr_stopped(/*goto*/ 0x07) + if_timer_gt(60, /*goto*/ 0x08) + endloop(0x0e) + + label(0x08) + speak(CHR_SELF, -1, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x07) + endloop(0x10) +#else + beginloop(0x0e) + if_chr_stopped(/*goto*/ 0x07) + endloop(0x0e) +#endif + + label(0x07) + if_stage_flag_eq(STAGEFLAG_AUTOPILOT_DISABLED, TRUE, /*goto*/ 0x07) + show_hudmsg(CHR_TARGET, L_DAM_014) // "Autopilot system has been deactivated." + set_stage_flag(STAGEFLAG_TRIGGER_ANGRY_PILOT) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + set_stage_flag(STAGEFLAG_AUTOPILOT_DISABLED) + surrender + goto_first(0x0b) + + label(0x07) + show_hudmsg(CHR_TARGET, L_DAM_015) // "GPS system has been deactivated." + set_stage_flag(STAGEFLAG_GPS_DISABLED) + surrender + goto_first(0x0b) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_check_pilots_dead[] = { + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_00080000, TRUE, /*goto*/ 0x08) + if_chr_deadish(CHR_PILOT1, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_deadish(CHR_PILOT2, /*goto*/ 0x07) + reloop(0x00) + + label(0x07) + if_chr_deadish(CHR_PILOT3, /*goto*/ 0x07) + endloop(0x00) + + // All pilots dead + label(0x07) + + // Flag is set + label(0x08) + if_stage_flag_eq(STAGEFLAG_AUTOPILOT_DISABLED, FALSE, /*goto*/ 0x07) + if_stage_flag_eq(STAGEFLAG_GPS_DISABLED, FALSE, /*goto*/ 0x07) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x07) + show_hudmsg(CHR_BOND, L_DAM_027) // "Critical mission personnel have been killed." + set_stage_flag(STAGEFLAG_PILOT_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Choose a pilot to become angry. One of the three is selected at random. If + * the selected pilot is dead, try the next one and so on in order 1, 2, 3. + */ +u8 func1012_choose_angry_pilot[] = { + set_chr_chrflag(CHR_PILOT1, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_PILOT2, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_PILOT3, CHRCFLAG_KILLCOUNTABLE) + + beginloop(0x00) + if_kill_count_gt(0, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_ANGRY_PILOT, TRUE, /*goto*/ 0x07) + endloop(0x00) + + // Triggered + label(0x07) + call_rng + if_rand_lt(86, /*goto*/ 0x3b) + if_rand_lt(172, /*goto*/ 0x3c) + + beginloop(0x03) + if_kill_count_gt(0, /*goto*/ 0x08) + if_chr_deadish(CHR_PILOT1, /*goto*/ 0x3b) + if_chr_has_flag_bankx(CHR_PILOT1, CHRFLAG0_COVER_TYPE2, BANK_0, /*goto*/ 0x3b) + set_ailist(CHR_PILOT1, AILIST_ANGRY_PILOT) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x3b) + if_chr_deadish(CHR_PILOT2, /*goto*/ 0x3c) + if_chr_has_flag_bankx(CHR_PILOT2, CHRFLAG0_COVER_TYPE2, BANK_0, /*goto*/ 0x3c) + set_ailist(CHR_PILOT2, AILIST_ANGRY_PILOT) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x3c) + if_chr_deadish(CHR_PILOT3, /*goto*/ 0x04) + if_chr_has_flag_bankx(CHR_PILOT3, CHRFLAG0_COVER_TYPE2, BANK_0, /*goto*/ 0x04) + set_ailist(CHR_PILOT3, AILIST_ANGRY_PILOT) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x04) + endloop(0x03) + + // Killed a pilot + label(0x08) + show_hudmsg(CHR_BOND, L_DAM_035) // "Civilians have been killed." + set_stage_flag(STAGEFLAG_JO_KILLED_A_PILOT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0404_angry_pilot[] = { + set_chr_id(CHR_ANGRY_PILOT) + set_accuracy(90) + set_reaction_speed(100) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + unset_self_flag_bankx(CHRFLAG0_ALERT_ON_HEARSPAWN, BANK_0) + set_self_chrflag(CHRCFLAG_00000040) + set_shotlist(AILIST_ANGRY_PILOT) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Dying + label(0x07) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x04) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + speak(CHR_TARGET, L_DAM_047, MP3_04DD, CHANNEL_7, COLOR_04_ORANGE) // "Die, you traitors." + chr_do_animation(ANIM_DRAW_PISTOL_0245, -1, 120, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SELF, 3) + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x00000000, /*goto*/ 0x6c) + + beginloop(0x6c) + if_chr_stopped(/*goto*/ 0x03) + endloop(0x6c) + + label(0x03) + if_kill_count_gt(1, /*goto*/ 0x08) + goto_next(0x04) + + // Jo killed a pilot + label(0x08) + set_stage_flag(STAGEFLAG_00080000) + + // Select another pilot as target + label(0x04) + if_chr_deadish(CHR_PILOT1, /*goto*/ 0x3b) + if_chr_has_flag_bankx(CHR_PILOT1, CHRFLAG0_GP1, BANK_0, /*goto*/ 0x3b) + set_target_chr(CHR_PILOT1) + goto_next(0x00) + + label(0x3b) + if_chr_deadish(CHR_PILOT2, /*goto*/ 0x3c) + if_chr_has_flag_bankx(CHR_PILOT2, CHRFLAG0_GP1, BANK_0, /*goto*/ 0x3c) + set_target_chr(CHR_PILOT2) + goto_next(0x00) + + label(0x3c) + if_chr_deadish(CHR_PILOT3, /*goto*/ 0x04) + if_chr_has_flag_bankx(CHR_PILOT3, CHRFLAG0_GP1, BANK_0, /*goto*/ 0x04) + set_target_chr(CHR_PILOT3) + goto_next(0x00) + + // No other pilots + label(0x04) + call_rng + if_rand_lt(128, /*goto*/ 0x3b) + set_target_chr(CHR_COOP) + if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x3b) + goto_next(0x00) + label(0x3b) + set_target_chr(CHR_BOND) + + // Got target (other pilot or Jo) + label(0x00) + if_target_is_player(/*goto*/ 0x07) + goto_next(0x04) + label(0x07) + set_shotlist(GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(0x04) + restart_timer + try_run_to_target(/*goto*/ 0x6d) + + beginloop(0x6d) + if_can_see_attack_target(/*goto*/ 0x07) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x6d) + + label(0x04) + goto_first(0x00) + + label(0x07) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) + label(0x04) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x6e) + + beginloop(0x6e) + if_chr_stopped(/*goto*/ 0x07) + endloop(0x6e) + + label(0x07) + goto_first(0x03) + + endlist +}; + +u8 func1013_lift_switch[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT_SWITCH, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + show_hudmsg(CHR_P1P2, L_DAM_028) // "Lift door has been unlocked." + unlock_door(0x18, 0x02) + unlock_door(0x19, 0x02) + open_door(0x18) + open_door(0x19) + set_stage_flag(STAGEFLAG_LIFT_UNLOCKED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_moonpool_switch[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_MOONPOOL_SWITCH, /*goto*/ 0x08) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x10) + show_hudmsg(CHR_P1P2, L_DAM_036) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_MOONPOOL_SWITCH_DESTROYED) + + label(0x10) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x08) + if_chr_activated_object(CHR_P1P2, OBJ_MOONPOOL_SWITCH, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + label(0x07) + show_hudmsg(CHR_P1P2, L_DAM_029) // "Lift has been activated." + set_stage_flag(STAGEFLAG_MOONPOOL_ACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0413_guard_alerted[] = { + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_chr_dodge_rating(2, 10) + set_accuracy(18) + set_reaction_speed(60) + set_chr_maxdamage(CHR_SELF, 70) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func1015_shuffle_hatchswitches[] = { + yield + shuffle_pelagic_switches + yield + yield + set_object_image(OBJ_BADHATCHSWITCH1, 0, TVCMDLIST_12) + yield + set_object_image(OBJ_BADHATCHSWITCH2, 0, TVCMDLIST_12) + yield + set_object_image(OBJ_BADHATCHSWITCH3, 0, TVCMDLIST_12) + yield + set_object_image(OBJ_BADHATCHSWITCH4, 0, TVCMDLIST_12) + yield + set_object_image(OBJ_HATCHSWITCH1, 0, TVCMDLIST_13) + yield + set_object_image(OBJ_HATCHSWITCH2, 0, TVCMDLIST_13) + yield + set_object_image(OBJ_HATCHSWITCH3, 0, TVCMDLIST_13) + yield + set_object_image(OBJ_HATCHSWITCH4, 0, TVCMDLIST_13) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define hatchswitch_logic(switch, flag) \ + yield \ + yield \ + \ + beginloop(0x00) \ + chr_toggle_p1p2(CHR_SELF) \ + if_chr_activated_object(CHR_P1P2, switch, /*goto*/ 0x07) \ + endloop(0x00) \ + \ + label(0x07) \ + assign_sound(SFX_043A, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, switch, TRUE) \ + set_object_image(switch, 0, TVCMDLIST_14) \ + set_stage_flag(flag) \ + \ + beginloop(0x0b) \ + if_stage_flag_eq(STAGEFLAG_HATCHSWITCHES_RESETTING, TRUE, /*goto*/ 0x07) \ + endloop(0x0b) \ + \ + label(0x07) \ + set_object_image(switch, 0, TVCMDLIST_13) \ + yield \ + yield \ + yield \ + yield \ + yield \ + unset_stage_flag(STAGEFLAG_HATCHSWITCH1_ACTIVATED) \ + unset_stage_flag(STAGEFLAG_HATCHSWITCH2_ACTIVATED) \ + unset_stage_flag(STAGEFLAG_HATCHSWITCH3_ACTIVATED) \ + unset_stage_flag(STAGEFLAG_HATCHSWITCH4_ACTIVATED) \ + goto_first(0x00) + +u8 func1016_hatchswitch1[] = { + hatchswitch_logic(OBJ_HATCHSWITCH1, STAGEFLAG_HATCHSWITCH1_ACTIVATED) + endlist +}; + +u8 func1017_hatchswitch2[] = { + hatchswitch_logic(OBJ_HATCHSWITCH2, STAGEFLAG_HATCHSWITCH2_ACTIVATED) + endlist +}; + +u8 func1018_hatchswitch3[] = { + hatchswitch_logic(OBJ_HATCHSWITCH3, STAGEFLAG_HATCHSWITCH3_ACTIVATED) + endlist +}; + +u8 func1019_hatchswitch4[] = { + hatchswitch_logic(OBJ_HATCHSWITCH4, STAGEFLAG_HATCHSWITCH4_ACTIVATED) + endlist +}; + +u8 func101a_badhatchswitches[] = { + yield + yield + + beginloop(0x00) + if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH1, /*goto*/ 0x0b) + if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH2, /*goto*/ 0x0c) + if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH3, /*goto*/ 0x0d) + if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH4, /*goto*/ 0x0e) + endloop(0x00) + + // 1 + label(0x0b) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH1, TRUE) + yield + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH1, FALSE) + set_object_image(OBJ_BADHATCHSWITCH1, 0, TVCMDLIST_0F) + goto_next(0x04) + + // 2 + label(0x0c) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH2, TRUE) + yield + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH2, FALSE) + set_object_image(OBJ_BADHATCHSWITCH2, 0, TVCMDLIST_0F) + goto_next(0x04) + + // 3 + label(0x0d) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH3, TRUE) + yield + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH3, FALSE) + set_object_image(OBJ_BADHATCHSWITCH3, 0, TVCMDLIST_0F) + goto_next(0x04) + + // 4 + label(0x0e) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH4, TRUE) + yield + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH4, FALSE) + set_object_image(OBJ_BADHATCHSWITCH4, 0, TVCMDLIST_0F) + goto_next(0x04) + + label(0x04) + show_hudmsg(CHR_P1P2, L_DAM_031) // "Unlocking sequence has been reset." + set_stage_flag(STAGEFLAG_HATCHSWITCHES_RESETTING) + restart_timer + + beginloop(0x10) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x10) + + label(0x04) + mute_channel(CHANNEL_6) + unset_stage_flag(STAGEFLAG_HATCHSWITCHES_RESETTING) + set_object_image(OBJ_BADHATCHSWITCH1, 0, TVCMDLIST_12) + set_object_image(OBJ_BADHATCHSWITCH2, 0, TVCMDLIST_12) + set_object_image(OBJ_BADHATCHSWITCH3, 0, TVCMDLIST_12) + set_object_image(OBJ_BADHATCHSWITCH4, 0, TVCMDLIST_12) + goto_first(0x00) + + endlist +}; + +u8 func101b_reactor_hum[] = { + yield + assign_sound(SFX_8146, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_REACTOR_SWITCH, 1, 2000, 3000) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_elvis_at_start[] = { + set_shotlist(AILIST_ELVIS_AT_START) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Dying + label(0x07) + if_sound_finished(CHANNEL_6, /*goto*/ 0x08) + mute_channel(CHANNEL_6) + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x04) + stop_chr + set_chr_maxdamage(CHR_SELF, 1) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x07) + endloop(0x0b) + + label(0x07) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DAM_032, MP3_04DC, CHANNEL_6, COLOR_06_WHITE) // "You go on ahead, Jo. I'll secure the perimeter. We..." + + beginloop(0x0c) + if_sound_finished(CHANNEL_6, /*goto*/ 0x07) + endloop(0x0c) + + label(0x07) + jog_to_pad(PAD_DAM_0040) + + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x07) + endloop(0x0d) + + label(0x3b) + restart_timer + label(0x0e) + stop_chr + if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x07) + call_rng + if_rand_gt(128, /*goto*/ 0x07) + + // 50% chance of doing an idle animation + call_rng + if_rand_lt(64, /*goto*/ 0x44) + if_rand_lt(128, /*goto*/ 0x45) + if_rand_lt(196, /*goto*/ 0x46) + + set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + chr_do_animation(ANIM_SMOKE_CIGARETTE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x4c) + + label(0x44) + chr_do_animation(ANIM_SCRATCH_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x4c) + + label(0x45) + chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x4c) + + label(0x46) + chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x4c) + + label(0x47) + chr_do_animation(ANIM_TWO_GUN_HOLD, 0, 100, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x4c) + + // 50% chance + label(0x07) + unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + if_chr_in_room(CHR_SELF, 0x00, 0x0029, /*goto*/ 0x04) + set_padpreset(PAD_DAM_0040) + goto_next(0x07) + + label(0x04) + call_rng + if_rand_lt(64, /*goto*/ 0x44) + if_rand_lt(128, /*goto*/ 0x45) + if_rand_lt(196, /*goto*/ 0x46) + try_set_target_pad_to_something(0x08, /*goto*/ 0x07) + label(0x44) + try_set_target_pad_to_something(0x02, /*goto*/ 0x07) + label(0x45) + try_set_target_pad_to_something(0x04, /*goto*/ 0x07) + label(0x46) + try_set_target_pad_to_something(0x08, /*goto*/ 0x07) + goto_next(0x4c) + label(0x07) + go_to_target_pad(GOPOSFLAG_WALK) + + beginloop(0x4c) + if_chr_in_room(CHR_BOND, 0x00, 0x0029, /*goto*/ 0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x002a, /*goto*/ 0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x002b, /*goto*/ 0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x0030, /*goto*/ 0x04) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x07) + if_chr_in_room(CHR_COOP, 0x00, 0x0029, /*goto*/ 0x04) + if_chr_in_room(CHR_COOP, 0x00, 0x002a, /*goto*/ 0x04) + if_chr_in_room(CHR_COOP, 0x00, 0x002b, /*goto*/ 0x04) + if_chr_in_room(CHR_COOP, 0x00, 0x0030, /*goto*/ 0x04) + label(0x07) + goto_next(0x10) + + label(0x04) + if_chr_stopped(/*goto*/ 0x4b) + endloop(0x4c) + + label(0x4b) + goto_first(0x3b) + + label(0x04) + label(0x10) + yield + if_difficulty_lt(DIFF_SA, /*goto*/ 0x07) + + // SA and PA + chr_move_to_pad(CHR_ELVIS, PAD_DAM_0020, 0x01, /*goto*/ 0x04) + goto_first(0x10) + + // Agent + label(0x07) + chr_move_to_pad(CHR_ELVIS, PAD_DAM_0096, 0x01, /*goto*/ 0x04) + goto_first(0x10) + + label(0x04) + stop_chr + set_stage_flag(STAGEFLAG_ELVIS_WARPED_FROM_START) + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + add_health_or_armor(2000) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Elvis leading the way from the moon pool to the diving area. + */ +u8 func0416_elvis_leading[] = { + label(0x03) + set_shotlist(AILIST_ELVIS_LEADING) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Dying + label(0x07) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x04) + if_just_injured(CHR_SELF, /*goto*/ 0x07) + goto_next(0x04) + + // Injured + label(0x07) + say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x3a) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x3a) + + label(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0b) + set_padpreset(PAD_DAM_0096) + label(0x12) + label(0x04) + run_to_pad(PAD_DAM_0096) + restart_timer + + beginloop(0x00) + if_timer_gt(1200, /*goto*/ 0x08) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0b) + label(0x07) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x00) + + label(0x08) + goto_first(0x12) + + label(0x07) + goto_first(0x03) + + label(0x04) + stop_chr + + beginloop(0x0c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0b) + label(0x07) + endloop(0x0c) + + label(0x0b) + call_rng + if_rand_lt(85, /*goto*/ 0x3b) + if_rand_lt(170, /*goto*/ 0x3c) + say_quip(CHR_BOND, 0x26, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x07) + + label(0x3b) + say_quip(CHR_BOND, 0x27, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x07) + + label(0x3c) + say_quip(CHR_BOND, 0x28, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + label(0x07) + set_shotlist(AILIST_ELVIS_LEADING) + set_returnlist(CHR_SELF, AILIST_ELVIS_LEADING) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func101c_check_elvis_dead[] = { + beginloop(0x00) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + show_hudmsg(CHR_BOND, L_DAM_033) // "Elvis has been killed." + set_stage_flag(STAGEFLAG_ELVIS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0418_elvis_at_moonpool[] = { + // @bug? If Elvis has enough health, and you can shoot him before he talks, + // he'll jump straight to leading the way without enabling AIVSAI on + // everyone. This may allow him to run past guards without engaging in + // combat. + set_shotlist(AILIST_ELVIS_LEADING) + + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x07) + endloop(0x00) + + label(0x07) + if_chr_deadish(CHR_SELF, /*goto*/ 0x07) + do_preset_animation(PRESETANIM_TALKRANDOM) + set_stage_flag(STAGEFLAG_MET_ELVIS) + speak(CHR_P1P2, L_DAM_034, SFX_81A4, CHANNEL_6, COLOR_06_WHITE) // "Joanna... What took you so long? Follow me - let's..." + + beginloop(0x0b) + if_sound_finished(CHANNEL_6, /*goto*/ 0x07) + endloop(0x0b) + + label(0x07) + set_ailist(CHR_SELF, AILIST_ELVIS_PREPARE_LEADING) + endlist +}; + +u8 func0417_elvis_prepare_leading[] = { + // Allow all other chrs to engage in combat with Elvis + set_chr_flag_bankx(0x03, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x04, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x05, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x06, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x07, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x08, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x09, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0c, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0f, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x10, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x11, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x12, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x13, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x14, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x15, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x16, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x17, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x18, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x19, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x1a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x1b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x1c, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x1d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x1e, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x1f, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x20, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x21, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x22, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x23, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x24, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x25, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x26, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x27, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x28, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x29, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x2a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x2b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x2c, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x2d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x2e, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x2f, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x30, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x31, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x32, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x33, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x34, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x35, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x36, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x37, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x38, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x39, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x3a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x3b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(CHR_PILOT1, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x3d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(CHR_PILOT2, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(CHR_PILOT3, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x40, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x41, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x42, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x43, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x44, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x45, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x46, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x47, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x48, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x49, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x4a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x4b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x4c, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x4d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x51, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x52, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x53, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x54, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x55, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x56, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x57, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x58, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x59, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x5a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x5b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x5c, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x5d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x5e, CHRFLAG0_AIVSAI, BANK_0) + set_ailist(CHR_SELF, AILIST_ELVIS_LEADING) + endlist +}; + +u8 func101d_alarm_switches[] = { + beginloop(0x00) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x21, /*goto*/ 0x07) + if_chr_activated_object(CHR_P1P2, 0x22, /*goto*/ 0x07) + if_chr_activated_object(CHR_P1P2, 0x23, /*goto*/ 0x07) + if_chr_activated_object(CHR_P1P2, 0x24, /*goto*/ 0x07) + if_chr_activated_object(CHR_P1P2, 0x25, /*goto*/ 0x07) + endloop(0x00) + + label(0x07) + if_alarm_active(/*goto*/ 0x07) + activate_alarm + show_hudmsg(CHR_P1P2, L_DAM_037) // "Alarm has been activated." + goto_next(0x0c) + + label(0x07) + deactivate_alarm + show_hudmsg(CHR_BOND, L_DAM_038) // "Alarm has been deactivated." + goto_next(0x0c) + + label(0x0c) + restart_timer + + beginloop(0x0d) + if_timer_gt(120, /*goto*/ 0x07) + endloop(0x0d) + + label(0x07) + goto_first(0x00) + + // Unreachable + set_ailist(CHR_SELF, AILIST_ELVIS_LEADING) + endlist +}; + +u8 func101e_alarm_images[] = { + beginloop(0x00) + if_alarm_active(/*goto*/ 0x07) + endloop(0x00) + + label(0x07) + set_object_flag(0x27, OBJFLAG_UNCOLLECTABLE) + set_object_flag(0x28, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(0x27, OBJFLAG2_INVISIBLE) + set_object_flag2(0x28, OBJFLAG2_INVISIBLE) + set_object_image(0x21, 0, TVCMDLIST_0F) + set_object_image(0x22, 0, TVCMDLIST_0F) + set_object_image(0x23, 0, TVCMDLIST_0F) + set_object_image(0x24, 0, TVCMDLIST_0F) + set_object_image(0x25, 0, TVCMDLIST_0F) + + beginloop(0x0b) + if_alarm_active(/*goto*/ 0x07) + goto_next(0x04) + + label(0x07) + endloop(0x0b) + + label(0x04) + set_object_image(0x21, 0, TVCMDLIST_14) + set_object_image(0x22, 0, TVCMDLIST_14) + set_object_image(0x23, 0, TVCMDLIST_14) + set_object_image(0x24, 0, TVCMDLIST_14) + set_object_image(0x25, 0, TVCMDLIST_14) + goto_first(0x00) + + endlist +}; + +u8 func101f_unlock_doors[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0b) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0c) + + // PA + unlock_door(0x2c, 0x80) + unlock_door(0x2d, 0x80) + + // SA + PA + label(0x0c) + unlock_door(0x29, 0x80) + unlock_door(0x2a, 0x80) + unlock_door(0x2b, 0x80) + + // A + SA + PA + label(0x0b) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_setup_rtracker[] = { + yield + set_object_flag3(0x27, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(0x28, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1421_setup_environment[] = { + yield + configure_environment(0x0060, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0061, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0063, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0064, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0067, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0068, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0069, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0069, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0070, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0070, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0071, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0071, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0072, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0072, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0073, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0077, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1004_msg_controlledfrom, 0x1004 }, + { func1005_msg_withoutautopilot, 0x1005 }, + { func1006_msg_conductoperations, 0x1006 }, + { func1009_open_reactor_hatch, 0x1009 }, + { func100a_reactor_switch, 0x100a }, + { func100b_check_diving_area_located, 0x100b }, + { func100c_check_end_level, 0x100c }, + { func100e_check_labtech_dead, 0x100e }, + { func100f_check_researchdata_collected, 0x100f }, + { func1010_alarm_responders, 0x1010 }, + { func1011_check_pilots_dead, 0x1011 }, + { func1012_choose_angry_pilot, 0x1012 }, + { func1013_lift_switch, 0x1013 }, + { func1014_moonpool_switch, 0x1014 }, + { func1015_shuffle_hatchswitches, 0x1015 }, + { func1016_hatchswitch1, 0x1016 }, + { func1017_hatchswitch2, 0x1017 }, + { func1018_hatchswitch3, 0x1018 }, + { func1019_hatchswitch4, 0x1019 }, + { func101a_badhatchswitches, 0x101a }, + { func101b_reactor_hum, 0x101b }, + { func101c_check_elvis_dead, 0x101c }, + { func101d_alarm_switches, 0x101d }, + { func101e_alarm_images, 0x101e }, + { func101f_unlock_doors, 0x101f }, + { func1020_setup_rtracker, 0x1020 }, + { func1421_setup_environment, 0x1421 }, + { func1002_intro, 0x0c00 }, + { func0c01_outro, 0x0c01 }, + { func0408_guard_unalerted, 0x0408 }, + { func0405_start_path00, 0x0405 }, + { func0401_pilot, 0x0401 }, + { func0402_init_pilot, 0x0402 }, + { func0401_pilot_dying, 0x0403 }, + { func0404_angry_pilot, 0x0404 }, + { func0c01_outro, 0x0414 }, + { func0415_elvis_at_start, 0x0415 }, + { func0416_elvis_leading, 0x0416 }, + { func0417_elvis_prepare_leading, 0x0417 }, + { func0418_elvis_at_moonpool, 0x0418 }, + { func0406_start_path01, 0x0406 }, + { func0407_start_path02, 0x0407 }, + { func0409_start_path03, 0x0409 }, + { func040a_start_path04, 0x040a }, + { func040b_labtech1, 0x040b }, + { func040c_labtech2, 0x040c }, + { func040d_labtech3, 0x040d }, + { func040e_init_labtech1, 0x040e }, + { func040f_init_labtech2, 0x040f }, + { func0410_init_labtech3, 0x0410 }, + { func0411_labtech_alerted, 0x0411 }, + { func0412_hide, 0x0412 }, + { func0413_guard_alerted, 0x0413 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupdepo.c b/src/ailists/setupdepo.c new file mode 100644 index 000000000..c75b11afc --- /dev/null +++ b/src/ailists/setupdepo.c @@ -0,0 +1,3149 @@ +// +// G5 Building +// + +#include "stagesetup.h" + +// Characters +#define CHR_CLOAK_1A 0x00 // first room +#define CHR_CLOAK_1B 0x01 // first room +#define CHR_LIGHTSWITCH_GUARD 0x02 +#define CHR_CLOAK_2A 0x03 // second room +#define CHR_CLOAK_2B 0x04 // second room +#define CHR_CLOAK_2C 0x05 // second room +#define CHR_CLOAK_2D 0x06 // second room +#define CHR_CASS 0x18 +#define CHR_TRENT 0x19 +#define CHR_STRIPES 0x1a +#define CHR_BLONDE 0x1b +#define CHR_INTRO_VICTIM 0x1d + +// Objects +#define OBJ_GENERATOR 0x01 +#define OBJ_LASERSWITCH1 0x03 +#define OBJ_LASERSWITCH2 0x04 +#define OBJ_LASERSWITCH3 0x05 +#define OBJ_LASERSWITCH4 0x06 +#define OBJ_SAFEDOOR 0x0b +#define OBJ_BACKUPDISK 0x0c +#define OBJ_KEYCARD1 0x0e +#define OBJ_KEYCARD2 0x0f +#define OBJ_DECODER 0x10 +#define OBJ_SAFEKEYPAD 0x11 +#define OBJ_ALARM1 0x12 +#define OBJ_ALARM2 0x13 +#define OBJ_ESCAPEDOOR1 0x18 +#define OBJ_ESCAPEDOOR2 0x1b +#define OBJ_LASER_1A 0x22 +#define OBJ_LASER_1B 0x23 +#define OBJ_LASER_1C 0x24 +#define OBJ_LASER_1D 0x25 +#define OBJ_LASER_2A 0x26 +#define OBJ_LASER_2B 0x27 +#define OBJ_LASER_2C 0x28 +#define OBJ_LASER_2D 0x29 +#define OBJ_LASER_3A 0x2a +#define OBJ_LASER_3B 0x2b +#define OBJ_LASER_3C 0x2c +#define OBJ_LASER_3D 0x2d +#define OBJ_LASER_4A 0x2e +#define OBJ_LASER_4B 0x2f +#define OBJ_LASER_4C 0x30 +#define OBJ_LASER_4D 0x31 +#define OBJ_MINE1 0x38 +#define OBJ_MINE2 0x39 +#define OBJ_NBOMB_CRATE 0x3c +#define OBJ_LIGHTSWITCH 0x3d +#define OBJ_CROSSBOW 0x3e +#define OBJ_CMP150_BOND 0x47 +#define OBJ_CMP150_COOP 0x48 +// Stage flags +#define STAGEFLAG_CLOAK1_ONE_REMAINING 0x00000002 +#define STAGEFLAG_CLOAK2_ONE_REMAINING 0x00000004 +#define STAGEFLAG_MEETING_FINISHED 0x00000008 +#define STAGEFLAG_CONSPIRATORS_ALERTED 0x00000010 +#define STAGEFLAG_VISITED_TOP_DOOR 0x00000020 +#define STAGEFLAG_SAFEKEYPAD_DESTROYED 0x00000040 +#define STAGEFLAG_LIGHTS_OFF 0x00000080 +#define STAGEFLAG_GENERATOR_SHUT_DOWN 0x00000100 +#define STAGEFLAG_GENERATOR_SHUT_DOWN2 0x00000200 // redundant +#define STAGEFLAG_GENERATOR_DESTROYED 0x00000400 +#define STAGEFLAG_LASERSET1_DISABLED 0x00000800 +#define STAGEFLAG_LASERSET2_DISABLED 0x00001000 +#define STAGEFLAG_00002000 0x00002000 +#define STAGEFLAG_LASERSET4_DISABLED 0x00004000 +#define STAGEFLAG_LASERSWITCH1_DESTROYED 0x00008000 +#define STAGEFLAG_LASERSWITCH2_DESTROYED 0x00010000 +#define STAGEFLAG_LASERSWITCH3_DESTROYED 0x00020000 +#define STAGEFLAG_LASERSWITCH4_DESTROYED 0x00040000 +#define STAGEFLAG_ALL_LASERS_DISABLED 0x00080000 +#define STAGEFLAG_DECODER_ATTACHED 0x00200000 +#define STAGEFLAG_LASERSET3_DISABLED 0x00800000 +#define STAGEFLAG_MEETING_STARTED 0x01000000 +#define STAGEFLAG_BACKUP_COLLECTED 0x08000000 +#define STAGEFLAG_MEETING_HOLOGRAPHED 0x10000000 +#define STAGEFLAG_20000000 0x20000000 +#define STAGEFLAG_ALARM_SOUNDING 0x40000000 +#define STAGEFLAG_EXITED_BUILDING 0x80000000 + +// AI Lists +#define AILIST_WALK_FROM_MEETING 0x0403 +#define AILIST_RUN_FROM_MEETING 0x0404 +#define AILIST_CLOAK2_HIDE 0x0405 +#define AILIST_INIT_TYPE1_GUARD 0x0406 +#define AILIST_INIT_CLOAK1_GUARD 0x0408 +#define AILIST_INTRO 0x040d +#define AILIST_MEETING_CUTSCENE 0x040e +#define AILIST_OUTRO 0x040f +#define AILIST_CLOAK_GUARD 0x0412 +#define AILIST_CLOAK2_GUARD 0x0414 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_DEPO_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_DEPO_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_DEPO_002) + briefing(BRIEFINGTYPE_TEXT_A, L_DEPO_003) + + beginobjective(0, L_DEPO_009, (DIFFBIT_PA | DIFFBIT_PD)) // "Disable damping field generator" + complete_flags(STAGEFLAG_GENERATOR_SHUT_DOWN) + fail_flags(STAGEFLAG_GENERATOR_DESTROYED) + endobjective + + beginobjective(1, L_DEPO_010, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Deactivate laser grid systems" + complete_flags(STAGEFLAG_ALL_LASERS_DISABLED) + complete_flags(STAGEFLAG_LASERSET1_DISABLED) + complete_flags(STAGEFLAG_LASERSET2_DISABLED) + complete_flags(STAGEFLAG_LASERSET3_DISABLED) + complete_flags(STAGEFLAG_LASERSET4_DISABLED) + fail_flags(STAGEFLAG_LASERSWITCH1_DESTROYED) + fail_flags(STAGEFLAG_LASERSWITCH2_DESTROYED) + fail_flags(STAGEFLAG_LASERSWITCH3_DESTROYED) + fail_flags(STAGEFLAG_LASERSWITCH4_DESTROYED) + endobjective + + beginobjective(2, L_DEPO_011, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Holograph meeting conspirators" + complete_flags(STAGEFLAG_MEETING_HOLOGRAPHED) + fail_flags(STAGEFLAG_20000000) + fail_flags(STAGEFLAG_CONSPIRATORS_ALERTED) + fail_flags(STAGEFLAG_00002000) + endobjective + + beginobjective(3, L_DEPO_012, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Retrieve Dr. Caroll backup from safe" + complete_flags(STAGEFLAG_BACKUP_COLLECTED) + fail_flags(STAGEFLAG_SAFEKEYPAD_DESTROYED) + endobjective + + beginobjective(4, L_DEPO_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Exit building" + complete_flags(STAGEFLAG_EXITED_BUILDING) + endobjective + + // First cloak room + chr(SPAWNFLAG_IGNORECOLLISION, CHR_CLOAK_1A, PAD_DEPO_007E, BODY_G5_SWAT_GUARD, HEAD_RANDOM, GAILIST_IDLE, PAD_DEPO_007E, -1, 200, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, CHR_CLOAK_1A, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + weapon(0x0100, MODEL_CHRCROSSBOW, CHR_CLOAK_1A, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_CROSSBOW) + tag(OBJ_CROSSBOW, -1) + + chr(SPAWNFLAG_IGNORECOLLISION, CHR_CLOAK_1B, PAD_DEPO_007F, BODY_G5_SWAT_GUARD, HEAD_RANDOM, GAILIST_IDLE, PAD_DEPO_007F, -1, 200, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, CHR_CLOAK_1B, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + tag(OBJ_KEYCARD1, 1) + key(0x0080, MODEL_KEYCARD, CHR_CLOAK_1A, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 4) + rename_object(-1, WEAPON_KEYCARD45, L_DEPO_014, L_DEPO_015, L_DEPO_016, L_DEPO_017, L_DEPO_018) // "Obtain alpha key card." + + // Between cloak rooms + chr(SPAWNFLAG_00000200 | SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_FIXEDHEIGHT, 0x02, PAD_DEPO_005F, BODY_G5_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, PAD_DEPO_0080, -1, 2000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_NONCOMBAT, SQUADRON_04, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + // Second cloak room + chr(0, 0x03, PAD_DEPO_005E, BODY_G5_SWAT_GUARD, HEAD_RANDOM, AILIST_CLOAK2_HIDE, PAD_DEPO_006E, -1, 1, 15, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(0, 0x04, PAD_DEPO_005D, BODY_G5_SWAT_GUARD, HEAD_RANDOM, AILIST_CLOAK2_HIDE, PAD_DEPO_006F, -1, 1, 15, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(0, 0x05, PAD_DEPO_0072, BODY_G5_SWAT_GUARD, HEAD_RANDOM, AILIST_CLOAK2_HIDE, PAD_DEPO_0070, -1, 1, 10, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(0, 0x06, PAD_DEPO_0013, BODY_G5_SWAT_GUARD, HEAD_RANDOM, AILIST_CLOAK2_HIDE, PAD_DEPO_0071, -1, 1, 10, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + tag(OBJ_KEYCARD2, 1) + key(0x0080, MODEL_KEYCARD, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 16) + rename_object(-1, WEAPON_KEYCARD46, L_DEPO_019, L_DEPO_020, L_DEPO_021, L_DEPO_022, L_DEPO_023) // "Obtain alpha key card." + + // Rest of stage + chr(SPAWNFLAG_00000200, 0x08, PAD_DEPO_002F, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_007B, -1, 200, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, 0x09, PAD_DEPO_0079, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_007C, -1, 200, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, 0x0a, PAD_DEPO_007A, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_007D, -1, 200, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x0b, PAD_DEPO_0026, BODY_G5_GUARD, HEAD_RANDOM, 0x040c, PAD_DEPO_0029, -1, 100, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x07, PAD_DEPO_005C, BODY_G5_GUARD, HEAD_BEAU1, 0x0409, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0c, PAD_DEPO_005B, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_0073, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0d, PAD_DEPO_001F, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_0073, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0e, PAD_DEPO_0067, BODY_G5_GUARD, HEAD_RANDOM, 0x040a, PAD_DEPO_0073, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0f, PAD_DEPO_0039, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_0074, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_06, -1, 0, 2, 0, 7, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x10, PAD_DEPO_0068, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_0074, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_06, -1, 0, 2, 0, 7, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x11, PAD_DEPO_0069, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, PAD_DEPO_0074, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_06, -1, 0, 2, 0, 7, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + +#if VERSION >= VERSION_PAL_BETA + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x12, PAD_DEPO_003F, BODY_G5_GUARD, HEAD_RANDOM, 0x040b, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_06, -1, 0, 2, 0, 7, 0) +#else + chr(SPAWNFLAG_00000200, 0x12, PAD_DEPO_003F, BODY_G5_GUARD, HEAD_RANDOM, 0x040b, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_06, -1, 0, 2, 0, 7, 0) +#endif + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + +#if VERSION >= VERSION_PAL_BETA + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x13, PAD_DEPO_006A, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x13, PAD_DEPO_006A, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + +#if VERSION >= VERSION_PAL_BETA + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x14, PAD_DEPO_006B, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x14, PAD_DEPO_006B, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + +#if VERSION >= VERSION_PAL_BETA + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x15, PAD_DEPO_006C, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x15, PAD_DEPO_006C, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + +#if VERSION >= VERSION_PAL_BETA + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x16, PAD_DEPO_006D, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x16, PAD_DEPO_006D, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x17, PAD_DEPO_0082, BODY_G5_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + tag(0x0d, 1) + chr(SPAWNFLAG_ANTINONINTERACTABLE, CHR_CASS, PAD_DEPO_0088, BODY_CASSANDRA, HEAD_CASSANDRA, 0x0410, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_02, 0x4a, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, CHR_BLONDE, PAD_DEPO_0087, BODY_MRBLONDE, HEAD_MRBLONDE, 0x0410, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_02, 0x4b, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, CHR_INTRO_VICTIM, PAD_DEPO_0009, BODY_G5_GUARD, HEAD_RANDOM, 0x0410, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, CHR_INTRO_VICTIM, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_ANTINONINTERACTABLE, CHR_TRENT, PAD_DEPO_003B, BODY_TRENT, HEAD_TRENT, 0x0411, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_ANTINONINTERACTABLE, CHR_STRIPES, PAD_DEPO_003C, BODY_STRIPES, HEAD_JON, 0x0411, -1, -1, 200, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + tag(OBJ_GENERATOR, 1) + multimonitor(0x0100, MODEL_PD_CONSOLE, PAD_DEPO_00D0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 0, 0) + tag(0x3f, 1) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_009C, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000010, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_009D, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000010, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + tag(0x40, -1) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A5, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A6, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A7, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A8, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00A9, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00B3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00B4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00AA, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00AB, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00AC, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DEPO_00AD, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + tag(0x34, 4) + tag(0x35, 4) + tag(0x36, 4) + tag(0x37, 4) + door(0x0100, MODEL_DOOR1A_G5, PAD_DEPO_0099, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000c000, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_DOOR1ATRI_G5, PAD_DEPO_0098, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0001f8ac, 0x0002a0e5, 0x0000434a, 0x0003491f, 0x000010d2, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR1B_G5, PAD_DEPO_009A, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000c000, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR1ATRI_G5, PAD_DEPO_009B, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0001f8ac, 0x0002a0e5, 0x0000434a, 0x0003491f, 0x000010d2, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0xfffffffd, 0x00000000) + tag(0x33, 1) + door(0x0100, MODEL_DOOR1A_G5, PAD_DEPO_00A0, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000c000, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_DOOR1ATRI_G5, PAD_DEPO_00A1, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0001f8ac, 0x0002a0e5, 0x0000434a, 0x0003491f, 0x000010d2, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR1B_G5, PAD_DEPO_009F, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000c000, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DOOR1ATRI_G5, PAD_DEPO_009E, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0001f8ac, 0x0002a0e5, 0x0000434a, 0x0003491f, 0x000010d2, 0, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0xfffffffd, 0x00000000) + tag(0x43, -4) + tag(0x44, -4) + tag(0x45, -4) + tag(0x46, -4) + tag(0x3a, 1) + door(0x0100, MODEL_DOOR4A_G5, PAD_DEPO_00B5, OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000e666, 0x00010000, 0x0000ffff, 0x00014000, 0x00001999, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR4B_G5, PAD_DEPO_00B6, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000e666, 0x00010000, 0x0000ffff, 0x00014000, 0x00001999, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x41, 1) + door(0x0100, MODEL_G5CARLIFTDOOR, PAD_DEPO_00B7, 0, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_G5CARLIFTDOOR, PAD_DEPO_00B8, 0, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x42, -1) + + tag(OBJ_BACKUPDISK, 1) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_ZIGGYCARD, PAD_DEPO_004C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_ONSHELF, 1000) +#else + stdobject(0x0100, MODEL_ZIGGYCARD, PAD_DEPO_1DF6B8A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_ONSHELF, 1000) +#endif + rename_object(-1, WEAPON_BACKUPDISK, L_DEPO_030, L_DEPO_031, L_DEPO_032, L_DEPO_033, L_DEPO_034) // "Obtain DAT tape." + + tag(OBJ_DECODER, 1) + stdobject(0x0200, MODEL_CHRDOORDECODER, PAD_DEPO_0050, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, 0, 1000) + + tag(OBJ_LIGHTSWITCH, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_DEPO_00ED, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 6) + tag(0x03, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_DEPO_00E6, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 19) + tag(0x04, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_DEPO_00E8, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 19) + tag(0x05, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_DEPO_00E9, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 19) + tag(0x06, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_DEPO_00EA, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 19) + tag(0x12, 1) + singlemonitor(0x0019, MODEL_G5_ALARM, PAD_DEPO_00E7, OBJFLAG_00000002, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE, 1000, 4) + tag(0x13, 1) + singlemonitor(0x0019, MODEL_G5_ALARM, PAD_DEPO_00EB, OBJFLAG_00000002, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, OBJFLAG3_INTERACTABLE, 1000, 4) + tag(OBJ_SAFEKEYPAD, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_DEPO_00EC, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 1) + tag(OBJ_SAFEDOOR, 1) + door(0x0100, MODEL_G5SAFEDOOR, PAD_DEPO_00C2, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x00500000, 0x00500000, 0x00001999, 0, DOORTYPE_SWINGING, 0x00000040, 0x00000e10, 0x00000000, 0x00000000, 0x00000300) + + tag(OBJ_CMP150_BOND, 1) + weapon(0x0100, MODEL_CHRCMP150, -1, OBJFLAG_WEAPON_40000000, 0, OBJFLAG3_PLAYERUNDROPPABLE, WEAPON_REMOTEMINE) + rename_object(-1, WEAPON_REMOTEMINE, L_DEPO_066, L_DEPO_067, L_DEPO_068, L_DEPO_069, L_DEPO_070) // "" + + tag(OBJ_CMP150_COOP, 1) + weapon(0x0100, MODEL_CHRCMP150, -1, OBJFLAG_WEAPON_40000000, 0, OBJFLAG3_PLAYERUNDROPPABLE, WEAPON_REMOTEMINE) + rename_object(-1, WEAPON_REMOTEMINE, L_DEPO_066, L_DEPO_067, L_DEPO_068, L_DEPO_069, L_DEPO_070) // "" + + glass(0x0100, MODEL_WINDOW, PAD_DEPO_00C0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DEPO_00C1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DEPO_00BE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x22, 4) + tag(0x23, 4) + tag(0x24, 4) + tag(0x25, 4) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + tag(0x26, 4) + tag(0x27, 4) + tag(0x28, 4) + tag(0x29, 4) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + tag(0x2a, 4) + tag(0x2b, 4) + tag(0x2c, 4) + tag(0x2d, 4) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00D9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00DA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00DB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00DC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + tag(0x2e, 4) + tag(0x2f, 4) + tag(0x30, 4) + tag(0x31, 4) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00DD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00DE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00DF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DEPO_00E0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DOOR_KEEPOPEN, OBJFLAG2_00020000 | OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0xfffffffd, 0x00000000) + tag(OBJ_ESCAPEDOOR1, 2) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_G5_ESCDOORUP, PAD_DEPO_00F0, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_G5_ESCDOORUPBOOM, PAD_DEPO_00F1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_G5_ESCDOORUPBOOM, PAD_DEPO_00F1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + tag(OBJ_ESCAPEDOOR2, 2) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_G5_ESCDOORDOWN, PAD_DEPO_00EE, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_G5_ESCDOORDOWNBOOM, PAD_DEPO_00EF, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_G5_ESCDOORDOWNBOOM, PAD_DEPO_00EF, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + + tag(OBJ_MINE1, 1) + mine(0x0100, MODEL_CHRREMOTEMINE, PAD_DEPO_0077, OBJFLAG_00000002, 0, 0, 1000, WEAPON_REMOTEMINE) + + tag(OBJ_MINE2, 1) + mine(0x0100, MODEL_CHRREMOTEMINE, PAD_DEPO_0078, OBJFLAG_00000002, 0, 0, 1000, WEAPON_REMOTEMINE) + + stdobject(0x0100, MODEL_DUMPSTER, PAD_DEPO_00F9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_DEPO_00FA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_DEPO_00FB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_DEPO_00FC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0028, MODEL_BAFTA, PAD_DEPO_004D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 1000) +#else + stdobject(0x0028, MODEL_BAFTA, PAD_DEPO_2B94077E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 1000) +#endif + stdobject(0x0133, MODEL_G5SMALLCHAIR, PAD_DEPO_00F3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0133, MODEL_G5SMALLCHAIR, PAD_DEPO_00F4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0133, MODEL_G5SMALLCHAIR, PAD_DEPO_00F5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0133, MODEL_G5SMALLCHAIR, PAD_DEPO_00F6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0133, MODEL_G5SMALLCHAIR, PAD_DEPO_00F7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + tag(0x4a, 1) + stdobject(0x0185, MODEL_G5BIGCHAIR, PAD_DEPO_00F8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + tag(0x4b, 1) + stdobject(0x0133, MODEL_G5SMALLCHAIR, PAD_DEPO_00F2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00C8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00C9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00CA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00CB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00CC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00CD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00CE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_DEPO_00CF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PUSHABLE, 500) + + tag(0x3c, 1) + weapon(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_DEPO_0095, OBJFLAG_00000001 | OBJFLAG_00000100, 0, 0, WEAPON_NBOMB) + + tag(0x3b, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_DEPO_0096, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x49, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_DEPO_0056, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2_SILENCER, -1) + ammo(AMMOTYPE_PISTOL, 100) + ammo(AMMOTYPE_NBOMB, 6) + outfit(OUTFIT_LEATHER) + intro_weapon(WEAPON_DOORDECODER, -1) + intro_weapon(WEAPON_EYESPY, -1) + spawn(PAD_DEPO_0083) + endintro +}; + +s32 path00[] = { + PAD_DEPO_0015, + PAD_DEPO_0014, + PAD_DEPO_0019, + PAD_DEPO_0018, + PAD_DEPO_0019, + PAD_DEPO_0014, + -1, +}; + +s32 path01[] = { + PAD_DEPO_0023, + PAD_DEPO_0025, + PAD_DEPO_0020, + PAD_DEPO_001A, + PAD_DEPO_001C, + PAD_DEPO_001A, + PAD_DEPO_0020, + PAD_DEPO_0025, + -1, +}; + +s32 path02[] = { + PAD_DEPO_0037, + PAD_DEPO_003F, + PAD_DEPO_0043, + PAD_DEPO_0041, + PAD_DEPO_0040, + PAD_DEPO_0042, + PAD_DEPO_0045, + PAD_DEPO_0046, + PAD_DEPO_0045, + PAD_DEPO_0042, + PAD_DEPO_0040, + PAD_DEPO_0041, + PAD_DEPO_0043, + PAD_DEPO_003F, + -1, +}; + +s32 path03[] = { + PAD_DEPO_0027, + PAD_DEPO_0028, + PAD_DEPO_0029, + PAD_DEPO_002A, + PAD_DEPO_002D, + PAD_DEPO_002E, + PAD_DEPO_002D, + PAD_DEPO_002A, + PAD_DEPO_0029, + PAD_DEPO_0028, + PAD_DEPO_0027, + PAD_DEPO_0026, + -1, +}; + +u8 func0409_start_path00[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(5) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(0) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040a_start_path01[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(5) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(1) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040b_start_path02[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(5) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(2) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040c_start_path03[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(5) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(3) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func1008_check_generator[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_GENERATOR, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_GENERATOR, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_GENERATOR_SHUT_DOWN, TRUE, /*goto*/ 0x2c) + + // Destroyed + mute_channel(CHANNEL_4) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_GENERATOR_DESTROYED) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + reloop(0x04) + + // Generator activated + label(0x08) + if_stage_flag_eq(STAGEFLAG_GENERATOR_SHUT_DOWN2, TRUE, /*goto*/ 0x09) + set_object_image(OBJ_GENERATOR, 0, TVCMDLIST_14) + set_object_image(OBJ_GENERATOR, 1, TVCMDLIST_14) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_0) + assign_sound(SFX_8147, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_GENERATOR, TRUE) + show_hudmsg(CHR_P1P2, L_DEPO_025) // "Damping field generator shut down." + set_stage_flag(STAGEFLAG_GENERATOR_SHUT_DOWN2) + set_stage_flag(STAGEFLAG_GENERATOR_SHUT_DOWN) + reloop(0x04) + + label(0x09) + show_hudmsg(CHR_P1P2, L_DEPO_026) // "Generator cannot be restarted." + endloop(0x04) + + endlist +}; + +u8 func1003_laser_switch_1[] = { + assign_sound(SFX_8119, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_LASER_1A, 1, 300, 400) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH1, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_LASERSWITCH1, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_LASERSWITCH1_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + reloop(0x04) + + // Activated/deactivated + label(0x08) + if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, TRUE, /*goto*/ 0x09) + + // Deactivated + set_object_image(OBJ_LASERSWITCH1, 0, TVCMDLIST_14) + show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." + set_stage_flag(STAGEFLAG_LASERSET1_DISABLED) + open_door(OBJ_LASER_1A) + open_door(OBJ_LASER_1B) + open_door(OBJ_LASER_1C) + open_door(OBJ_LASER_1D) + yield + set_object_flag(OBJ_LASER_1A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_1B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_1C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_1D, OBJFLAG_DOOR_KEEPOPEN) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH1, 0x012c, 0x0190, 0x00) + mute_channel(CHANNEL_0) + assign_sound(SFX_PICKUP_SHIELD, CHANNEL_0) + play_sound_from_entity(CHANNEL_0, OBJ_LASER_1A, 0x012c, 0x0190, 0x00) + goto_next(0x0a) + + // Activated + label(0x09) + show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." + unset_stage_flag(STAGEFLAG_LASERSET1_DISABLED) + set_object_image(OBJ_LASERSWITCH1, 0, TVCMDLIST_13) + close_door(OBJ_LASER_1A) + close_door(OBJ_LASER_1B) + close_door(OBJ_LASER_1C) + close_door(OBJ_LASER_1D) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH1, 0x012c, 0x0190, 0x00) + assign_sound(SFX_8119, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_LASER_1A, 1, 300, 400) + goto_next(0x0a) + label(0x0a) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1004_laser_switch_2[] = { + assign_sound(SFX_8119, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_LASER_2A, 1, 300, 400) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH2, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_LASERSWITCH2, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_LASERSWITCH2_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + reloop(0x04) + + // Activated/deactivated + label(0x08) + if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, TRUE, /*goto*/ 0x09) + + // Deactivated + set_object_image(OBJ_LASERSWITCH2, 0, TVCMDLIST_14) + show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." + set_stage_flag(STAGEFLAG_LASERSET2_DISABLED) + open_door(OBJ_LASER_2A) + open_door(OBJ_LASER_2B) + open_door(OBJ_LASER_2C) + open_door(OBJ_LASER_2D) + yield + set_object_flag(OBJ_LASER_2A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2D, OBJFLAG_DOOR_KEEPOPEN) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH2, 0x012c, 0x0190, 0x00) + mute_channel(CHANNEL_1) + assign_sound(SFX_PICKUP_SHIELD, CHANNEL_1) + play_sound_from_entity(CHANNEL_1, OBJ_LASER_2A, 0x012c, 0x0190, 0x00) + goto_next(0x0a) + + // Activated + label(0x09) + set_object_image(OBJ_LASERSWITCH2, 0, TVCMDLIST_13) + show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." + unset_stage_flag(STAGEFLAG_LASERSET2_DISABLED) + close_door(OBJ_LASER_2A) + close_door(OBJ_LASER_2B) + close_door(OBJ_LASER_2C) + close_door(OBJ_LASER_2D) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH2, 0x012c, 0x0190, 0x00) + assign_sound(SFX_8119, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_LASER_2A, 1, 300, 400) + goto_next(0x0a) + label(0x0a) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1005_laser_switch_3[] = { + assign_sound(SFX_8119, CHANNEL_2) + play_sound_from_object(CHANNEL_2, OBJ_LASER_3A, 1, 300, 400) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH3, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_LASERSWITCH3, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_LASERSWITCH3_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + reloop(0x04) + + // Activated/deactivated + label(0x08) + if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, TRUE, /*goto*/ 0x09) + + // Deactivated + set_object_image(OBJ_LASERSWITCH3, 0, TVCMDLIST_14) + show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." + set_stage_flag(STAGEFLAG_LASERSET3_DISABLED) + open_door(OBJ_LASER_3A) + open_door(OBJ_LASER_3B) + open_door(OBJ_LASER_3C) + open_door(OBJ_LASER_3D) + yield + set_object_flag(OBJ_LASER_3A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3D, OBJFLAG_DOOR_KEEPOPEN) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH3, 0x012c, 0x0190, 0x00) + mute_channel(CHANNEL_2) + assign_sound(SFX_PICKUP_SHIELD, CHANNEL_2) + play_sound_from_entity(CHANNEL_2, OBJ_LASER_3A, 0x012c, 0x0190, 0x00) + goto_next(0x0a) + + // Activated + label(0x09) + set_object_image(OBJ_LASERSWITCH3, 0, TVCMDLIST_13) + show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." + unset_stage_flag(STAGEFLAG_LASERSET3_DISABLED) + close_door(OBJ_LASER_3A) + close_door(OBJ_LASER_3B) + close_door(OBJ_LASER_3C) + close_door(OBJ_LASER_3D) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH3, 0x012c, 0x0190, 0x00) + assign_sound(SFX_8119, CHANNEL_2) + play_sound_from_object(CHANNEL_2, OBJ_LASER_3A, 1, 300, 400) + goto_next(0x0a) + label(0x0a) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1006_laser_switch_4[] = { + assign_sound(SFX_811A, CHANNEL_3) + play_sound_from_object(CHANNEL_3, OBJ_LASER_4A, 1, 300, 400) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH4, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_LASERSWITCH4, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_LASERSWITCH4_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + reloop(0x04) + + // Activated/deactivated + label(0x08) + if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, TRUE, /*goto*/ 0x09) + + // Deactivated + set_object_image(OBJ_LASERSWITCH4, 0, TVCMDLIST_14) + show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." + set_stage_flag(STAGEFLAG_LASERSET4_DISABLED) + open_door(OBJ_LASER_4A) + open_door(OBJ_LASER_4B) + open_door(OBJ_LASER_4C) + open_door(OBJ_LASER_4D) + yield + set_object_flag(OBJ_LASER_4A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4D, OBJFLAG_DOOR_KEEPOPEN) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH4, 0x012c, 0x0190, 0x00) + mute_channel(CHANNEL_3) + assign_sound(SFX_PICKUP_SHIELD, CHANNEL_3) + play_sound_from_entity(CHANNEL_3, OBJ_LASER_4A, 0x012c, 0x0190, 0x00) + goto_next(0x0a) + + // Activated + label(0x09) + set_object_image(OBJ_LASERSWITCH4, 0, TVCMDLIST_13) + show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." + unset_stage_flag(STAGEFLAG_LASERSET4_DISABLED) + close_door(OBJ_LASER_4A) + close_door(OBJ_LASER_4B) + close_door(OBJ_LASER_4C) + close_door(OBJ_LASER_4D) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH4, 0x012c, 0x0190, 0x00) + assign_sound(SFX_811A, CHANNEL_3) + play_sound_from_object(CHANNEL_3, OBJ_LASER_4A, 1, 300, 400) + goto_next(0x0a) + label(0x0a) + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1007_init_lasers[] = { + yield + + // Wait for cutscene to finish + beginloop(0x8f) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x8f) + + label(0x06) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + // SA/PA - bring up lasers + close_door(OBJ_LASER_1A) + close_door(OBJ_LASER_2A) + close_door(OBJ_LASER_3A) + close_door(OBJ_LASER_4A) + close_door(OBJ_LASER_1B) + close_door(OBJ_LASER_2B) + close_door(OBJ_LASER_3B) + close_door(OBJ_LASER_4B) + close_door(OBJ_LASER_1C) + close_door(OBJ_LASER_2C) + close_door(OBJ_LASER_3C) + close_door(OBJ_LASER_4C) + close_door(OBJ_LASER_1D) + close_door(OBJ_LASER_2D) + close_door(OBJ_LASER_3D) + close_door(OBJ_LASER_4D) + + // Wait until all lasers disabled, show message and set flag + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_ALL_LASERS_DISABLED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_029) // "All laser grid systems shut down." + set_stage_flag(STAGEFLAG_ALL_LASERS_DISABLED) + label(0x2c) + endloop(0x04) + + // Agent - take down lasers + label(0x0d) + set_object_image(OBJ_LASERSWITCH1, 0, TVCMDLIST_14) + set_object_image(OBJ_LASERSWITCH2, 0, TVCMDLIST_14) + set_object_image(OBJ_LASERSWITCH3, 0, TVCMDLIST_14) + set_object_image(OBJ_LASERSWITCH4, 0, TVCMDLIST_14) + open_door(OBJ_LASER_1A) + open_door(OBJ_LASER_2A) + open_door(OBJ_LASER_3A) + open_door(OBJ_LASER_4A) + open_door(OBJ_LASER_1B) + open_door(OBJ_LASER_2B) + open_door(OBJ_LASER_3B) + open_door(OBJ_LASER_4B) + open_door(OBJ_LASER_1C) + open_door(OBJ_LASER_2C) + open_door(OBJ_LASER_3C) + open_door(OBJ_LASER_4C) + open_door(OBJ_LASER_1D) + open_door(OBJ_LASER_2D) + open_door(OBJ_LASER_3D) + open_door(OBJ_LASER_4D) + yield + set_object_flag(OBJ_LASER_1A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4A, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_1B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4B, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_1C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4C, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_1D, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_2D, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_3D, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_LASER_4D, OBJFLAG_DOOR_KEEPOPEN) + set_stage_flag(STAGEFLAG_LASERSET1_DISABLED) + set_stage_flag(STAGEFLAG_LASERSET2_DISABLED) + set_stage_flag(STAGEFLAG_LASERSET3_DISABLED) + set_stage_flag(STAGEFLAG_LASERSET4_DISABLED) + set_stage_flag(STAGEFLAG_ALL_LASERS_DISABLED) + label(0x0e) + yield + open_door(OBJ_LASER_1A) + open_door(OBJ_LASER_2A) + open_door(OBJ_LASER_3A) + open_door(OBJ_LASER_4A) + open_door(OBJ_LASER_1B) + open_door(OBJ_LASER_2B) + open_door(OBJ_LASER_3B) + open_door(OBJ_LASER_4B) + open_door(OBJ_LASER_1C) + open_door(OBJ_LASER_2C) + open_door(OBJ_LASER_3C) + open_door(OBJ_LASER_4C) + open_door(OBJ_LASER_1D) + open_door(OBJ_LASER_2D) + open_door(OBJ_LASER_3D) + open_door(OBJ_LASER_4D) + yield + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_1) + mute_channel(CHANNEL_2) + mute_channel(CHANNEL_3) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_spawner_during_decode[] = { + // Wait for alarm or decoder attached + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_DECODER_ATTACHED, TRUE, /*goto*/ 0x06) + if_alarm_active(/*goto*/ 0x61) + endloop(0x04) + + // Decoder is attached + label(0x06) + yield + yield + + // Wait 8.3 seconds + restart_timer + + beginloop(0x08) + if_timer_gt(500, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + activate_alarm + + // Spawn two swat guards + label(0x61) + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_0058, 0x0401, SPAWNFLAG_00000200, /*goto*/ 0x06) + label(0x06) + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_003F, 0x0402, SPAWNFLAG_00000200, /*goto*/ 0x06) + label(0x06) + + // Every half second, use RNG to decide whether to consider spawning more. + // 55/255 chance of passing. + label(0x09) + restart_timer + call_rng + + beginloop(0x0a) + if_rand_gt(200, /*goto*/ 0x06) + if_timer_gt(30, /*goto*/ 0x2c) + endloop(0x0a) + + label(0x2c) + reloop(0x09) + + label(0x06) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x55) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x56) + if_num_chrs_in_squadron_gt(5, 0x09, /*goto*/ 0x2c) + if_kill_count_gt(50, /*goto*/ 0x2c) + goto_next(0x57) + + // Agent + label(0x55) + if_num_chrs_in_squadron_gt(3, 0x09, /*goto*/ 0x2c) + if_kill_count_gt(50, /*goto*/ 0x2c) + goto_next(0x57) + + // Special Agent + label(0x56) + if_num_chrs_in_squadron_gt(4, 0x09, /*goto*/ 0x2c) + if_kill_count_gt(50, /*goto*/ 0x2c) + goto_next(0x57) + + // All difficulties + label(0x57) + call_rng + if_rand_gt(128, /*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_VISITED_TOP_DOOR, TRUE, /*goto*/ 0x2c) + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_0058, 0x0401, SPAWNFLAG_00000200, /*goto*/ 0x06) + label(0x06) + goto_next(0x0d) + + label(0x2c) + reloop(0x09) + + label(0x0b) + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_003F, 0x0402, SPAWNFLAG_00000200, /*goto*/ 0x06) + label(0x06) + label(0x0d) + restart_timer + + beginloop(0x0e) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + endloop(0x09) + + endlist +}; + +#define init_swat \ + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) \ + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(15) \ + set_reaction_speed(25) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x06) \ + label(0x06) \ + set_chr_team(CHR_SELF, TEAM_ENEMY) \ + set_squadron(SQUADRON_09) \ + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) \ + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) \ + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) \ + set_alertness(90) \ + set_self_chrflag(CHRCFLAG_00000200) \ + rebuild_teams \ + rebuild_squadrons \ + run_to_pad(PAD_DEPO_004E) + +u8 func0401_init_swat1[] = { + init_swat + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x2c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2c) + if_chr_in_room(CHR_SELF, 0x00, 0x0050, /*goto*/ 0x06) + endloop(0x08) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + label(0x06) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * Same as above, but guards with this function will become unalerted if they + * lose sight of Jo regardless of what room they're in. + */ +u8 func0402_init_swat2[] = { + init_swat + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x2c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2c) + if_chr_in_room(CHR_SELF, 0x00, 0x0050, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + label(0x06) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func100a_give_keycards[] = { + set_object_flag(OBJ_KEYCARD1, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_KEYCARD1, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_KEYCARD2, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_KEYCARD2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_CROSSBOW, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_CROSSBOW, OBJFLAG_UNCOLLECTABLE) + + set_chr_chrflag(CHR_CLOAK_1A, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_CLOAK_1B, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_CLOAK_2A, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_CLOAK_2B, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_CLOAK_2C, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_CLOAK_2D, CHRCFLAG_KILLCOUNTABLE) + + // Wait for trigger + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_CLOAK1_ONE_REMAINING, TRUE, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + if_chr_deadish(CHR_CLOAK_1A, /*goto*/ 0x06) + + // First cloacked guard is alive + give_object_to_chr(OBJ_KEYCARD1, CHR_CLOAK_1A) + give_object_to_chr(OBJ_CROSSBOW, CHR_CLOAK_1A) + set_target_chr(CHR_CLOAK_1A) + goto_next(0x2c) + + // First cloaked guard is dead + label(0x06) + give_object_to_chr(OBJ_KEYCARD1, CHR_CLOAK_1B) + give_object_to_chr(OBJ_CROSSBOW, CHR_CLOAK_1B) + set_target_chr(CHR_CLOAK_1B) + + label(0x2c) + unset_object_flag(OBJ_KEYCARD1, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_KEYCARD1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_CROSSBOW, OBJFLAG2_INVISIBLE) + unset_object_flag(OBJ_CROSSBOW, OBJFLAG_UNCOLLECTABLE) + + // Wait for the chr who holds the keycard to die + beginloop(0x55) + if_chr_knockedout(CHR_TARGET, /*goto*/ 0x08) + if_chr_dead(CHR_TARGET, /*goto*/ 0x2c) + if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x2c) + endloop(0x55) + + label(0x2c) + set_object_flag2(OBJ_CROSSBOW, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_CROSSBOW, OBJFLAG_UNCOLLECTABLE) + disable_object(OBJ_CROSSBOW) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_CLOAK2_ONE_REMAINING, TRUE, /*goto*/ 0x2c) + endloop(0x08) + + // Second room + label(0x2c) + if_chr_deadish(CHR_CLOAK_2A, /*goto*/ 0x06) + + // 2A alive + give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2A) + goto_next(0x2c) + + // 2A dead + label(0x06) + if_chr_deadish(CHR_CLOAK_2B, /*goto*/ 0x06) + give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2B) + goto_next(0x2c) + + // 2B dead + label(0x06) + if_chr_deadish(CHR_CLOAK_2C, /*goto*/ 0x06) + give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2C) + goto_next(0x2c) + + // 2C dead + label(0x06) + give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2D) + + label(0x2c) + unset_object_flag(OBJ_KEYCARD2, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_KEYCARD2, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_backup_collected[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_BACKUPDISK, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + set_stage_flag(STAGEFLAG_BACKUP_COLLECTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_set_ai[] = { + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + + // On counterop SA and PA, give Joanna a CMP150 + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + give_object_to_chr(OBJ_CMP150_BOND, CHR_BOND) + give_object_to_chr(OBJ_CMP150_COOP, CHR_COOP) + label(0x06) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func100e_check_conspirators_alerted[] = { + // Wait for alarm + beginloop(0x04) + if_alarm_active(/*goto*/ 0x06) + reloop(0x04) + + // These objects are doors + label(0x06) + unset_object_flag2(0x3f, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x40, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x41, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x42, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x43, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x44, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x45, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x46, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x34, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x35, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x36, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x37, OBJFLAG2_AICANNOTUSE) + + set_stage_flag(STAGEFLAG_ALARM_SOUNDING) + if_stage_flag_eq(STAGEFLAG_MEETING_STARTED, TRUE, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_CONSPIRATORS_ALERTED) + set_ailist(CHR_CASS, AILIST_RUN_FROM_MEETING) + set_ailist(0x1c, AILIST_RUN_FROM_MEETING) // chr doesn't exist + set_ailist(CHR_BLONDE, AILIST_RUN_FROM_MEETING) + show_hudmsg(CHR_BOND, L_DEPO_041) // "Conspirators have been alerted." + + // Wait until alarm not active + label(0x06) + + beginloop(0x55) + if_alarm_active(/*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x55) + + label(0x06) + unset_stage_flag(STAGEFLAG_ALARM_SOUNDING) + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_alarm_switches[] = { + // Wait until player activated alarm switch + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_ALARM1, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_ALARM2, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDING, TRUE, /*goto*/ 0x06) + show_hudmsg(CHR_P1P2, L_DEPO_042) // "Alarm activated." + set_stage_flag(STAGEFLAG_ALARM_SOUNDING) + activate_alarm + reloop(0x04) + + label(0x06) + show_hudmsg(CHR_P1P2, L_DEPO_043) // "Alarm deactivated." + unset_stage_flag(STAGEFLAG_ALARM_SOUNDING) + deactivate_alarm + endloop(0x04) + + endlist +}; + +u8 func1010_safe_cracking[] = { + // Wait for player to activate keypad or for it to be destroyed + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_SAFEKEYPAD, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_064) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_SAFEKEYPAD_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_SAFEKEYPAD, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DOORDECODER, /*goto*/ 0x2c) + show_hudmsg(CHR_P1P2, L_DEPO_044) // "Safe door is locked." + endloop(0x04) + + label(0x2c) + show_hudmsg(CHR_P1P2, L_DEPO_045) // "Door Decoder attached." + remove_weapon_from_inventory(WEAPON_DOORDECODER) + move_object_to_pad(OBJ_DECODER, PAD_DEPO_0075) + set_stage_flag(STAGEFLAG_DECODER_ATTACHED) + assign_sound(SFX_8144, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_SAFEKEYPAD, 1, 300, 400) + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + speak(CHR_BOND, L_DEPO_038, MP3_0754, CHANNEL_5, COLOR_00_GREEN) // "INTRUDER ALERT - all security to the vault." + play_x_track(XREASON_DEFAULT, 10, 180) + yield + set_countdown_timer(60) + show_hudmsg(CHR_P1P2, L_DEPO_036) // "Initiating cracking routines." + yield + show_countdown_timer + start_countdown_timer + restart_timer + + beginloop(0x5e) + if_timer_gt(180, /*goto*/ 0x2c) + endloop(0x5e) + + label(0x2c) + activate_alarm + + beginloop(0x08) + if_object_in_good_condition(OBJ_SAFEKEYPAD, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_DEPO_064) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_SAFEKEYPAD_DESTROYED) + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + if_countdown_timer_lt(1, /*goto*/ 0x06) + endloop(0x08) + + // Unlock + label(0x06) + mute_channel(CHANNEL_1) + assign_sound(SFX_8145, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_SAFEKEYPAD, TRUE) + show_hudmsg(CHR_P1P2, L_DEPO_037) // "Door Decoder finished - door unlocked." + unlock_door(OBJ_SAFEDOOR, 0x40) + unset_object_flag2(OBJ_SAFEDOOR, OBJFLAG2_AICANNOTUSE) + open_door(OBJ_SAFEDOOR) + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_check_for_end[] = { + // Wait until player on ending catwalk + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0060, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0061, /*goto*/ 0x06) + reloop(0x08) + + label(0x06) + if_chr_deadish(CHR_P1P2, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x08) + + label(0x06) + set_stage_flag(STAGEFLAG_EXITED_BUILDING) + set_invincible(CHR_BOND) + yield + yield + revoke_control(CHR_BOND, 4) + hide_countdown_timer + stop_countdown_timer + if_all_objectives_complete(/*goto*/ 0x53) + show_hudmsg(CHR_BOND, L_DEPO_051) // "Objectives incomplete - MISSION FAILED." + label(0x2c) + restart_timer + + beginloop(0x52) + if_timer_gt(280, /*goto*/ 0x2c) + endloop(0x52) + + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Objectives complete + label(0x53) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x06) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func1013_check_escape_doors[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_ESCAPEDOOR1, /*goto*/ 0x06) + goto_next(0x2c) + label(0x06) + if_object_in_good_condition(OBJ_ESCAPEDOOR2, /*goto*/ 0x06) + label(0x2c) + activate_alarm + set_ailist(CHR_SELF, GAILIST_IDLE) + reloop(0x04) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1014_check_camspy_location[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(0x00, /*camspy*/ 0x02, VERSION >= VERSION_NTSC_1_0 ? 0x0094 : 0x003a, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_CONSPIRATORS_ALERTED, TRUE, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_MEETING_HOLOGRAPHED) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_check_for_meeting_trigger[] = { + // Wait until meeting started then start cutscene + beginloop(0x00) + if_stage_flag_eq(STAGEFLAG_MEETING_HOLOGRAPHED, TRUE, /*goto*/ 0x06) + endloop(0x00) + + label(0x06) + set_ailist(CHR_SELF, AILIST_MEETING_CUTSCENE) + endlist +}; + +u8 func0403_walk_from_meeting[] = { + walk_to_pad(PAD_DEPO_0085) + + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x04) + + label(0x06) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0404_run_from_meeting[] = { + run_to_pad(PAD_DEPO_0085) + + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x04) + + label(0x06) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +/** + * Monitor the laser states and unset the stage flags when they become enabled + * (ie. door is closed). This seems redundant because the flags are unset when + * the switches are used. Maybe they close after a long timeout or something. + */ +u8 func1017_check_lasers_closed[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ALL_LASERS_DISABLED, TRUE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_MEETING_HOLOGRAPHED, TRUE, /*goto*/ 0x08) + if_door_state(OBJ_LASER_1A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + unset_stage_flag(STAGEFLAG_LASERSET1_DISABLED) + label(0x2c) + if_door_state(OBJ_LASER_2A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + unset_stage_flag(STAGEFLAG_LASERSET2_DISABLED) + label(0x2c) + if_door_state(OBJ_LASER_3A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + unset_stage_flag(STAGEFLAG_LASERSET3_DISABLED) + label(0x2c) + if_door_state(OBJ_LASER_4A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + unset_stage_flag(STAGEFLAG_LASERSET4_DISABLED) + label(0x2c) + endloop(0x04) + + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_INTRO) + camera_movement(ANIM_CUT_DEPO_INTRO_CAM) + cmd0175(60) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_INTRO_VICTIM, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_INTRO_GUARD_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_VICTIM, 4) + + restart_timer + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + + beginloop(0x55) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(74, /*goto*/ 0x06) + endloop(0x55) + + label(0x06) + play_sound(SFX_0161, CHANNEL_7) + + beginloop(0x56) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(100, /*goto*/ 0x06) + endloop(0x56) + + label(0x06) + play_sound(SFX_0085, CHANNEL_7) + + beginloop(0x57) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(172, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + play_sound(SFX_0163, CHANNEL_7) + + beginloop(0x58) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(173, /*goto*/ 0x06) + endloop(0x58) + + label(0x06) + play_sound(SFX_0164, CHANNEL_6) + + beginloop(0x59) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(278, /*goto*/ 0x06) + endloop(0x59) + + label(0x06) + play_sound(SFX_0161, CHANNEL_7) + + beginloop(0x5a) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(312, /*goto*/ 0x06) + endloop(0x5a) + + label(0x06) + play_sound(SFX_0162, CHANNEL_7) + + beginloop(0x5b) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(356, /*goto*/ 0x06) + endloop(0x5b) + + label(0x06) + play_sound(SFX_0163, CHANNEL_7) + + beginloop(0x5c) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(396, /*goto*/ 0x06) + endloop(0x5c) + + label(0x06) + play_sound(SFX_0164, CHANNEL_7) + + beginloop(0x5d) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(434, /*goto*/ 0x06) + endloop(0x5d) + + label(0x06) + play_sound(SFX_0161, CHANNEL_7) + + beginloop(0x5e) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(478, /*goto*/ 0x06) + endloop(0x5e) + + label(0x06) + play_sound(SFX_0162, CHANNEL_7) + + beginloop(0x60) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(515, /*goto*/ 0x06) + endloop(0x60) + + label(0x06) + play_sound(SFX_0163, CHANNEL_7) + + beginloop(0x61) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(560, /*goto*/ 0x06) + endloop(0x61) + + label(0x06) + play_sound(SFX_0164, CHANNEL_7) + + beginloop(0x65) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(568, /*goto*/ 0x06) + endloop(0x65) + + label(0x06) + play_sound(SFX_0162, CHANNEL_6) + + beginloop(0x62) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(595, /*goto*/ 0x06) + endloop(0x62) + + label(0x06) + play_sound(SFX_0161, CHANNEL_7) + + beginloop(0x63) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(630, /*goto*/ 0x06) + endloop(0x63) + + label(0x06) + play_sound(SFX_0162, CHANNEL_7) + + beginloop(0x66) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(638, /*goto*/ 0x06) + endloop(0x66) + + label(0x06) + play_sound(SFX_0163, CHANNEL_6) + + beginloop(0x68) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(670, /*goto*/ 0x06) + endloop(0x68) + + label(0x06) + play_sound(SFX_002E, CHANNEL_7) + + beginloop(0x67) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(670, /*goto*/ 0x06) + endloop(0x67) + + label(0x06) + play_sound(SFX_0045, CHANNEL_6) + chr_drop_weapon(CHR_INTRO_VICTIM) + + beginloop(0x69) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(672, /*goto*/ 0x06) + endloop(0x69) + + label(0x06) + play_sound(SFX_ARGH_MALE_0087, CHANNEL_5) + + beginloop(0x64) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(702, /*goto*/ 0x06) + endloop(0x64) + + label(0x06) + play_sound(SFX_0164, CHANNEL_6) + + beginloop(0x6a) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(718, /*goto*/ 0x06) + endloop(0x6a) + + label(0x06) + play_sound(SFX_007A, CHANNEL_7) + + beginloop(0x6b) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(722, /*goto*/ 0x06) + endloop(0x6b) + + label(0x06) + play_sound(SFX_007C, CHANNEL_6) + + beginloop(0x6c) + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(764, /*goto*/ 0x06) + endloop(0x6c) + + label(0x06) + play_sound(SFX_0082, CHANNEL_5) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0x54) + label(0x2c) + if_controller_button_pressed(/*goto*/ 0x54) + label(0x2c) + endloop(0x08) + + label(0x54) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_INTRO_VICTIM, CHRHFLAG_00020000) + set_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_PERIMDISABLEDTMP) + chr_do_animation(ANIM_CUT_DEPO_INTRO_GUARD_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_VICTIM, 2) + + stop_cutscene_track + stop_ambient_track + enter_firstperson + chr_do_animation(ANIM_CUT_DEPO_INTRO_GUARD_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_VICTIM, 2) + chr_drop_weapon(CHR_INTRO_VICTIM) + yield + set_ailist(CHR_CLOAK_1A, AILIST_INIT_CLOAK1_GUARD) + set_ailist(CHR_CLOAK_1B, AILIST_INIT_CLOAK1_GUARD) + yield + kill(CHR_INTRO_VICTIM) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +// Used in both mid and outro cutscenes +#define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x54) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + \ + label(0x06) + +u8 func040e_meeting_cutscene[] = { + deactivate_alarm + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_MIDCUTSCENE) + camera_movement(ANIM_CUT_DEPO_MID_CAM) + set_stage_flag(STAGEFLAG_MEETING_STARTED) + set_ailist(CHR_BLONDE, GAILIST_IDLE) + set_ailist(CHR_CASS, GAILIST_IDLE) + set_ailist(CHR_TRENT, GAILIST_IDLE) + set_ailist(CHR_STRIPES, GAILIST_IDLE) + + set_chr_chrflag(CHR_BLONDE, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_BLONDE, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_BLONDE, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_MID_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BLONDE, 4) + + set_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_MID_CASS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 4) + + set_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TRENT, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_MID_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 4) + + set_chr_chrflag(CHR_STRIPES, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_STRIPES, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_STRIPES, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_MID_STR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_STRIPES, 4) + restart_timer + + beginloop(0x55) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x55) + + label(0x06) + speak(CHR_BOND, L_DEPO_072, MP3_040C, CHANNEL_5, COLOR_04_ORANGE) // "We've recovered the sapient from Carrington and al..." + + wait_until(752, 0x56) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(760, 0x57) + speak(CHR_BOND, L_DEPO_073, MP3_040D, CHANNEL_7, COLOR_03_RED) // "This will reduce its efficiency. My team will have..." + + wait_until(813, 0x58) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(864, 0x59) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(1183, 0x5a) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(1466, 0x5b) + play_sound(SFX_0161, CHANNEL_6) + + // Someone screwed up the labelling here... + // 5c was probably supposed to go here. + yield + if_controller_button_pressed(/*goto*/ 0x54) + if_timer_gt(1594, /*goto*/ 0x06) + goto_first(0x5c) + label(0x06) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(1638, 0x5c) + play_sound(SFX_0593, CHANNEL_6) + + wait_until(1684, 0x5d) + speak(CHR_BOND, L_DEPO_074, MP3_040E, CHANNEL_5, COLOR_04_ORANGE) // "No one could have predicted that! And I resent bei..." + + wait_until(1780, 0x5e) + play_sound_from_object2(CHANNEL_6, 0x3a, SFX_01D5, 0x00, 0x00) + + wait_until(2050, 0x60) + play_sound_from_object2(CHANNEL_7, 0x3a, SFX_00EC, 0x00, 0x00) + + wait_until(2070, 0x5f) + open_door(0x3a) + play_sound_from_object2(0x0a, 0x3a, SFX_DOOR_81B0, 0x00, 0x00) + + wait_until(2195, 0x61) + play_sound(SFX_0171, CHANNEL_6) + + wait_until(2227, 0x62) + play_sound(SFX_0172, CHANNEL_5) + + wait_until(2272, 0x63) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(2291, 0x64) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(2316, 0x65) + speak(CHR_BOND, L_DEPO_075, MP3_040F, CHANNEL_7, COLOR_03_RED) // "The President turned down your request for the loa..." + + wait_until(2342, 0x67) + play_sound(SFX_0162, CHANNEL_6) + close_door(0x3a) + + wait_until(2387, 0x68) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(2406, 0x69) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(2521, 0x6a) + play_sound(SFX_0161, CHANNEL_5) + + wait_until(2547, 0x6b) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(2584, 0x6c) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(2586, 0x6d) + play_sound(SFX_0164, CHANNEL_5) + + wait_until(2617, 0x6e) + play_sound(SFX_0164, CHANNEL_5) + + wait_until(2662, 0x70) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(2668, 0x71) + play_sound(SFX_0161, CHANNEL_5) + + wait_until(2692, 0x6f) + speak(CHR_BOND, L_DEPO_076, MP3_0410, CHANNEL_7, COLOR_03_RED) // "Could it be you overestimated your influence over ..." + + wait_until(2705, 0x72) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(2713, 0x73) + play_sound(SFX_0162, CHANNEL_5) + + wait_until(2796, 0x74) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(2937, 0x75) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(2971, 0x76) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(3000, 0x77) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(3046, 0x78) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(3048, 0x79) + speak(CHR_BOND, L_DEPO_077, MP3_0411, CHANNEL_7, COLOR_05_GREEN) // "No! Perhaps I underestimated his resolve. We have ..." + + wait_until(3186, 0x7a) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(3378, 0x7b) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(3429, 0x7c) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(3481, 0x7d) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(3557, 0x7e) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(3628, 0x7f) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(3813, 0x80) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(3916, 0x81) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(4070, 0x82) + speak(CHR_BOND, L_DEPO_078, MP3_0412, CHANNEL_7, COLOR_04_ORANGE) // "Ha! Assuming you don't get any interference. If Ca..." + + wait_until(4312, 0x84) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(4370, 0x85) + play_sound(SFX_0164, CHANNEL_5) + + wait_until(4440, 0x86) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(4510, 0x87) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(4555, 0x88) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(4560, 0x83) + speak(CHR_BOND, L_DEPO_079, MP3_0413, CHANNEL_5, COLOR_05_GREEN) // "There will be no outside help for Mr. Carrington. ..." + + wait_until(4636, 0x89) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(5017, 0x8a) + play_sound(SFX_0164, CHANNEL_7) + + wait_until(5272, 0x8b) + speak(CHR_BOND, L_DEPO_080, MP3_0414, CHANNEL_5, COLOR_03_RED) // "Then the devices we gave you are working correctly..." + + wait_until(5360, 0x8c) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(5509, 0x8d) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(5897, 0x8e) + play_sound(SFX_0161, CHANNEL_6) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0x54) + label(0x2c) + label(0x2c) + endloop(0x08) + + label(0x54) + label(0x06) + stop_cutscene_track + stop_ambient_track + enter_firstperson + set_stage_flag(STAGEFLAG_MEETING_FINISHED) + mute_channel(CHANNEL_10) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + restart_timer + label(0x06) + set_ailist(CHR_CASS, AILIST_WALK_FROM_MEETING) + + beginloop(0x0e) + if_timer_gt(140, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + set_ailist(CHR_TRENT, AILIST_WALK_FROM_MEETING) + + beginloop(0x0f) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x0f) + + label(0x06) + chr_move_to_pad(0x1e, PAD_DEPO_003C, 0x01, /*goto*/ 0x2c) // invalid chr? + label(0x2c) + set_ailist(CHR_BLONDE, AILIST_WALK_FROM_MEETING) + set_ailist(CHR_STRIPES, AILIST_WALK_FROM_MEETING) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040f_outro_from_menu[] = { + disable_object(OBJ_MINE1) + disable_object(OBJ_MINE2) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func040f_outro[] = { + camera_movement(ANIM_CUT_DEPO_OUTRO_CAM) + play_cutscene_track(MUSIC_G5_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DEPO_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + set_chr_hudpiece_visible(CHR_P1P2, TRUE) + restart_timer + deactivate_alarm + show_nonessential_chrs(FALSE) + set_cutscene_weapon(CHR_P1P2, -1, -1) + yield + set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2_SILENCER) + + wait_until(20, 0x55) + play_sound(SFX_0171, CHANNEL_6) + + wait_until(38, 0x57) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(69, 0x58) + play_sound(SFX_0174, CHANNEL_6) + + wait_until(88, 0x5a) + play_sound(SFX_0172, CHANNEL_6) + + wait_until(103, 0x5b) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(134, 0x5c) + play_sound(SFX_0174, CHANNEL_6) + + wait_until(142, 0x5e) + + wait_until(162, 0x60) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(185, 0x61) + play_sound(SFX_0174, CHANNEL_6) + + wait_until(204, 0x62) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(220, 0x63) + play_sound(SFX_0172, CHANNEL_6) + + wait_until(256, 0x64) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(262, 0x65) + play_sound(SFX_0174, CHANNEL_6) + + enable_rain(2) + wait_until(273, 0x68) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(318, 0x6a) + play_sound(SFX_0174, CHANNEL_6) + + wait_until(344, 0x6b) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(362, 0x6c) + play_sound(SFX_0172, CHANNEL_6) + + wait_until(390, 0x6d) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(404, 0x6e) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(420, 0x70) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(468, 0x71) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(488, 0x72) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(679, 0x74) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(728, 0x56) + + wait_until(768, 0x73) + speak(CHR_P1P2, L_DEPO_081, MP3_0415, CHANNEL_7, COLOR_09_BLUE) // "Agent Dark reporting in! Prepare to receive a down..." + + wait_until(1280, 0x59) + + wait_until(1310, 0x75) + speak(CHR_P1P2, L_DEPO_082, MP3_0416, CHANNEL_7, COLOR_06_WHITE) // "No time for that now, Agent Dark. There's been a d..." + + wait_until(1780, 0x76) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(1841, 0x77) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(1883, 0x78) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(2600, 0x5d) + + wait_until(2630, 0x79) + speak(CHR_P1P2, L_DEPO_083, MP3_0417, CHANNEL_7, COLOR_09_BLUE) // "Area 51? But what about the President?" + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0x54) + label(0x2c) + if_controller_button_pressed(/*goto*/ 0x54) + label(0x2c) + endloop(0x08) + + label(0x54) + label(0x06) + set_chr_hudpiece_visible(CHR_P1P2, FALSE) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_intro_from_menu[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO) + endlist +}; + +u8 func1019_generator_hum[] = { + yield + assign_sound(SFX_8146, CHANNEL_4) + play_sound_from_object(CHANNEL_4, OBJ_GENERATOR, 1, 1600, 2200) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Not entirely sure what this does. It's probably the guards in the laser + * switch area, and it probably controls which ones will run for the alarm. + */ +u8 func101a_init_laser_switch_guards[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) + + // Perfect Agent + set_chr_flag_bankx(0x0c, CHRFLAG0_ACTIVATEALARM, BANK_0) + set_chr_flag_bankx(0x0d, CHRFLAG0_ACTIVATEALARM, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_ACTIVATEALARM, BANK_0) + goto_next(0x06) + + // Agent + label(0x08) + set_chr_flag_bankx(0x0e, CHRFLAG0_ACTIVATEALARM, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_SURPRISABLE, BANK_0) + goto_next(0x06) + + // Special Agent + label(0x09) + set_chr_flag_bankx(0x0e, CHRFLAG0_ACTIVATEALARM, BANK_0) + set_chr_flag_bankx(0x0d, CHRFLAG0_ACTIVATEALARM, BANK_0) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_cloak_guard[] = { + set_morale(0) + set_shotlist(AILIST_CLOAK_GUARD) + set_chr_cloaked(CHR_SELF, TRUE, FALSE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x03) + + // Dead + label(0x06) + goto_next(0x10) + + // Choose target + label(0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + label(0x06) + restart_timer + cmd0139(70, 0x02, TRUE) + + // Wait 3 seconds or until stopped + beginloop(0x55) + if_timer_gt(180, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x55) + + // 50% chance of attacking immediately, 50% at 2 seconds + label(0x06) + stop_chr + call_rng + if_rand_gt(128, /*goto*/ 0x06) + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + + // Attacking + label(0x06) + if_morale_lt(3, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_within_targets_fovx_by_angle(15, /*goto*/ 0x0e) + label(0x06) + if_can_see_attack_target(/*goto*/ 0x2c) + goto_next(0x0d) + label(0x0e) + add_morale(1) + label(0x2c) + restart_timer + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + label(0x0a) + label(0x2c) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2c) + label(0x2c) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x0c) + endloop(0x0b) + + label(0x0c) + set_morale(0) + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + label(0x0d) + goto_first(0x03) + + label(0x10) + if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED, /*goto*/ 0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0413_cloak1_guard[] = { + yield + set_shotlist(AILIST_CLOAK_GUARD) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + label(0x06) + set_reaction_speed(100) + set_shotlist(AILIST_CLOAK_GUARD) + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_distance_to_target_lt(400, /*goto*/ 0x06) + if_target_in_fov(30, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x06) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) + if_timer_gt(180, /*goto*/ 0x06) + label(0x2c) + endloop(0x04) + + label(0x06) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_00040000) + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + set_ailist(CHR_SELF, AILIST_CLOAK_GUARD) + endlist +}; + +u8 func0414_init_cloak2_guard[] = { + stop_chr + set_shotlist(AILIST_CLOAK_GUARD) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_chr_dodge_rating(2, 10) + set_accuracy(5) + set_reaction_speed(25) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_00040000) + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + set_ailist(CHR_SELF, AILIST_CLOAK_GUARD) + endlist +}; + +u8 func101b_cloak2_entry[] = { + // Wait until in glass area of second cloak room + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x001a, /*goto*/ 0x06) +#if VERSION < VERSION_NTSC_1_0 + if_chr_in_room(0x00, /*camspy*/ 0x02, 0x001a, /*goto*/ 0x06) +#endif + endloop(0x08) + + label(0x06) + lock_door(0x34, 0x10) + lock_door(0x35, 0x10) + lock_door(0x36, 0x10) + lock_door(0x37, 0x10) + set_object_flag2(0x34, OBJFLAG2_LOCKEDBACK) + set_object_flag2(0x35, OBJFLAG2_LOCKEDBACK) + set_object_flag2(0x36, OBJFLAG2_LOCKEDFRONT) + set_object_flag2(0x37, OBJFLAG2_LOCKEDBACK) + close_door(0x34) + close_door(0x35) + close_door(0x36) + close_door(0x37) + if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x2c) + play_sound(SFX_8147, -1) + restart_timer + set_lights_state(0x000b, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000c, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000d, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000e, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0010, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000f, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0011, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0012, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0013, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0014, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0015, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0017, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0018, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0001, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0003, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0004, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0005, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0006, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0007, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0008, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0009, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000a, LIGHTOP_3, 0xff, 0x06, 0x78) + + // Wait 2 seconds + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_lights_state(0x000b, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000c, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000d, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000e, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0010, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000f, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0011, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0012, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0013, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0014, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0015, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0017, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0018, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0001, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0003, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0004, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0005, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0006, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0007, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0008, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0009, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000a, LIGHTOP_1, 0x0a, 0x00, 0x00) + goto_next(0x07) + + label(0x2c) + play_sound(SFX_8148, -1) + set_lights_state(0x000b, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000c, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000d, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000e, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0010, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000f, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0011, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0012, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0013, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0014, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0015, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0017, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0018, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0001, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0003, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0004, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0005, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0006, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0007, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0008, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0009, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000a, LIGHTOP_3, 0x06, 0xff, 0x78) + + // Wait 2 seconds + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_lights_state(0x000b, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000c, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000d, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000e, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0010, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000f, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0011, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0012, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0013, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0014, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0015, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0017, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0018, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0001, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0003, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0004, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0005, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0006, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0007, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0008, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0009, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000a, LIGHTOP_1, 0xff, 0x00, 0x00) + + label(0x07) + unset_chr_chrflag(CHR_CLOAK_2A, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_CLOAK_2B, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_CLOAK_2C, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_CLOAK_2D, CHRCFLAG_HIDDEN) + set_ailist(CHR_CLOAK_2A, AILIST_CLOAK2_GUARD) + set_ailist(CHR_CLOAK_2B, AILIST_CLOAK2_GUARD) + set_ailist(CHR_CLOAK_2C, AILIST_CLOAK2_GUARD) + set_ailist(CHR_CLOAK_2D, AILIST_CLOAK2_GUARD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0405_cloak2_hide[] = { + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_check_visited_top_door[] = { + // Wait until decoder attached + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_DECODER_ATTACHED, TRUE, /*goto*/ 0x08) + endloop(0x04) + + // Wait until player gone near top fire escape door + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 400, PAD_DEPO_0058, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_stage_flag(STAGEFLAG_VISITED_TOP_DOOR) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_init_mines[] = { + yield + set_object_flag2(OBJ_MINE1, OBJFLAG2_00020000) + set_object_flag2(OBJ_MINE2, OBJFLAG2_00020000) + set_object_flag2(OBJ_MINE1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_MINE2, OBJFLAG2_INVISIBLE) + unset_object_flag(OBJ_MINE1, OBJFLAG_00000100) + unset_object_flag(OBJ_MINE2, OBJFLAG_00000100) + set_chr_team(CHR_ANTI, TEAM_ENEMY) + + label(0x06) + if_savefile_flag_is_unset(GAMEFILEFLAG_G5_MINE, /*goto*/ 0x06) + + disable_object(OBJ_MINE1) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + disable_object(OBJ_MINE2) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_guard(accuracy, reaction, function) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(accuracy) \ + set_reaction_speed(reaction) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + set_ailist(CHR_SELF, function) + +u8 func0406_init_type1_guard[] = { + init_guard(5, 30, GAILIST_UNALERTED) + endlist +}; + +// Never assigned +u8 func0407_init_type2_guard[] = { + init_guard(15, 25, GAILIST_UNALERTED) + endlist +}; + +u8 func0408_init_cloak1_guard[] = { + init_guard(5, 25, 0x0413) + endlist +}; + +u8 func101e_msg_nowaythrough[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, FALSE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, FALSE, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_chr_in_room(CHR_P1P2, 0x00, 0x002f, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + speak(CHR_P1P2, L_DEPO_060, MP3_03B4, CHANNEL_6, COLOR_09_BLUE) // "There's no way through while those lasers are acti..." + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_msg_meetingroomahead[] = { + restart_timer + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MEETING_HOLOGRAPHED, TRUE, /*goto*/ 0x0d) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_chr_y(CHR_P1P2, 300, OPERATOR_LESS_THAN, /*goto*/ 0x06) + goto_next(0x2c) + label(0x06) + endloop(0x04) + + label(0x2c) + speak(CHR_P1P2, L_DEPO_061, MP3_03B5, CHANNEL_6, COLOR_09_BLUE) // "That must be the meeting room up ahead. Time to us..." + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_msg_heavilyencrypted[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0050, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + speak(CHR_P1P2, L_DEPO_062, SFX_817C, CHANNEL_6, COLOR_09_BLUE) // "The safe's heavily encrypted. The decoder's gonna ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1021_blow_mines[] = { + // Wait for backup collected + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_BACKUP_COLLECTED, TRUE, /*goto*/ 0x2c) + endloop(0x04) + + // Wait 2 seconds + label(0x2c) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) + speak(CHR_P1P2, L_DEPO_063, MP3_03B7, CHANNEL_6, COLOR_09_BLUE) // "Time to leave! Let's get to the door I set up earl..." + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Agent + label(0x2c) + if_object_in_good_condition(OBJ_ESCAPEDOOR1, /*goto*/ 0x2c) + goto_next(0x0d) + + label(0x2c) + if_object_in_good_condition(OBJ_ESCAPEDOOR2, /*goto*/ 0x2c) + goto_next(0x0d) + + label(0x2c) + speak(CHR_P1P2, L_DEPO_065, SFX_81A2, CHANNEL_6, COLOR_09_BLUE) // "Stand back, Joanna. We'll create your escape route..." + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x09) + + label(0x2c) + destroy_object(OBJ_MINE1) + destroy_object(OBJ_MINE2) + restart_timer + + beginloop(0x0a) + if_timer_gt(240, /*goto*/ 0x2c) + endloop(0x0a) + + label(0x2c) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_light_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LIGHTSWITCH, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x2c) + + // Turning lights off + set_stage_flag(STAGEFLAG_LIGHTS_OFF) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LIGHTSWITCH, 0x012c, 0x0190, 0x00) + yield + set_object_image(OBJ_LIGHTSWITCH, 0, TVCMDLIST_14) + play_sound(SFX_8147, -1) + set_lights_state(0x000b, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000c, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000d, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000e, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0010, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000f, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0011, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0012, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0013, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0014, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0015, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0017, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0018, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0001, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0003, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0004, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0005, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0006, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0007, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0008, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x0009, LIGHTOP_3, 0xff, 0x06, 0x78) + set_lights_state(0x000a, LIGHTOP_3, 0xff, 0x06, 0x78) + + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_lights_state(0x000b, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000c, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000d, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000e, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0010, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000f, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0011, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0012, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0013, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0014, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0015, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0017, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0018, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0001, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0003, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0004, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0005, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0006, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0007, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0008, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x0009, LIGHTOP_1, 0x0a, 0x00, 0x00) + set_lights_state(0x000a, LIGHTOP_1, 0x0a, 0x00, 0x00) + goto_first(0x04) + + // Turning lights on + label(0x2c) + unset_stage_flag(STAGEFLAG_LIGHTS_OFF) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LIGHTSWITCH, 0x012c, 0x0190, 0x00) + yield + play_sound(SFX_8148, -1) + set_object_image(0x3d, 0, TVCMDLIST_06) + set_lights_state(0x000b, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000c, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000d, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000e, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0010, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000f, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0011, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0012, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0013, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0014, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0015, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0017, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0018, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0001, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0003, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0004, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0005, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0006, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0007, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0008, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0009, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x000a, LIGHTOP_3, 0x06, 0xff, 0x78) + + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_lights_state(0x000b, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000c, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000d, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000e, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0010, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000f, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0011, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0012, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0013, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0014, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0015, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0017, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0018, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0001, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0003, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0004, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0005, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0006, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0007, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0008, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0009, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x000a, LIGHTOP_1, 0xff, 0x00, 0x00) + endloop(0x04) + + endlist +}; + +u8 func1023_hide_nbomb_crate[] = { + if_savefile_flag_is_unset(GAMEFILEFLAG_G5_MINE, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + disable_object(OBJ_NBOMB_CRATE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Opens the laser doors in response to the stageflags changing. + */ +u8 unregistered_function[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, FALSE, /*goto*/ 0x2c) + if_door_state(OBJ_LASER_1A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) + open_door(OBJ_LASER_1A) + open_door(OBJ_LASER_1B) + open_door(OBJ_LASER_1C) + open_door(OBJ_LASER_1D) + label(0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, FALSE, /*goto*/ 0x2c) + if_door_state(OBJ_LASER_2A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) + open_door(OBJ_LASER_2A) + open_door(OBJ_LASER_2B) + open_door(OBJ_LASER_2C) + open_door(OBJ_LASER_2D) + label(0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, FALSE, /*goto*/ 0x2c) + if_door_state(OBJ_LASER_3A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) + open_door(OBJ_LASER_3A) + open_door(OBJ_LASER_3B) + open_door(OBJ_LASER_3C) + open_door(OBJ_LASER_3D) + label(0x2c) + if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, FALSE, /*goto*/ 0x2c) + if_door_state(OBJ_LASER_4A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) + open_door(OBJ_LASER_4A) + open_door(OBJ_LASER_4B) + open_door(OBJ_LASER_4C) + open_door(OBJ_LASER_4D) + label(0x2c) + endloop(0x04) + + endlist +}; + +/** + * I'm guessing co op buddies etc would get stuck in locked rooms after the + * player has passed through them. So this just unlocks the doors once they've + * been opened for the first time. + */ +u8 func1026_unlock_doors[] = { + // If Velvet and counter op don't exist, return + yield + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) + goto_next(0x04) + label(0x2c) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x0a) + + // Wait until some door is not closed (so... opening, I guess?) + beginloop(0x04) + if_door_state(0x43, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x44, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x45, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x46, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + endloop(0x04) + + // Unlock those doors + label(0x2c) + unlock_door(0x43, 0x04) + unlock_door(0x44, 0x04) + unlock_door(0x45, 0x04) + unlock_door(0x46, 0x04) + + // New set of doors - wait until not closed + beginloop(0x08) + if_door_state(0x34, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x35, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x36, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x37, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + endloop(0x08) + + // Unlock them + label(0x2c) + unlock_door(0x34, 0x04) + unlock_door(0x35, 0x04) + unlock_door(0x36, 0x04) + unlock_door(0x37, 0x04) + + // Third set of doors + beginloop(0x09) + if_door_state(0x3f, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + if_door_state(0x40, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) + endloop(0x09) + + label(0x2c) + unlock_door(0x3f, 0x10) + unlock_door(0x40, 0x10) + + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0410_invincible[] = { + label(0x04) + yield + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0411_hide[] = { + label(0x04) + yield + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1027_cloak1_check_one_remaining[] = { + // Wait until either cloak guard dying (in first room) + beginloop(0x04) + if_chr_deadish(CHR_CLOAK_1A, /*goto*/ 0x2c) + if_chr_deadish(CHR_CLOAK_1B, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + set_stage_flag(STAGEFLAG_CLOAK1_ONE_REMAINING) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1028_cloak2_check_one_remaining[] = { + // Count number of dead cloak guards in second room + beginloop(0x04) + set_morale(0) + if_chr_deadish(CHR_CLOAK_2A, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + add_morale(1) + label(0x06) + if_chr_deadish(CHR_CLOAK_2B, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + add_morale(1) + label(0x06) + if_chr_deadish(CHR_CLOAK_2C, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + add_morale(1) + label(0x06) + if_chr_deadish(CHR_CLOAK_2D, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + add_morale(1) + label(0x06) + if_morale_lt(3, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_CLOAK2_ONE_REMAINING) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + endloop(0x04) + + endlist +}; + +u8 func1029_set_secret_weapon_props[] = { + yield + set_object_flag3(OBJ_NBOMB_CRATE, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_CROSSBOW, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102a_8174[] = { + // Wait until some door opening + beginloop(0x08) + if_door_state(0x3f, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + set_chr_hiddenflag(0x07, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x0c, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x0d, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x0e, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x0f, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x10, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x11, CHRHFLAG_DONTSHOOTME) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102b_81bc[] = { + // Wait until some door opening + beginloop(0x08) + if_door_state(0x3f, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + set_chr_team(0x08, TEAM_ENEMY) + set_chr_team(0x09, TEAM_ENEMY) + set_chr_team(0x0a, TEAM_ENEMY) + set_chr_team(0x0b, TEAM_ENEMY) + set_chr_team(0x07, TEAM_ENEMY) + set_chr_team(0x0c, TEAM_ENEMY) + set_chr_team(0x0d, TEAM_ENEMY) + set_chr_team(0x0e, TEAM_ENEMY) + set_chr_team(0x0f, TEAM_ENEMY) + set_chr_team(0x10, TEAM_ENEMY) + set_chr_team(0x11, TEAM_ENEMY) + set_chr_team(0x12, TEAM_ENEMY) + set_chr_team(0x13, TEAM_ENEMY) + set_chr_team(0x14, TEAM_ENEMY) + set_chr_team(0x15, TEAM_ENEMY) + set_chr_team(0x16, TEAM_ENEMY) + set_chr_team(0x17, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102c_set_lightswitch_guard_team[] = { + set_chr_team(CHR_LIGHTSWITCH_GUARD, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_init_swat1, 0x0401 }, + { func0402_init_swat2, 0x0402 }, + { func0403_walk_from_meeting, 0x0403 }, + { func0404_run_from_meeting, 0x0404 }, + { func0405_cloak2_hide, 0x0405 }, + { func0406_init_type1_guard, 0x0406 }, + { func0407_init_type2_guard, 0x0407 }, + { func0408_init_cloak1_guard, 0x0408 }, + { func0409_start_path00, 0x0409 }, + { func040a_start_path01, 0x040a }, + { func040b_start_path02, 0x040b }, + { func040c_start_path03, 0x040c }, + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_set_ai, 0x1002 }, + { func1003_laser_switch_1, 0x1003 }, + { func1004_laser_switch_2, 0x1004 }, + { func1005_laser_switch_3, 0x1005 }, + { func1006_laser_switch_4, 0x1006 }, + { func1007_init_lasers, 0x1007 }, + { func1008_check_generator, 0x1008 }, + { func1009_spawner_during_decode, 0x1009 }, + { func100a_give_keycards, 0x100a }, + { func100b_check_backup_collected, 0x100b }, + { func100c_check_for_meeting_trigger, 0x100c }, + { func100e_check_conspirators_alerted, 0x100e }, + { func100f_alarm_switches, 0x100f }, + { func1010_safe_cracking, 0x1010 }, + { func1012_check_for_end, 0x1012 }, + { func1013_check_escape_doors, 0x1013 }, + { func1014_check_camspy_location, 0x1014 }, + { func1017_check_lasers_closed, 0x1017 }, + { func1018_intro_from_menu, 0x1018 }, + { func1019_generator_hum, 0x1019 }, + { func101a_init_laser_switch_guards, 0x101a }, + { func101b_cloak2_entry, 0x101b }, + { func101c_check_visited_top_door, 0x101c }, + { func101d_init_mines, 0x101d }, + { func101e_msg_nowaythrough, 0x101e }, + { func101f_msg_meetingroomahead, 0x101f }, + { func1020_msg_heavilyencrypted, 0x1020 }, + { func1021_blow_mines, 0x1021 }, + { func1022_light_switch, 0x1022 }, + { func1023_hide_nbomb_crate, 0x1023 }, + { func1026_unlock_doors, 0x1026 }, + { func1027_cloak1_check_one_remaining, 0x1027 }, + { func1028_cloak2_check_one_remaining, 0x1028 }, + { func1029_set_secret_weapon_props, 0x1029 }, + { func102a_8174, 0x102a }, + { func102b_81bc, 0x102b }, + { func102c_set_lightswitch_guard_team, 0x102c }, + { func040d_intro, 0x040d }, + { func040e_meeting_cutscene, 0x040e }, + { func040f_outro, 0x040f }, + { func0410_invincible, 0x0410 }, + { func0411_hide, 0x0411 }, + { func0412_cloak_guard, 0x0412 }, + { func0413_cloak1_guard, 0x0413 }, + { func0414_init_cloak2_guard, 0x0414 }, + { func1018_intro_from_menu, 0x0c00 }, + { func040e_meeting_cutscene, 0x0c01 }, + { func040f_outro_from_menu, 0x0c02 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, PATHFLAG_CIRCULAR }, + { path01, 1, PATHFLAG_CIRCULAR }, + { path02, 2, PATHFLAG_CIRCULAR }, + { path03, 3, PATHFLAG_CIRCULAR }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupdest.c b/src/ailists/setupdest.c new file mode 100644 index 000000000..8d98f48a9 --- /dev/null +++ b/src/ailists/setupdest.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x1a +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupdish.c b/src/ailists/setupdish.c new file mode 100644 index 000000000..77a598499 --- /dev/null +++ b/src/ailists/setupdish.c @@ -0,0 +1,6048 @@ +// +// CI Training +// + +#include "stagesetup.h" + +// Characters +#define CHR_CARRINGTON 0x00 + +// Objects +#define OBJ_CAMSPY 0x26 +#define OBJ_LIGHTSWITCH 0x34 +#define OBJ_HOVERCRATE 0x93 + +// Stage flags +#define STAGEFLAG_IN_TRAINING 0x00000001 +#define STAGEFLAG_HOLO_FAILED 0x00000002 +#define STAGEFLAG_DEVICE_ABORTING 0x00000004 +#define STAGEFLAG_TRIGGER_DEVICE_SUCCESS 0x00000008 +#define STAGEFLAG_TRIGGER_DEVICE_FAILURE 0x00000010 +#define STAGEFLAG_HOLO_ABORTING 0x00000020 +#define STAGEFLAG_TRIGGER_HOLO_SUCCESS 0x00000040 +#define STAGEFLAG_TRIGGER_HOLO_FAILURE 0x00000080 +#define STAGEFLAG_TRIGGER_UPLINK 0x00000100 +#define STAGEFLAG_TRIGGER_ECMMINE 0x00000200 +#define STAGEFLAG_TRIGGER_CAMSPY 0x00000400 +#define STAGEFLAG_TRIGGER_NIGHTVISION 0x00000800 +#define STAGEFLAG_TRIGGER_DOORDECODER 0x00001000 +#define STAGEFLAG_TRIGGER_RTRACKER 0x00002000 +#define STAGEFLAG_TRIGGER_IR 0x00004000 +#define STAGEFLAG_TRIGGER_XRAY 0x00008000 +#define STAGEFLAG_TRIGGER_DISGUISE 0x00010000 +#define STAGEFLAG_TRIGGER_CLOAK 0x00020000 +#define STAGEFLAG_IN_HOLO1 0x00040000 +#define STAGEFLAG_IN_HOLO2 0x00080000 +#define STAGEFLAG_IN_HOLO3 0x00100000 +#define STAGEFLAG_IN_HOLO4 0x00200000 +#define STAGEFLAG_IN_HOLO5 0x00400000 +#define STAGEFLAG_IN_HOLO6 0x00800000 +#define STAGEFLAG_IN_HOLO7 0x01000000 +#define STAGEFLAG_GENERAL_PURPOSE 0x02000000 +#define STAGEFLAG_TRIGGER_CANNOTEXIT_MSG 0x04000000 +#define STAGEFLAG_CONSIDER_WARP 0x08000000 +#define STAGEFLAG_CLOAK_COMPLETE 0x10000000 +#define STAGEFLAG_CLOAK_FAILED 0x20000000 +#define STAGEFLAG_DISGUISE_FAILED 0x40000000 +#define STAGEFLAG_DISGUISE_COMPLETE 0x80000000 + +// AI Lists +#define AILIST_MOVE_TO_DEVICEROOM 0x0401 +#define AILIST_MOVE_TO_HOLOROOM 0x0402 +#define AILIST_HOLO4_GUARD1 0x0403 +#define AILIST_HOLO4_GUARD2 0x0404 +#define AILIST_HOLO4_GUARD3 0x0405 +#define AILIST_HOLO5_INIT_GUARD1 0x0406 +#define AILIST_HOLO5_GUARD1 0x0407 +#define AILIST_HOLO5_INIT_GUARD2 0x0408 +#define AILIST_HOLO5_GUARD2 0x0409 +#define AILIST_HOLO5_INIT_GUARD3 0x040a +#define AILIST_HOLO5_GUARD3 0x040b +#define AILIST_HOLO6_INIT_GUARD1 0x040c +#define AILIST_HOLO6_INIT_GUARD2 0x040d +#define AILIST_HOLO6_INIT_GUARD3 0x040e +#define AILIST_HOLO6_INIT_GUARD4 0x040f +#define AILIST_HOLO7_INIT_GUARD4 0x0410 +#define AILIST_HOLO7_INIT_GUARD5 0x0411 +#define AILIST_HOLO7_INIT_GUARD1 0x0412 +#define AILIST_HOLO7_INIT_GUARD2 0x0413 +#define AILIST_HOLO7_INIT_GUARD3 0x0414 +#define AILIST_HOLO_GUARD_UNARMED_UNALERT 0x0415 +#define AILIST_HOLO_GUARD_UNARMED_ALERT 0x0416 +#define AILIST_HOLO_GUARD_UNARMED_ALERT2 0x0417 +#define AILIST_HOLO_GUARD_ARMED_UNALERT 0x0418 +#define AILIST_HOLO_GUARD_ARMED_ALERT 0x0419 +#define AILIST_HOLO3_CHECK_DONE 0x041c +#define AILIST_INIT_COLLEAGUE_WHEN_SIGHTED 0x041d +#define AILIST_COLLEAGUE 0x041e +#define AILIST_GRIMSHAW_DISGUISE 0x0429 +#define AILIST_CARRINGTON_CLOAK 0x042a +#define AILIST_INIT_CARRINGTON 0x042b +#define AILIST_CARRINGTON_TOUR 0x042c +#define AILIST_DEVICEGIRL_REPLY_TO_CARRINGTON 0x042e +#define AILIST_HOLO1_CHECK_DONE 0x0430 +#define AILIST_HOLO3_OBJECT1 0x0435 +#define AILIST_HOLO3_OBJECT2 0x0436 +#define AILIST_HOLO1_SWITCH1 0x0437 +#define AILIST_HOLO1_SWITCH2 0x0438 +#define AILIST_HOLO1_SWITCH3 0x0439 +#define AILIST_HOLO1_MONITOR_SWITCHES 0x043a + +// Pads +#define PAD_OUTSIDE_JO_OFFICE 0x0053 +#define PAD_CARRINGTON_OFFICE 0x00f6 +#define PAD_DEVICEROOM 0x0121 +#define PAD_HOLOROOM 0x0273 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + door(0x0100, MODEL_INSTFRONTDOOR, PAD_DISH_018D, OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_INSTFRONTDOOR, PAD_DISH_018E, OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_INSTFRONTDOOR, PAD_DISH_018F, OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_INSTFRONTDOOR, PAD_DISH_0190, OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_0156, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_0157, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x75, 2) + tag(0x76, 2) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_0158, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_0159, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x8a, 1) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_015B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_015C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x31, 1) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_015A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x89, 1) + door(0x0100, MODEL_CIDOOR1_REF, PAD_DISH_015D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x91, 2) + tag(0x92, 1) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_018C, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0212, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0213, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0214, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0215, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0216, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0217, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0218, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_DISH_0219, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_AIRBASE_SAFEDOOR, PAD_DISH_025B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000002 | OBJFLAG2_00200000, 0, 4000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_019F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_019E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_019D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_019C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01A0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01A1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01A2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01A3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01A8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01A9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01AA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01AB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01AC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01AD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01AE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01AF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01B7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01B8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01B9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01BA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01BB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01BC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01BD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01BE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01BF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01C3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01C4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01C5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01C6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01C7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_DISH_01D1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x80, 6) + tag(0x81, 6) + tag(0x82, 6) + tag(0x83, 6) + tag(0x43, 1) + lift(0x0100, MODEL_CI_LIFT, PAD_DISH_0193, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0193, 0x0194, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_015E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_015F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_0160, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_0161, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + tag(0x84, 6) + tag(0x85, 6) + tag(0x86, 6) + tag(0x87, 6) + tag(0x44, 1) + lift(0x0100, MODEL_CI_LIFT, PAD_DISH_0195, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0195, 0x0196, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_0164, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_0165, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_0162, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_DISH_0163, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + tag(0x00, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_DISH_021B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_DISH_021A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x1b, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_021C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x01, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_DISH_021F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_DISH_021D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x10, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_021E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x02, 1) + stdobject(0x00b3, MODEL_DD_CHAIR, PAD_DISH_0220, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_DISH_0222, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x0f, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_0221, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x33, -1) + tag(0x0d, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_DISH_0223, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_DISH_0225, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x0e, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_0224, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x7f, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_022D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + require_object_holographed(0x0000000e) + tag(0x05, 18) + tag(0x06, 18) + tag(0x07, 18) + tag(0x08, 18) + tag(0x09, 18) + tag(0x0a, 18) + tag(0x0b, 18) + tag(0x0c, 18) + tag(0x11, 18) + tag(0x12, 18) + tag(0x13, 18) + tag(0x14, 18) + tag(0x15, 18) + tag(0x16, 18) + tag(0x17, 18) + tag(0x18, 18) + tag(0x19, 18) + tag(0x1a, 18) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_TARGET, PAD_DISH_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + chr(SPAWNFLAG_NOBLOOD, 0x00, PAD_CARRINGTON_OFFICE, BODY_CARRINGTON, HEAD_CARRINGTON, AILIST_INIT_CARRINGTON, -1, -1, 1000, 4, 0, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_NOBLOOD, 0x01, PAD_DISH_00F8, BODY_CIFEMTECH, HEAD_SECRETARY, 0x0420, -1, -1, 1000, 4, 0, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_NOBLOOD, 0x02, PAD_DISH_00FA, BODY_CILABTECH, HEAD_CHRIST, 0x0424, -1, -1, 1000, 4, 0, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_NOBLOOD, 0x03, PAD_DISH_00F7, BODY_CILABTECH, HEAD_MARK2, 0x0421, -1, -1, 1000, 6, 0, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_NOBLOOD, 0x04, PAD_DISH_00F9, BODY_CIFEMTECH, HEAD_SECRETARY, 0x0422, -1, -1, 1000, 6, 0, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_NOBLOOD, 0x05, PAD_DISH_00FB, BODY_CILABTECH, HEAD_BRIAN, 0x0423, -1, -1, 1000, 6, 0, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_NOBLOOD | SPAWNFLAG_FIXEDHEIGHT, 0x06, PAD_DISH_00FD, BODY_CILABTECH, HEAD_RUSS, 0x0425, -1, -1, 0, 0, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0D, 0x01, 0, 0, 2, 0, 0) + chr(SPAWNFLAG_NOBLOOD | SPAWNFLAG_FIXEDHEIGHT, 0x07, PAD_DISH_00FC, BODY_CILABTECH, HEAD_BEAU1, 0x0426, -1, -1, 0, 0, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0D, 0x00, 0, 0, 2, 0, 0) + chr(SPAWNFLAG_NOBLOOD | SPAWNFLAG_FIXEDHEIGHT, 0x08, PAD_DISH_00FE, BODY_CIFEMTECH, HEAD_SECRETARY, 0x0427, -1, -1, 0, 0, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0D, 0x02, 0, 0, 2, 0, 0) + tag(0x1e, 8) + tag(0x1f, 8) + tag(0x20, 8) + tag(0x21, 8) + tag(0x22, 8) + tag(0x23, 8) + tag(0x24, 8) + tag(0x25, 8) + weapon(0x0100, MODEL_CHRWPPK, PAD_DISH_0115, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRTT33, PAD_DISH_0116, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRSKORPION, PAD_DISH_0117, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRKALASH, PAD_DISH_0118, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRUZI, PAD_DISH_0119, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRMP5K, PAD_DISH_011A, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRM16, PAD_DISH_011B, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + weapon(0x0100, MODEL_CHRFNP90, PAD_DISH_011C, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + tag(0x7a, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01C8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x79, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01C9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x78, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01CA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x7e, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01CB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x7b, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01CC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x7c, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01CD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x7d, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01CE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x77, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01CF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_DISH_01D0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_DISH_0229, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x2f, 1) + weapon(0x0100, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_DATAUPLINK) + stdobject(0x0100, MODEL_DD_DESK, PAD_DISH_0228, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_DISH_0226, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x30, 1) + singlemonitor(0x0180, MODEL_GOODPC, PAD_DISH_0227, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x2e, 1) + weapon(0x0180, MODEL_CHRECMMINE, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_ECMMINE) + tag(0x32, 1) + multimonitor(0x0140, MODEL_CIHUB, PAD_DISH_0239, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x26, 1) + weapon(0x0100, MODEL_CHREYESPY, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_EYESPY) + tag(0x27, 1) + weapon(0x0180, MODEL_CHRNIGHTSIGHT, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_NIGHTVISION) + tag(0x34, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH, PAD_DISH_023A, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_INVISIBLE, OBJFLAG3_INTERACTABLE, 1000) + tag(0x28, 1) + weapon(0x0200, MODEL_CHRDOORDECODER, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_DOORDECODER) + tag(0x35, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_023B, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x88, 1) + stdobject(0x0200, MODEL_CHRDOORDECODER, PAD_DISH_0130, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x2c, 1) + weapon(0x0180, MODEL_RUSSDAR, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_RTRACKER) + tag(0x36, 1) + weapon(0x0180, MODEL_MISC_IRSPECS, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_IRSCANNER) + tag(0x29, 1) + weapon(0x0180, MODEL_XRAYSPECS, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_XRAYSCANNER) + tag(0x38, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_DISH_023C, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x39, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_DISH_023D, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x2a, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_DISGUISE41) + tag(0x2b, 1) + weapon(0x0180, MODEL_MISC_IRSPECS, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_IRSCANNER) + tag(0x2d, 1) + weapon(0x0180, MODEL_CHRCLOAKER, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CLOAKINGDEVICE) + tag(0x3c, 1) + weapon(0x0180, MODEL_CHRCLOAKER, 0x0003, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CLOAKINGDEVICE) + tag(0x3d, 1) + door(0x0100, MODEL_DD_GRATE, PAD_DISH_0185, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + tag(0x3e, 1) + door(0x0100, MODEL_DEVICESECRETDOOR, PAD_DISH_0186, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + tag(0x3f, 1) + door(0x0100, MODEL_DD_GRATE, PAD_DISH_0187, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + tag(0x40, 1) + door(0x0100, MODEL_CARRINGTONSECRETDOOR, PAD_DISH_0188, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + tag(0x3a, 1) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0189, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + tag(0x3b, 1) + door(0x0100, MODEL_LASDOOR, PAD_DISH_018A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + camera(0x00c0, MODEL_CCTV_PD, PAD_DISH_027B, OBJFLAG_00000002 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 400, 0x011f, 0x00000000, 0x00000000, 0x00000000) + tag(0x41, 1) + door(0x0100, MODEL_DD_GRATE, PAD_DISH_018B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000a00) + tag(0x37, 1) + door(0x0100, MODEL_SECRETINDOOR, PAD_DISH_0192, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INFRARED, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + tag(0x93, 1) + hover_prop(0x00eb, MODEL_HOVERCRATE1, PAD_DISH_0141, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE, 1000, 0x02010000) + hoverbike(0x0100, MODEL_HOVBIKE, PAD_DISH_01F9, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_GEOCYL, 1000) + tag(0x42, 1) + stdobject(0x0100, MODEL_DROPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + door(0x0100, MODEL_CH_SHUTTER1, PAD_DISH_0166, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000fd70, 0x0000e666, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000400) + door(0x0100, MODEL_CH_SHUTTER1, PAD_DISH_0167, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000fd70, 0x0000e666, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000400) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0168, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0169, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0170, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0171, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0172, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0173, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0174, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0175, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0176, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0177, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0178, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0179, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0180, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0168, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0169, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_016F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0170, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0171, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0172, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0173, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0174, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0175, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0176, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0177, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0178, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0179, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_017F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0180, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) +#endif + door(0x0100, MODEL_CH_SHUTTER1, PAD_DISH_0181, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000400) + door(0x0100, MODEL_CH_SHUTTER1, PAD_DISH_0182, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000400) + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0183, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0184, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_DOOR2_G5, PAD_DISH_0184, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, 0x00000300) +#endif + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01D6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01E1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01E2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01E5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01E6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01E8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01E9, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01EA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01EB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01EC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01ED, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01EE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01EF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01F7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01FA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01FB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01FC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01FD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01FE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0200, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0201, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0202, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0204, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x46, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_022A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x45, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_023E, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x47, 1) + singlemonitor(0x0100, MODEL_GOODPC, PAD_DISH_022B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x48, 1) + multimonitor(0x00cc, MODEL_CIHUB, PAD_DISH_0240, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x49, 1) + multimonitor(0x00cc, MODEL_CIHUB, PAD_DISH_0241, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x4a, 1) + multimonitor(0x00cc, MODEL_CIHUB, PAD_DISH_0242, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x4b, 1) + multimonitor(0x00cc, MODEL_CIHUB, PAD_DISH_0243, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x4c, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_0247, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x4d, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_0246, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x4e, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_0245, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x4f, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_0244, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x54, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_024C, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x55, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_024D, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x56, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_024E, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x57, 1) + multimonitor(0x0100, MODEL_CIHUB, PAD_DISH_024F, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE, 1000, 20, 0, 0, 0) + tag(0x58, 15) + tag(0x59, 15) + tag(0x5a, 15) + tag(0x5b, 15) + tag(0x5c, 15) + tag(0x5d, 15) + tag(0x5e, 15) + tag(0x5f, 15) + tag(0x60, 15) + tag(0x61, 15) + tag(0x62, 15) + tag(0x63, 15) + tag(0x64, 15) + tag(0x73, 15) + tag(0x74, 15) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0205, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0206, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0207, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0208, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0209, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_020A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_020B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_020C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_020D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_020E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01D2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_01D3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_020F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0210, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_DISH_0211, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00020000, 0, 1000) + tag(0x67, 12) + tag(0x68, 12) + tag(0x69, 12) + tag(0x6a, 12) + tag(0x6b, 12) + tag(0x6c, 12) + tag(0x6d, 12) + tag(0x6e, 12) + tag(0x6f, 12) + tag(0x70, 12) + tag(0x71, 12) + tag(0x72, 12) + door(0x0100, MODEL_LASDOOR, PAD_DISH_027C, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_027D, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_027E, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_027F, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0280, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0281, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0282, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0283, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0284, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0285, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0286, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_DISH_0287, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00020000, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT, DOORTYPE_LASER, 0x00000000, 0x00004650, 0x00000000, 0x00000000, 0x00000000) + tag(0x65, 1) + multimonitor(0x00cc, MODEL_CIHUB, PAD_DISH_0250, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20, 0, 0, 0) + tag(0x66, 1) + multimonitor(0x00cc, MODEL_CIHUB, PAD_DISH_0251, OBJFLAG_00000002, OBJFLAG2_00020000, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 20, 0, 0, 0) + tag(0x8b, 1) + autogun(0x00a6, MODEL_CI_ROOFGUN, PAD_DISH_0235, OBJFLAG_00000004, 0, 0, 1000, 0x0075, 0x00005555, 0xffffaaab, 0x00000aaa, 0x00320000) + tag(0x8c, 1) + autogun(0x00a6, MODEL_CI_ROOFGUN, PAD_DISH_0234, OBJFLAG_00000004, 0, 0, 1000, 0x007f, 0x00005555, 0xffffaaab, 0x00000aaa, 0x00320000) + tag(0x8d, 1) + autogun(0x00a6, MODEL_CI_ROOFGUN, PAD_DISH_0233, OBJFLAG_00000004, 0, 0, 1000, 0x0097, 0x00005555, 0xffffaaab, 0x00000aaa, 0x00320000) + tag(0x8e, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_DISH_0236, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x8f, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_DISH_0237, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x90, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_DISH_0238, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + endprops +}; + +/** + * Wait until seeing player (without cloak) then assign colleague. + */ +u8 func041d_init_collegue_when_sighted[] = { + restart_timer + + beginloop(0x04) + if_can_see_target(/*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + + label(0x2f) + goto_first(0x04) + + endlist +}; + +u8 func041e_colleague[] = { + set_returnlist(CHR_SELF, AILIST_COLLEAGUE) + if_alertness(1, OPERATOR_LESS_THAN, /*goto*/ 0x04) + if_alertness(2, OPERATOR_LESS_THAN, /*goto*/ 0x7c) + if_alertness(3, OPERATOR_LESS_THAN, /*goto*/ 0x7d) + + beginloop(0x04) + // Wait until player in sight and not doing idle animations already + if_target_in_sight(/*goto*/ 0x2f) + if_chr_idle(/*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f) + chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + reloop(0x04) + + // Player not in sight - 2 in 255 chance of doing a bored animation + label(0x7f) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) + label(0x06) + reloop(0x04) + + // Player is in sight - prepare to talk + label(0x2f) + restart_timer + label(0x08) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x06) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) + do_preset_animation(PRESETANIM_TALK3) + goto_next(0x2f) + + label(0x7f) + chr_do_animation(ANIM_SITTING_0265, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + label(0x2f) + play_cistaff_quip(CIQUIP_GREETING, CHANNEL_6) + restart_timer + + beginloop(0x57) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + if_morale_lt(6, /*goto*/ 0x06) + goto_next(0x7e) + + label(0x06) + restart_timer + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x59) + + beginloop(0x59) + if_target_in_sight(/*goto*/ 0x06) + endloop(0x59) + + label(0x06) + if_timer_gt(120, /*goto*/ 0x06) + goto_first(0x59) + + label(0x06) + if_within_targets_fovx_by_angle(20, /*goto*/ 0x06) + goto_first(0x59) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + label(0x06) + play_cistaff_quip(CIQUIP_MAIN, CHANNEL_6) + restart_timer + + beginloop(0x5b) + if_sound_finished(CHANNEL_6, /*goto*/ 0x7e) + endloop(0x5b) + + label(0x7e) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) + stop_chr + label(0x7f) + set_alertness(1) + label(0x7c) + restart_timer + + beginloop(0x0a) + if_timer_lt(600, /*goto*/ 0x2f) + if_target_in_sight(/*goto*/ 0x06) + goto_next(0x2f) + + label(0x06) + if_within_targets_fovx_by_angle(20, /*goto*/ 0x30) + label(0x2f) + if_chr_idle(/*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f) + set_ailist(CHR_SELF, GAILIST_DO_SITTING_ANIMATION) + reloop(0x04) + + label(0x7f) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) + label(0x06) + endloop(0x0a) + + label(0x30) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) + do_preset_animation(PRESETANIM_TALKRANDOM) + goto_next(0x06) + + label(0x7f) + chr_do_animation(ANIM_SITTING_0265, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + label(0x06) + play_cistaff_quip(CIQUIP_ANNOYED, CHANNEL_6) + restart_timer + + beginloop(0x5c) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x5c) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) + stop_chr + label(0x7f) + set_alertness(2) + label(0x7d) + yield + if_chr_idle(/*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f) + set_ailist(CHR_SELF, GAILIST_DO_SITTING_ANIMATION) + endloop(0x04) + + label(0x7f) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) + + label(0x06) + goto_first(0x7d) + + endlist +}; + +u8 func041f_colleague1[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(0) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0420_colleague2[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(1) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0421_colleague3[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(2) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0422_colleague4[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(3) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0423_colleague5[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(4) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0424_colleague6[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(5) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0425_colleague7[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(6) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0426_colleague8[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(7) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0427_colleague9[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(8) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func0428_colleague10[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_morale(9) + set_ailist(CHR_SELF, AILIST_COLLEAGUE) + endlist +}; + +u8 func1001_set_jo_team[] = { + yield + set_chr_team(CHR_BOND, TEAM_32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_devicetraining_camspy[] = { + label(0x80) + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CAMSPY, TRUE, /*goto*/ 0x81) + endloop(0x0f) + + label(0x81) + disable_object(0x0e) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(OBJ_CAMSPY) + move_object_to_pad(OBJ_CAMSPY, PAD_DISH_011D) + unset_object_flag(OBJ_CAMSPY, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_CAMSPY, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + yield + enable_object(0x0e) + + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_020) // "Collect CamSpy from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, OBJ_CAMSPY, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_chr_weapon_equipped(CHR_BOND, WEAPON_EYESPY, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_057) // "Select the CamSpy. - Hold A Button. - Use Control Stick to change selection. - Highlight CamSpy and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_player_using_device(CHR_BOND, WEAPON_EYESPY, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_021) // "Locate Info Room PC and holograph it." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_training_pc_holographed(/*goto*/ 0x09) + endloop(0x82) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_022) // "Info Room PC successfully holographed." + restart_timer + + beginloop(0x0c) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0c) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + set_savefile_flag(GAMEFILEFLAG_CI_CAMSPY_DONE) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) + remove_hudmsgs + disable_object(OBJ_CAMSPY) + goto_first(0x0f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_devicetraining_nightvision[] = { + label(0x80) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_lights_state(0x0030, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x002e, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x002f, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0020, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0024, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0025, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0026, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0022, LIGHTOP_1, 0x00, 0x00, 0x00) + set_stage_flag(STAGEFLAG_IN_TRAINING) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x27) + move_object_to_pad(0x27, PAD_DISH_011D) + unset_object_flag(0x27, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x27, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_008) // "Collect Night Vision from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x27, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_chr_weapon_equipped(CHR_BOND, WEAPON_NIGHTVISION, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_058) // "Select the Night Vision. - Hold A Button. - Use Control Stick to change selection. - Highlight Night Vision and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_player_using_device(CHR_BOND, WEAPON_NIGHTVISION, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_009) // "Activate the Night Vision. Locate the light switch. Turn the lights back on." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) +#if VERSION >= VERSION_NTSC_1_0 + play_sound(SFX_PRESS_SWITCH, -1) + set_lights_state(0x0030, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x002e, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x002f, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0020, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0024, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0025, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0026, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0022, LIGHTOP_1, 0xff, 0x00, 0x00) +#endif + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_023) // "Lights have been reactivated." + restart_timer + + beginloop(0x0d) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0d) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_NIGHTVISION_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + set_lights_state(0x0030, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x002e, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x002f, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0020, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0024, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0025, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0026, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0022, LIGHTOP_1, 0xff, 0x00, 0x00) + yield + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x27) + + beginloop(0x59) + if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, FALSE, /*goto*/ 0x2f) + endloop(0x59) + + label(0x2f) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_devicetraining_doordecoder[] = { + label(0x80) + + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DOORDECODER, TRUE, /*goto*/ 0x81) + endloop(0x0f) + + label(0x81) + set_object_flag2(0x88, OBJFLAG2_INVISIBLE) + set_stage_flag(STAGEFLAG_IN_TRAINING) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x28) + move_object_to_pad(0x28, PAD_DISH_011D) + unset_object_flag(0x28, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x28, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_024) // "Collect Door Decoder from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x28, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_chr_weapon_equipped(CHR_BOND, WEAPON_DOORDECODER, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_059) // "Select the Door Decoder. - Hold A Button. - Use Control Stick to change selection. - Highlight Door Decoder and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_weapon_equipped(CHR_BOND, WEAPON_DOORDECODER, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + if_chr_activated_object(CHR_BOND, 0x35, /*goto*/ 0x2f) + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_025) // "Use Decoder on door pad to unlock it." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_chr_activated_object(CHR_BOND, 0x35, /*goto*/ 0x09) + endloop(0x82) + + label(0x09) + if_chr_weapon_equipped(CHR_BOND, WEAPON_DOORDECODER, /*goto*/ 0x06) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_026) // "You need to be holding the Door Decoder." + restart_timer + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(60, /*goto*/ 0x2f) + endloop(0x0e) + + label(0x2f) + goto_first(0x82) + + label(0x06) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_027) // "Decoder attached. Initiating cracking routines..." + unset_object_flag2(0x88, OBJFLAG2_INVISIBLE) + assign_sound(SFX_8144, CHANNEL_1) + play_sound_from_object(CHANNEL_1, 0x35, 1, 300, 400) + restart_timer + + beginloop(0x0c) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x2f) + endloop(0x0c) + + label(0x2f) + mute_channel(CHANNEL_1) + assign_sound(SFX_8145, CHANNEL_1) + control_sound_from_object(CHANNEL_1, 0x35, TRUE) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_028) // "Decoding complete. Door has been unlocked." + unlock_door(0x41, 0x40) + restart_timer + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0d) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_DOORDECODER_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + unset_object_flag2(0x88, OBJFLAG2_INVISIBLE) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + mute_channel(CHANNEL_1) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x28) + goto_first(0x0f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_devicetraining_xray[] = { + label(0x80) + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_XRAY, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x29) + move_object_to_pad(0x29, PAD_DISH_011D) + unset_object_flag(0x29, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x29, OBJFLAG2_INVISIBLE) + unset_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_035) // "Collect X-Ray Scanner from table to begin." + restart_timer + + beginloop(0x86) + if_player_using_device(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) + set_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) + goto_next(0x30) + + label(0x2f) + unset_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) + unset_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) + label(0x30) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x29, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x8d) + remove_hudmsgs + if_chr_weapon_equipped(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_060) // "Select the X-Ray Scanner. - Hold A Button. - Use Control Stick to change selection. - Highlight X-Ray Scanner and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_player_using_device(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_036) // "Find hidden switches to shut down laser grid." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_player_using_device(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) + set_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) + goto_next(0x30) + + label(0x2f) + unset_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) + unset_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) + label(0x30) + if_chr_activated_object(CHR_BOND, 0x38, /*goto*/ 0x5b) + if_chr_activated_object(CHR_BOND, 0x39, /*goto*/ 0x5c) + endloop(0x82) + + label(0x5b) + if_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x87) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_041) // "Laser Grid 1 has been deactivated." + set_object_image(0x38, 0, TVCMDLIST_12) + set_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI) + open_door(0x3a) + label(0x87) + restart_timer + + beginloop(0x89) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x85) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x85) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x85) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x89) + + label(0x5c) + if_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x88) + set_object_image(0x39, 0, TVCMDLIST_12) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_042) // "Laser Grid 2 has been deactivated." + set_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI) + open_door(0x3b) + label(0x88) + restart_timer + + beginloop(0x8a) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x8a) + + label(0x8b) + disable_object(0x3a) + goto_next(0x06) + + label(0x07) + disable_object(0x3b) + goto_next(0x06) + + label(0x06) + if_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_first(0x82) + + label(0x2f) + if_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_first(0x82) + + label(0x09) + restart_timer + + beginloop(0x5b) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x5b) + + label(0x2f) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_037) // "All laser grids have been deactivated." + restart_timer + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0e) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_XRAY_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x29) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_devicetraining_disguise[] = { + label(0x80) + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + unset_stage_flag(STAGEFLAG_DISGUISE_FAILED) + unset_stage_flag(STAGEFLAG_DISGUISE_COMPLETE) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x2a) + move_object_to_pad(0x2a, PAD_DISH_011D) + unset_object_flag(0x2a, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x2a, OBJFLAG2_INVISIBLE) + set_ailist(0x03, AILIST_GRIMSHAW_DISGUISE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_038) // "Collect Disguise from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DISGUISE_FAILED, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x2a, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_061) // "Select the Disguise. - Hold A Button. - Use Control Stick to change selection. - Highlight Disguise and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DISGUISE_FAILED, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_039) // "Fool someone into giving you Cloaking Device." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_DISGUISE_COMPLETE, TRUE, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_DISGUISE_FAILED, TRUE, /*goto*/ 0x0a) + endloop(0x82) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_040) // "Cloaking Device successfully retrieved." + restart_timer + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0e) + + label(0x0a) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_047) // "You're meant to use the Disguise, remember?" + restart_timer + + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + label(0x59) + if_timer_gt(240, /*goto*/ 0x85) + endloop(0x0f) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_DISGUISE_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x2a) + + beginloop(0x6d) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, FALSE, /*goto*/ 0x2f) + endloop(0x6d) + + label(0x2f) + set_ailist(0x03, AILIST_INIT_COLLEAGUE_WHEN_SIGHTED) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_devicetrainign_ir[] = { + label(0x80) + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + if_chr_activated_object(CHR_BOND, 0x37, /*goto*/ 0x2f) + label(0x2f) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x2b) + move_object_to_pad(0x2b, PAD_DISH_011D) + unset_object_flag(0x2b, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x2b, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_032) // "Collect IR Scanner from table to begin." + restart_timer + + beginloop(0x86) + if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) + set_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) + goto_next(0x30) + label(0x2f) + unset_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) + label(0x30) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x2b, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_062) // "Select the IR Scanner. - Hold A Button. - Use Control Stick to change selection. - Highlight IR Scanner and release A Button." + restart_timer + + beginloop(0x8e) + if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) + set_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) + goto_next(0x30) + + label(0x2f) + unset_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) + label(0x30) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_033) // "Locate secret door using IR Scanner." + + beginloop(0x82) + if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) + set_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) + goto_next(0x30) + label(0x2f) + unset_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) + label(0x30) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_chr_activated_object(CHR_BOND, 0x37, /*goto*/ 0x09) + endloop(0x82) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_034) // "Secret door has been successfully located." + restart_timer + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0e) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_IR_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x2b) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_devicetraining_rtracker[] = { + label(0x80) + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_RTRACKER, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x2c) + move_object_to_pad(0x2c, PAD_DISH_011D) + unset_object_flag(0x2c, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x2c, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_029) // "Collect Tracker from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x2c, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_player_using_device(CHR_BOND, WEAPON_RTRACKER, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_063) // "Select the Tracker. - Hold A Button. - Use Control Stick to change selection. - Highlight Tracker and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_player_using_device(CHR_BOND, WEAPON_RTRACKER, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + unset_object_flag(0x36, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x36, OBJFLAG2_INVISIBLE) + enable_object(0x36) + move_object_to_pad(0x36, PAD_DISH_011E) + set_object_flag3(0x36, OBJFLAG3_RTRACKED_YELLOW) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_030) // "Locate IR Scanner using Tracker." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_chr_has_object(CHR_BOND, 0x36, /*goto*/ 0x09) + endloop(0x82) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_031) // "IR Scanner has been successfully located." + restart_timer + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0e) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_RTRACKER_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x2c) + disable_object(0x36) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_devicetraining_cloak[] = { + label(0x80) + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + deactivate_alarm + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + restart_timer + enable_object(0x2d) + move_object_to_pad(0x2d, PAD_DISH_011D) + unset_stage_flag(STAGEFLAG_CLOAK_FAILED) + unset_stage_flag(STAGEFLAG_CLOAK_COMPLETE) + unset_object_flag(0x2d, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x2d, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_051) // "Collect Cloaking Device from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_CLOAK_COMPLETE, TRUE, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x0a) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x2d, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + set_ailist(CHR_CARRINGTON, AILIST_CARRINGTON_CLOAK) + label(0x8d) + remove_hudmsgs + if_player_using_device(CHR_BOND, WEAPON_CLOAKINGDEVICE, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_064) // "Select the Cloaking Device. - Hold A Button. - Use Control Stick to change selection. - Highlight Device and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_CLOAK_COMPLETE, TRUE, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_player_using_device(CHR_BOND, WEAPON_CLOAKINGDEVICE, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_052) // "Use Cloaking Device and locate Carrington." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_CLOAK_COMPLETE, TRUE, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x0a) + endloop(0x82) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_054) // "Mission complete - Device Training passed!" + restart_timer + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0e) + + label(0x0a) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_055) // "Mission failed - you have been detected." + restart_timer + + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x85) + endloop(0x0f) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_CLOAK_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x2d) + + beginloop(0x5c) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x2f) + endloop(0x5c) + + label(0x2f) + set_ailist(CHR_CARRINGTON, AILIST_INIT_COLLEAGUE_WHEN_SIGHTED) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_devicetraining_ecmmine[] = { + label(0x80) + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_ECMMINE, TRUE, /*goto*/ 0x81) + endloop(0x0f) + + label(0x81) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + enable_object(0x2e) + move_object_to_pad(0x2e, PAD_DISH_011D) + unset_object_flag(0x2e, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x2e, OBJFLAG2_INVISIBLE) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_016) // "Collect ECM Mine from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x2e, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_chr_weapon_equipped(CHR_BOND, WEAPON_ECMMINE, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_065) // "Select the ECM Mine. - Hold A Button. - Use Control Stick to change selection. - Highlight ECM Mine and release A Button." + restart_timer + + beginloop(0x8e) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_weapon_equipped(CHR_BOND, WEAPON_ECMMINE, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_017) // "Locate Hub and throw ECM Mine onto Hub." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + yield + yield + yield + yield + yield + if_weapon_thrown(WEAPON_ECMMINE, /*goto*/ 0x06) + goto_first(0x82) + + label(0x06) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_weapon_thrown_on_object(WEAPON_ECMMINE, 0x32, /*goto*/ 0x09) + if_timer_gt(120, /*goto*/ 0x0a) + endloop(0x08) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_019) // "ECM Mine has been placed correctly." + restart_timer + + beginloop(0x0c) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_timer_gt(240, /*goto*/ 0x83) + endloop(0x0c) + + label(0x0a) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_018) // "ECM Mine has been placed incorrectly." + restart_timer + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_timer_gt(240, /*goto*/ 0x85) + endloop(0x0d) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_ECMMINE_DONE) + yield + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + disable_object(0x2e) + goto_first(0x0f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_devicetraining_uplink[] = { + label(0x80) + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_UPLINK, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + lock_door(0x31, 0x40) + lock_door(0x8a, 0x40) + lock_door(0x89, 0x40) + unset_stage_flag(STAGEFLAG_DEVICE_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + enable_object(0x2f) + move_object_to_pad(0x2f, PAD_DISH_0131) + unset_object_flag(0x2f, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(0x2f, OBJFLAG2_INVISIBLE) + close_door(0x31) + close_door(0x8a) + close_door(0x89) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x8c) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x8c) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x8c) + label(0x8c) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_010) // "Collect Data Uplink from table to begin." + restart_timer + + beginloop(0x86) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_chr_has_object(CHR_BOND, 0x2f, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x86) + + label(0x06) + goto_first(0x8c) + + label(0x2f) + label(0x8d) + remove_hudmsgs + if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_056) // "Select the Uplink. - Hold A Button. - Use Control Stick to change selection. - Highlight Data Uplink and release A Button." + restart_timer + + beginloop(0x8e) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x8e) + + label(0x06) + goto_first(0x8d) + + label(0x2f) + if_chr_activated_object(CHR_BOND, 0x30, /*goto*/ 0x2f) + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_011) // "Stand next to the terminal and use the Uplink." + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x30, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + endloop(0x82) + + label(0x2f) + if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + play_sound(SFX_8116, -1) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_012) // "You need to be holding the Data Uplink." + goto_first(0x82) + + label(0x2f) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_013) // "Connection established..." + restart_timer + + label(0x08) + yield + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + assign_sound(SFX_01BF, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x30, TRUE) + label(0x14) + yield + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(400, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_BOND, 400, PAD_DISH_0227, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + goto_first(0x09) + + label(0x2f) + goto_first(0x14) + + label(0x06) + restart_timer + mute_channel(CHANNEL_5) + assign_sound(SFX_01C1, CHANNEL_7) + control_sound_from_object(CHANNEL_7, 0x30, TRUE) + remove_hudmsgs + show_hudmsg(CHR_TARGET, L_DISH_014) // "Terminal has been successfully hacked." + + beginloop(0x15) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x15) + + label(0x06) + goto_next(0x83) + + label(0x09) + remove_hudmsgs + show_hudmsg(CHR_BOND, L_DISH_015) // "Connection broken - too far from PC." + mute_channel(CHANNEL_5) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, 0x30, TRUE) + restart_timer + + beginloop(0x16) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) + if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x16) + + label(0x06) + mute_channel(CHANNEL_6) + goto_first(0x82) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_UPLINK_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) + unlock_door(0x31, 0x40) + unlock_door(0x8a, 0x40) + unlock_door(0x89, 0x40) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + disable_object(0x2f) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_move_jo_to_training_room[] = { + // Wait for flag to be set while not in training + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, TRUE, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) +#if VERSION >= VERSION_NTSC_1_0 + if_stage_flag_eq(STAGEFLAG_TRIGGER_UPLINK, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_ECMMINE, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CAMSPY, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DOORDECODER, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_RTRACKER, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_XRAY, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + reloop(0x04) + + label(0x06) +#endif + unset_stage_flag(STAGEFLAG_CONSIDER_WARP) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x2f) + goto_next(0x30) + + // In room + label(0x2f) + endloop(0x04) + + // Not in room + label(0x30) + revoke_control(CHR_BOND, 0) + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 5000) + restart_timer + + beginloop(0x08) + if_timer_gt(30, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x0016, /*goto*/ 0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x0017, /*goto*/ 0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x0018, /*goto*/ 0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x0019, /*goto*/ 0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x0014, /*goto*/ 0x2f) + enter_camera_and_move_to_pad(PAD_DISH_0151) + set_ailist(CHR_P1P2, AILIST_MOVE_TO_DEVICEROOM) + goto_next(0x06) + + label(0x2f) + enter_camera_and_move_to_pad(PAD_DISH_020A) + set_ailist(CHR_P1P2, AILIST_MOVE_TO_HOLOROOM) + + label(0x06) + yield + yield + yield + yield + enter_firstperson + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + restart_timer + + beginloop(0x09) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + grant_control(CHR_BOND) + enter_firstperson + unset_stage_flag(STAGEFLAG_CONSIDER_WARP) + goto_first(0x04) + + endlist +}; + +u8 func0401_move_to_deviceroom[] = { + chr_move_to_pad(CHR_SELF, PAD_DEVICEROOM, 0x01, /*goto*/ 0x06) + label(0x06) + stop_chr + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_move_to_holoroom[] = { + chr_move_to_pad(CHR_SELF, PAD_HOLOROOM, 0x01, /*goto*/ 0x06) + label(0x06) + stop_chr + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0429_grimshaw_disguise[] = { + set_returnlist(CHR_SELF, AILIST_GRIMSHAW_DISGUISE) + restart_timer + + beginloop(0x0f) + if_timer_gt(60, /*goto*/ 0x8f) + endloop(0x0f) + + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, FALSE, /*goto*/ 0x04) + endloop(0x8f) + + // Wait until Jo in sight + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_target_in_sight(/*goto*/ 0x2f) + if_chr_idle(/*goto*/ 0x06) + label(0x7f) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) + label(0x06) + endloop(0x04) + + label(0x2f) + restart_timer + label(0x08) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x06) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + do_preset_animation(PRESETANIM_TALK3) + play_cistaff_quip(CIQUIP_GREETING, CHANNEL_6) + restart_timer + + beginloop(0x57) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + restart_timer + + beginloop(0x58) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x58) + + label(0x06) + speak(CHR_BOND, L_DISH_043, MP3_0517, CHANNEL_6, COLOR_09_BLUE) // "I'm here to pick up the equipment." + + beginloop(0x59) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x59) + + label(0x06) + restart_timer + + beginloop(0x5b) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x5b) + + label(0x06) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ 0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_044, MP3_0518, CHANNEL_6, COLOR_05_GREEN) // "Go away, Joanna. You're not fooling anybody!" + + beginloop(0x5c) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x5c) + + label(0x06) + set_stage_flag(STAGEFLAG_DISGUISE_FAILED) + goto_next(0x0d) + + label(0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_045, MP3_0519, CHANNEL_6, COLOR_05_GREEN) // "Here you go. Don't drop it now." + + beginloop(0x5d) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x5d) + + label(0x06) + give_object_to_chr(0x3c, CHR_BOND) + set_stage_flag(STAGEFLAG_DISGUISE_COMPLETE) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_cloak_detection[] = { + beginloop(0x04) + deactivate_alarm + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x8f) + reloop(0x04) + + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x5d) + if_chr_distance_to_pad_lt(CHR_BOND, 200, PAD_DISH_027B, /*goto*/ 0x06) + endloop(0x8f) + + beginloop(0x5d) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) + endloop(0x5d) + + label(0x30) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + endloop(0x04) + + label(0x06) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_CLOAKED, /*goto*/ 0x30) + activate_alarm + yield + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x59) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + speak(CHR_TARGET, L_DISH_048, MP3_051A, CHANNEL_6, COLOR_05_GREEN) // "You'll have to do better than that, Joanna." + show_hudmsg(CHR_BOND, L_DISH_050) // "You have been detected by the camera." + restart_timer + + beginloop(0x0a) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_stage_flag(STAGEFLAG_CLOAK_FAILED) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) + if_timer_gt(120, /*goto*/ 0x59) + endloop(0x08) + + label(0x59) + deactivate_alarm + + beginloop(0x5a) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) + endloop(0x5a) + + label(0x30) + deactivate_alarm + restart_timer + + beginloop(0x5c) + yield + if_timer_gt(60, /*goto*/ 0x2f) + endloop(0x5c) + + label(0x2f) + goto_first(0x04) + + label(0x06) + goto_first(0x8f) + + endlist +}; + +u8 func042a_carrington_cloak[] = { + set_returnlist(CHR_SELF, AILIST_CARRINGTON_CLOAK) + + beginloop(0x8f) + chr_move_to_pad(CHR_SELF, PAD_CARRINGTON_OFFICE, 0x01, /*goto*/ 0x06) + endloop(0x8f) + + label(0x06) + + beginloop(0x04) + if_target_in_sight(/*goto*/ 0x2f) + if_chr_idle(/*goto*/ 0x06) + label(0x7f) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) + + label(0x06) + endloop(0x04) + + label(0x2f) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + close_door(0x40) + restart_timer + label(0x08) + if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x06) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + restart_timer + chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + restart_timer + + beginloop(0x57) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_BOND, L_DISH_049, MP3_051B, CHANNEL_6, COLOR_06_WHITE) // "Joanna, where did you spring from?" + + beginloop(0x59) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x59) + + label(0x06) + restart_timer + + beginloop(0x5b) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x5b) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_053, MP3_051C, CHANNEL_6, COLOR_06_WHITE) // "I think we can safely say your training is now complete!" + + beginloop(0x5c) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x5c) + + label(0x06) + stop_chr + set_stage_flag(STAGEFLAG_CLOAK_COMPLETE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_training_unlockables[] = { + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_UPLINK_DONE, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + unlock_door(0x3e, 0x40) + + beginloop(0x08) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_ECMMINE_DONE, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + unlock_door(0x3d, 0x40) + unlock_door(0x3f, 0x40) + goto_next(0x2f) + + beginloop(0x09) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_CAMSPY_DONE, /*goto*/ 0x2f) + endloop(0x09) + + label(0x2f) + unset_object_flag2(OBJ_LIGHTSWITCH, OBJFLAG2_INVISIBLE) + + beginloop(0x0a) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_NIGHTVISION_DONE, /*goto*/ 0x2f) + endloop(0x0a) + + label(0x2f) + set_lights_state(0x0030, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x002e, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x002f, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0020, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0024, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0025, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0026, LIGHTOP_1, 0xff, 0x00, 0x00) + set_lights_state(0x0022, LIGHTOP_1, 0xff, 0x00, 0x00) + + beginloop(0x0b) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_DOORDECODER_DONE, /*goto*/ 0x2f) + endloop(0x0b) + + label(0x2f) + unlock_door(0x41, 0x40) + + beginloop(0x0e) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_IR_DONE, /*goto*/ 0x2f) + endloop(0x0e) + + label(0x2f) + unlock_door(0x37, 0x40) + + beginloop(0x0f) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_XRAY_DONE, /*goto*/ 0x2f) + endloop(0x0f) + + label(0x2f) + disable_object(0x3a) + disable_object(0x3b) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define do_door_proxy(eepromflag, pad, door) \ + /* If training flag is done, open/close a door automatically as Jo nears it */ \ + beginloop(0x04) \ + if_savefile_flag_is_set(eepromflag, /*goto*/ 0x2f) \ + reloop(0x04) \ + \ + label(0x2f) \ + if_chr_distance_to_pad_lt(CHR_BOND, 350, pad, /*goto*/ 0x06) \ + close_door(door) \ + reloop(0x04) \ + \ + label(0x06) \ + if_door_state(door, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2f) \ + open_door(door) \ + set_object_flag(door, OBJFLAG_DOOR_KEEPOPEN) \ + restart_timer \ + \ + beginloop(0x08) \ + if_timer_gt(120, /*goto*/ 0x2f) \ + endloop(0x08) \ + \ + label(0x2f) \ + endloop(0x04) + +u8 func1010_doorproxy[] = { + do_door_proxy(GAMEFILEFLAG_CI_UPLINK_DONE, 0x0186, 0x3e) + endlist +}; + +u8 func1012_cloak_doorproxy[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DEVICE_SUCCESS, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DEVICE_FAILURE, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 350, PAD_DISH_0188, /*goto*/ 0x06) + close_door(0x40) + label(0x2f) + endloop(0x04) + + label(0x06) + if_door_state(0x40, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2f) + open_door(0x40) + set_object_flag(0x40, OBJFLAG_DOOR_KEEPOPEN) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + goto_first(0x04) + + endlist +}; + +#if VERSION >= VERSION_NTSC_1_0 +u8 func101b_ir_door[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x06) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_IR_DONE, /*goto*/ 0x2f) + label(0x06) + reloop(0x04) + + label(0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 350, PAD_DISH_0192, /*goto*/ 0x06) + close_door(0x37) + endloop(0x04) + + label(0x06) + if_door_state(0x37, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2f) + open_door(0x37) + set_object_flag(0x37, OBJFLAG_DOOR_KEEPOPEN) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + goto_first(0x04) + + endlist +}; +#endif + +u8 func042b_init_carrington[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + yield + set_morale(0) + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) +#if VERSION >= VERSION_NTSC_1_0 + set_savefile_flag(GAMEFILEFLAG_CI_TOUR_DONE) +#endif + + beginloop(0x08) + chr_move_to_pad(CHR_SELF, PAD_CARRINGTON_OFFICE, 0x01, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_ailist(CHR_SELF, 0x041e) + + label(0x06) + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_DONE, /*goto*/ 0x8f) + goto_first(0x08) + + beginloop(0x8f) + chr_move_to_pad(CHR_SELF, PAD_OUTSIDE_JO_OFFICE, 0x01, /*goto*/ 0x2f) + endloop(0x8f) + + label(0x2f) + stop_chr + set_ailist(CHR_SELF, AILIST_CARRINGTON_TOUR) + endlist +}; + +u8 func1019_setup_carrington[] = { + beginloop(0x04) + if_chr_has_hiddenflag(CHR_CARRINGTON, CHRHFLAG_INFINITESHIELD, /*goto*/ 0x06) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x2f) + endloop(0x04) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2f) + set_ailist(CHR_CARRINGTON, AILIST_INIT_CARRINGTON) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042c_carrington_tour[] = { + set_returnlist(CHR_SELF, AILIST_CARRINGTON_TOUR) + set_self_chrflag(CHRCFLAG_00040000) + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, 0x0054, /*goto*/ 0x04) + + beginloop(0x04) + if_timer_gt(1200, /*goto*/ 0x2f) + if_can_see_target(/*goto*/ 0x2f) + if_chr_idle(/*goto*/ 0x06) + label(0x7f) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) + + label(0x06) + endloop(0x04) + + label(0x2f) + if_can_see_target(/*goto*/ 0x06) + try_jog_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_can_see_target(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) + set_savefile_flag(GAMEFILEFLAG_CI_TOUR_STARTED) + do_preset_animation(PRESETANIM_TALKRANDOM) + remove_hudmsgs + speak(CHR_TARGET, L_DISH_066, SFX_8029, CHANNEL_6, COLOR_06_WHITE) // "Joanna, it's good to see you." + restart_timer + + beginloop(0x57) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_067, MP3_051D, CHANNEL_6, COLOR_06_WHITE) // "Come with me. I'll walk you round the training rooms." + restart_timer + + beginloop(0x59) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x59) + + label(0x06) + walk_to_pad(PAD_DISH_0064) + + beginloop(0x5b) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x5b) + + label(0x06) + stop_chr + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, 0x0068, /*goto*/ 0x5c) + + beginloop(0x5c) + if_timer_lt(60, /*goto*/ 0x06) + if_can_see_target(/*goto*/ 0x2f) + label(0x06) + endloop(0x5c) + + label(0x2f) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + goto_first(0x5c) + + label(0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + remove_hudmsgs + speak(CHR_TARGET, L_DISH_068, MP3_0520, CHANNEL_6, COLOR_06_WHITE) // "The information center is through this door." + restart_timer + + beginloop(0x5d) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x5d) + + label(0x06) + walk_to_pad(PAD_DISH_0065) + + beginloop(0x62) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x62) + + label(0x06) + stop_chr + + beginloop(0x63) + if_can_see_target(/*goto*/ 0x2f) + endloop(0x63) + + label(0x2f) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + goto_first(0x63) + + label(0x2f) +#if VERSION >= VERSION_NTSC_1_0 + set_ailist(0x01, GAILIST_IDLE) +#endif + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_069, MP3_051F, CHANNEL_6, COLOR_06_WHITE) // "In here we have the device lab." + restart_timer + + beginloop(0x64) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x64) + + label(0x06) + restart_timer + try_face_entity(ATTACKFLAG_AIMATCHR, 0x01, /*goto*/ 0x65) + + beginloop(0x65) + if_timer_gt(40, /*goto*/ 0x06) + endloop(0x65) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + play_sound(SFX_CARR_HELLO_JOANNA, CHANNEL_6) + set_ailist(0x01, AILIST_DEVICEGIRL_REPLY_TO_CARRINGTON) + restart_timer + + beginloop(0x66) + if_timer_gt(20, /*goto*/ 0x06) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x66) + + label(0x06) + mute_channel(CHANNEL_6) + stop_chr + yield + yield + + beginloop(0x68) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x68) + + label(0x06) + walk_to_pad(PAD_DISH_0020) + + beginloop(0x69) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x69) + + label(0x06) + stop_chr + + beginloop(0x6a) + if_can_see_target(/*goto*/ 0x2f) + endloop(0x6a) + + label(0x2f) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + goto_first(0x6a) + + label(0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_070, MP3_0521, CHANNEL_6, COLOR_06_WHITE) // "This leads to the simulant training room." + restart_timer + + beginloop(0x6b) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x6b) + + label(0x06) + stop_chr + yield + yield + + beginloop(0x6c) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x6c) + + label(0x06) + walk_to_pad(PAD_DISH_0010) + + beginloop(0x6d) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x6d) + + label(0x06) + stop_chr + + beginloop(0x6e) + if_can_see_target(/*goto*/ 0x2f) + endloop(0x6e) + + label(0x2f) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + goto_first(0x6e) + + label(0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_071, MP3_051E, CHANNEL_6, COLOR_06_WHITE) // "This is the firing range, Jo." + restart_timer + + beginloop(0x6f) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x6f) + + label(0x06) + restart_timer + try_face_entity(ATTACKFLAG_AIMATCHR, 0x01, /*goto*/ 0x70) + + beginloop(0x70) + if_timer_gt(40, /*goto*/ 0x06) + endloop(0x70) + + label(0x06) +#if VERSION < VERSION_NTSC_1_0 + set_ailist(0x01, 0x042e) +#endif + restart_timer + + beginloop(0x71) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x71) + + label(0x06) + stop_chr + yield + yield + + beginloop(0x72) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x72) + + label(0x06) + label(0x06) + walk_to_pad(PAD_DISH_0009) + + beginloop(0x73) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x73) + + label(0x06) + stop_chr + + beginloop(0x74) + if_can_see_target(/*goto*/ 0x2f) + endloop(0x74) + + label(0x2f) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + goto_first(0x74) + + label(0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_072, MP3_0522, CHANNEL_6, COLOR_06_WHITE) // "This corridor leads down to the hangar." + restart_timer + + beginloop(0x75) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x75) + + label(0x06) + restart_timer + set_target_chr(CHR_BOND) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x79) + + beginloop(0x79) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x79) + + label(0x2f) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_DISH_124, MP3_07DC, CHANNEL_6, COLOR_06_WHITE) // "Okay, Jo, I'll leave you to prepare for the mission." + + beginloop(0x7a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + endloop(0x7a) + + label(0x2f) + set_savefile_flag(GAMEFILEFLAG_CI_TOUR_DONE) + walk_to_pad(PAD_CARRINGTON_OFFICE) + + beginloop(0x76) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x76) + + label(0x06) + set_ailist(CHR_SELF, 0x041e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042e_devicegirl_reply_to_carrington[] = { + set_alertness(1) + set_self_chrflag(CHRCFLAG_00040000) + restart_timer + try_face_entity(ATTACKFLAG_AIMATCHR, CHR_CARRINGTON, /*goto*/ 0x5f) + + beginloop(0x5f) + if_timer_gt(40, /*goto*/ 0x06) + endloop(0x5f) + + label(0x06) + + beginloop(0x60) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x60) + + label(0x06) + yield + yield + yield + assign_sound(MP3_CIFEM_PATIENCE, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + + beginloop(0x61) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + endloop(0x61) + + label(0x06) + set_ailist(CHR_SELF, 0x041e) + endlist +}; + +u8 func1013_msg_hovercrate[] = { +#if VERSION >= VERSION_PAL_BETA + beginloop(0x8f) + if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_HOVERCRATE, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_HOVERCRATE, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0141, /*goto*/ 0x2f) + endloop(0x04) +#else + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0141, /*goto*/ 0x2f) + endloop(0x04) +#endif + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2f) +#if VERSION >= VERSION_PAL_BETA + set_savefile_flag(GAMEFILEFLAG_HOWTO_HOVERCRATE) +#endif + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_073) // "HOVERCRATE Press B Button next to Hovcrate to grab it..." + restart_timer + + beginloop(0x08) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_074) // "Press B Button when crate grabbed to release it." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_msg_hoverbike[] = { +#if VERSION >= VERSION_PAL_BETA + beginloop(0x8f) + if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_HOVERBIKE, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_HOVERBIKE, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_01F9, /*goto*/ 0x2f) + endloop(0x04) +#else + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_01F9, /*goto*/ 0x2f) + endloop(0x04) +#endif + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2f) +#if VERSION >= VERSION_PAL_BETA + set_savefile_flag(GAMEFILEFLAG_HOWTO_HOVERBIKE) +#endif + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_075) // "HOVERBIKE Double tap B Button next to Hovbike to ride it..." + restart_timer + + beginloop(0x08) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_076) // "Double tap B Button when on Hovbike to dismount." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_msg_doors[] = { +#if VERSION >= VERSION_PAL_BETA + beginloop(0x8f) + if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_DOORS, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_DOORS, /*goto*/ 0x06) + endloop(0x04) +#else + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) + endloop(0x04) +#endif + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2f) +#if VERSION >= VERSION_PAL_BETA + set_savefile_flag(GAMEFILEFLAG_HOWTO_DOORS) +#endif + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_077) // "OPENING DOORS Press B Button next to door to open it." + restart_timer + + beginloop(0x08) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_078) // "B Button will also activate any object nearby." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_msg_elevators[] = { +#if VERSION >= VERSION_PAL_BETA + beginloop(0x8f) + if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_ELEVATORS, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_ELEVATORS, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0160, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0162, /*goto*/ 0x2f) + endloop(0x04) +#else + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0160, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0162, /*goto*/ 0x2f) + endloop(0x04) +#endif + + label(0x2f) +#if VERSION >= VERSION_PAL_BETA + set_savefile_flag(GAMEFILEFLAG_HOWTO_ELEVATORS) +#endif + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_079) // "ELEVATORS Press B Button next to door to call elevator." + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_msg_terminals[] = { +#if VERSION >= VERSION_PAL_BETA + beginloop(0x8f) + if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_TERMINALS, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_TERMINALS, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0227, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_022A, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021C, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021E, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0221, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0224, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_023E, /*goto*/ 0x2f) + endloop(0x04) +#else + if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0227, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_022A, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021C, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021E, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0221, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0224, /*goto*/ 0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_023E, /*goto*/ 0x2f) + endloop(0x04) +#endif + + label(0x2f) +#if VERSION >= VERSION_PAL_BETA + set_savefile_flag(GAMEFILEFLAG_HOWTO_TERMINALS) +#endif + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_114) // "TERMINALS - Press B Button next to terminal to use it." + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_lightswitch[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, FALSE, /*goto*/ 0x2f) + if_player_using_device(CHR_BOND, WEAPON_NIGHTVISION, /*goto*/ 0x2f) + set_object_flag2(OBJ_LIGHTSWITCH, OBJFLAG2_INVISIBLE) + reloop(0x04) + + label(0x2f) + unset_object_flag2(OBJ_LIGHTSWITCH, OBJFLAG2_INVISIBLE) + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_holo1_main[] = { + label(0x80) + disable_object(0x48) + disable_object(0x49) + disable_object(0x4a) + disable_object(0x4b) + disable_object(0x4c) + disable_object(0x4d) + disable_object(0x4e) + disable_object(0x4f) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + restart_timer + + beginloop(0x13) + if_timer_gt(30, /*goto*/ 0x2f) + endloop(0x13) + + label(0x2f) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + enable_object(0x48) + enable_object(0x49) + enable_object(0x4a) + enable_object(0x4b) + enable_object(0x4c) + enable_object(0x4d) + enable_object(0x4e) + enable_object(0x4f) + unset_object_flag2(0x48, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x49, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x4a, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x4b, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x4d, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x4e, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI) + disable_chr(0x04) + label(0x91) + if_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x4d, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x4e, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + label(0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_100) // "Get the access codes by examining terminals. - Use the codes on the wall terminals." + goto_next(0x06) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_115) // "Now activate the red terminals on the wall." + label(0x06) + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO1_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + disable_object(0x48) + disable_object(0x49) + disable_object(0x4a) + disable_object(0x4b) + disable_object(0x4c) + disable_object(0x4d) + disable_object(0x4e) + disable_object(0x4f) + enable_object(0x45) + remove_hudmsgs + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define holo1_some_terminal(object, function) \ + beginloop(0x8f) \ + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) \ + endloop(0x8f) \ + \ + label(0x2f) \ + set_object_image(object, 0, TVCMDLIST_12) \ + unset_object_flag2(object, OBJFLAG2_00040000) \ + \ + beginloop(0x04) \ + if_chr_activated_object(CHR_ANY, object, /*goto*/ 0x2f) \ + reloop(0x04) \ + \ + label(0x2f) \ + if_object_flag2(object, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) \ + endloop(0x04) \ + \ + label(0x2f) \ + set_object_image(object, 0, TVCMDLIST_13) \ + set_object_flag2(object, OBJFLAG2_00040000) \ + assign_sound(SFX_043A, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, object, TRUE) \ + set_returnlist(CHR_SELF, function) \ + set_ailist(CHR_SELF, AILIST_HOLO1_CHECK_DONE) + +u8 func101d_holo1_switch1[] = { + holo1_some_terminal(0x4c, AILIST_HOLO1_SWITCH1) + endlist +}; + +u8 func101e_holo1_switch2[] = { + holo1_some_terminal(0x4d, AILIST_HOLO1_SWITCH2) + endlist +}; + +u8 func101f_holo1_switch3[] = { + holo1_some_terminal(0x4e, AILIST_HOLO1_SWITCH3) + endlist +}; + +u8 func1020_holo1_monitor_switches[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) + endloop(0x8f) + + label(0x2f) + set_object_image(0x4f, 0, TVCMDLIST_12) + unset_object_flag2(0x4f, OBJFLAG2_00040000) + + beginloop(0x04) + if_chr_activated_object(CHR_ANY, 0x4f, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + set_object_image(0x4f, 0, TVCMDLIST_13) + set_object_flag2(0x4f, OBJFLAG2_00040000) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, 0x4f, TRUE) + set_returnlist(CHR_SELF, AILIST_HOLO1_MONITOR_SWITCHES) + set_ailist(CHR_SELF, AILIST_HOLO1_CHECK_DONE) + endlist +}; + +#define holo1_code_thing_p1(object1, object2, pad) \ + yield \ + yield \ + yield \ + \ + beginloop(0x04) \ + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) \ + reloop(0x04) \ + \ + label(0x2f) \ + if_object_in_good_condition(object1, /*goto*/ 0x2f) \ + reloop(0x04) \ + \ + label(0x2f) \ + if_object_flag2(object1, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) \ + if_chr_distance_to_pad_lt(CHR_BOND, 400, pad, /*goto*/ 0x09) \ + label(0x2f) \ + if_chr_looking_at_object(CHR_BOND, object1, /*goto*/ 0x2f) \ + endloop(0x04) \ + \ + label(0x09) + +#define holo1_code_thing_p2(object1, object2, hint, msg) \ + remove_hudmsgs \ + show_hudmsg_middle(0x01, COLOR_04_ORANGE, hint) \ + goto_first(0x04) \ + \ + label(0x2f) \ + set_object_image(object2, 0, TVCMDLIST_12) \ + set_object_image(object1, 0, TVCMDLIST_13) \ + remove_hudmsgs \ + show_hudmsg(CHR_BOND, msg) \ + assign_sound(SFX_DOOR_81B0, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, object1, TRUE) \ + restart_timer \ + \ + beginloop(0x57) \ + if_timer_gt(60, /*goto*/ 0x2f) \ + goto_first(0x57) \ + \ + label(0x2f) \ + set_object_flag2(object2, OBJFLAG2_IMMUNETOANTI) \ + \ + beginloop(0x59) \ + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x2f) \ + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) \ + reloop(0x59) \ + \ + label(0x2f) \ + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, FALSE, /*goto*/ 0x2f) \ + endloop(0x59) \ + \ + label(0x2f) \ + goto_first(0x8f) + +u8 func1021_holo1_code1[] = { + label(0x8f) + set_object_image(0x48, 0, TVCMDLIST_12) + unset_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI) + + holo1_code_thing_p1(0x48, 0x4c, 0x0240) + + set_object_flag2(0x48, OBJFLAG2_IMMUNETOANTI) + set_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI) + + // 0x1c55 = "LOOK UP - Press Down C Button to look up at the target." + // 0x1c65 = "Code 1 has been obtained." + holo1_code_thing_p2(0x48, 0x4c, 0x1c55, 0x1c65) + + endlist +}; + +u8 func1021_holo1_code2[] = { + label(0x8f) + set_object_image(0x49, 0, TVCMDLIST_12) + unset_object_flag2(0x4d, OBJFLAG2_IMMUNETOANTI) + + holo1_code_thing_p1(0x49, 0x4d, 0x0241) + + set_object_flag2(0x49, OBJFLAG2_IMMUNETOANTI) + + // 0x1c56 = "LOOK DOWN - Press Up C Button to look down at the target." + // 0x1c66 = "Code 2 has been obtained." + holo1_code_thing_p2(0x49, 0x4d, 0x1c56, 0x1c66) + endlist +}; + +u8 func1021_holo1_code3[] = { + label(0x8f) + unset_object_flag2(0x4e, OBJFLAG2_IMMUNETOANTI) + set_object_image(0x4a, 0, TVCMDLIST_12) + + holo1_code_thing_p1(0x4a, 0x4e, 0x0242) + + set_object_flag2(0x4a, OBJFLAG2_IMMUNETOANTI) + + // 0x1c55 = "LOOK UP - Press Down C Button to look up at the target." + // 0x1c67 = "Code 3 has been obtained." + holo1_code_thing_p2(0x4a, 0x4e, 0x1c55, 0x1c67) + endlist +}; + +u8 func1021_holo1_code4[] = { + label(0x8f) + unset_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI) + set_object_image(0x4b, 0, TVCMDLIST_12) + + holo1_code_thing_p1(0x4b, 0x4f, 0x0243) + + set_object_flag2(0x4b, OBJFLAG2_IMMUNETOANTI) + + // 0x1c55 = "LOOK UP - Press Down C Button to look up at the target." + // 0x1c68 = "Code 4 has been obtained." + holo1_code_thing_p2(0x4b, 0x4f, 0x1c55, 0x1c68) + endlist +}; + +u8 func0430_holo1_check_done[] = { + label(0x04) + yield + if_object_flag2(0x4c, OBJFLAG2_00040000, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x4d, OBJFLAG2_00040000, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x4e, OBJFLAG2_00040000, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x4f, OBJFLAG2_00040000, /*goto*/ 0x2f) + goto_next(0x06) + + // All flags are set + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_106) // "Holoprogram 1 has been completed successfully." + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + + label(0x06) + + beginloop(0x57) + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, FALSE, /*goto*/ 0x2f) + endloop(0x57) + + label(0x2f) + return + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_holo2_main[] = { + label(0x80) + disable_object(0x54) + disable_object(0x55) + disable_object(0x56) + disable_object(0x57) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + restart_timer + + beginloop(0x13) + if_timer_gt(30, /*goto*/ 0x2f) + endloop(0x13) + + label(0x2f) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_object_flag2(0x54, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x55, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x56, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x57, OBJFLAG2_IMMUNETOANTI) + set_object_image(0x54, 0, TVCMDLIST_14) + set_object_image(0x55, 0, TVCMDLIST_14) + set_object_image(0x56, 0, TVCMDLIST_14) + set_object_image(0x57, 0, TVCMDLIST_14) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + enable_object(0x54) + enable_object(0x55) + enable_object(0x56) + enable_object(0x57) + disable_chr(0x04) + label(0x2f) + label(0x91) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_099) // "Activate all of the wall switches. - Be quick, as they will quickly reset." + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x90) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO2_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + remove_hudmsgs + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + disable_object(0x54) + disable_object(0x55) + disable_object(0x56) + disable_object(0x57) + enable_object(0x45) + restart_timer + + beginloop(0x09) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + remove_hudmsgs + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define holo2_do_thing(object, function) \ + restart_timer \ + beginloop(0x04) \ + if_chr_activated_object(CHR_ANY, object, /*goto*/ 0x2f) \ + if_object_flag2(object, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x06) \ + reloop(0x04) \ + \ + label(0x06) \ + if_timer_gt(300, /*goto*/ 0x06) \ + reloop(0x04) \ + \ + label(0x06) \ + set_object_image(object, 0, TVCMDLIST_14) \ + unset_object_flag2(object, OBJFLAG2_IMMUNETOANTI) \ + endloop(0x04) \ + \ + label(0x2f) \ + assign_sound(SFX_043A, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, object, TRUE) \ + set_object_image(object, 0, TVCMDLIST_13) \ + set_object_flag2(object, OBJFLAG2_IMMUNETOANTI) \ + set_returnlist(CHR_SELF, function) \ + set_ailist(CHR_SELF, 0x041b) + +u8 func1023_holo2_object1[] = { + holo2_do_thing(0x54, 0x0431) + endlist +}; + +u8 func1024_holo2_object2[] = { + holo2_do_thing(0x55, 0x0432) + endlist +}; + +u8 func1025_holo2_object3[] = { + holo2_do_thing(0x56, 0x0433) + endlist +}; + +u8 func1026_holo2_object4[] = { + holo2_do_thing(0x57, 0x0434) + endlist +}; + +u8 func041b_holo2_part1[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x04) + endloop(0x8f) + + label(0x04) + yield + if_object_flag2(0x54, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x55, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x56, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x57, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_087) // "Holoprogram 2 has been completed successfully." + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + label(0x06) + return + endlist +}; + +u8 func042f_holo2_part2[] = { + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x04) + endloop(0x08) + + beginloop(0x04) + if_within_targets_fovx_by_angle(20, /*goto*/ 0x06) + goto_next(0x2f) + + label(0x06) + endloop(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x09) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + set_stage_flag(STAGEFLAG_HOLO_FAILED) + restart_timer + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_105) // "Training failed - you must face forward." + set_ailist(CHR_SELF, GAILIST_IDLE) + set_object_image(0x54, 0, TVCMDLIST_12) + set_object_image(0x55, 0, TVCMDLIST_12) + set_object_image(0x56, 0, TVCMDLIST_12) + set_object_image(0x57, 0, TVCMDLIST_12) + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_IN_HOLO2, FALSE, /*goto*/ 0x2f) + endloop(0x09) + + label(0x2f) + goto_first(0x08) + + endlist +}; + +u8 func1027_holo3_main[] = { + label(0x80) + disable_object(0x58) + disable_object(0x59) + disable_object(0x5a) + disable_object(0x5b) + disable_object(0x5c) + disable_object(0x5d) + disable_object(0x5e) + disable_object(0x5f) + disable_object(0x60) + disable_object(0x61) + disable_object(0x62) + disable_object(0x63) + disable_object(0x64) + disable_object(0x73) + disable_object(0x74) + disable_object(0x65) + disable_object(0x66) + disable_object(0x67) + disable_object(0x68) + disable_object(0x69) + disable_object(0x6a) + disable_object(0x6b) + disable_object(0x6c) + disable_object(0x6d) + disable_object(0x6e) + disable_object(0x6f) + disable_object(0x70) + disable_object(0x71) + disable_object(0x72) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + restart_timer + + beginloop(0x13) + if_timer_gt(30, /*goto*/ 0x2f) + endloop(0x13) + + label(0x2f) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_object_flag2(0x65, OBJFLAG2_IMMUNETOANTI) + unset_object_flag2(0x66, OBJFLAG2_IMMUNETOANTI) + set_object_image(0x65, 0, TVCMDLIST_14) + set_object_image(0x66, 0, TVCMDLIST_14) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + enable_object(0x58) + enable_object(0x59) + enable_object(0x5a) + enable_object(0x5b) + enable_object(0x5c) + enable_object(0x5d) + enable_object(0x5e) + enable_object(0x5f) + enable_object(0x60) + enable_object(0x61) + enable_object(0x62) + enable_object(0x63) + enable_object(0x64) + enable_object(0x73) + enable_object(0x74) + enable_object(0x65) + enable_object(0x66) + enable_object(0x67) + enable_object(0x68) + enable_object(0x69) + enable_object(0x6a) + enable_object(0x6b) + enable_object(0x6c) + enable_object(0x6d) + enable_object(0x6e) + enable_object(0x6f) + enable_object(0x70) + enable_object(0x71) + enable_object(0x72) + disable_chr(0x04) + open_door(0x67) + open_door(0x68) + open_door(0x69) + open_door(0x6a) + open_door(0x6b) + open_door(0x6c) + open_door(0x6d) + open_door(0x6e) + open_door(0x6f) + open_door(0x70) + open_door(0x71) + open_door(0x72) + yield + close_door(0x67) + close_door(0x68) + close_door(0x69) + close_door(0x6a) + close_door(0x6b) + close_door(0x6c) + close_door(0x6d) + close_door(0x6e) + close_door(0x6f) + close_door(0x70) + close_door(0x71) + close_door(0x72) + label(0x2f) + label(0x91) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_098) // "Activate all the switches." + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO3_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + disable_object(0x58) + disable_object(0x59) + disable_object(0x5a) + disable_object(0x5b) + disable_object(0x5c) + disable_object(0x5d) + disable_object(0x5e) + disable_object(0x5f) + disable_object(0x60) + disable_object(0x61) + disable_object(0x62) + disable_object(0x63) + disable_object(0x64) + disable_object(0x73) + disable_object(0x74) + disable_object(0x65) + disable_object(0x66) + disable_object(0x67) + disable_object(0x68) + disable_object(0x69) + disable_object(0x6a) + disable_object(0x6b) + disable_object(0x6c) + disable_object(0x6d) + disable_object(0x6e) + disable_object(0x6f) + disable_object(0x70) + disable_object(0x71) + disable_object(0x72) + enable_object(0x45) + restart_timer + + beginloop(0x09) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + remove_hudmsgs + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102a_holo3_part1[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 300, PAD_DISH_0123, /*goto*/ 0x09) + endloop(0x04) + + label(0x09) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_095) // "DUCK - Hold R Button, then press Down C Button to duck." + restart_timer + + beginloop(0x0a) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + goto_first(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102b_holo3_part2[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_chr_distance_to_pad_lt(CHR_BOND, 300, PAD_DISH_0124, /*goto*/ 0x09) + endloop(0x04) + + label(0x09) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_096) // "CROUCH - When ducking, hold R Button, then press Down C Button to duck." + restart_timer + + beginloop(0x0a) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + goto_first(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102c_holo3_object1[] = { + beginloop(0x04) + if_chr_activated_object(CHR_ANY, 0x65, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, 0x65, TRUE) + set_object_image(0x65, 0, TVCMDLIST_13) + set_object_flag2(0x65, OBJFLAG2_IMMUNETOANTI) + set_returnlist(CHR_SELF, AILIST_HOLO3_OBJECT1) + set_ailist(CHR_SELF, AILIST_HOLO3_CHECK_DONE) + endlist +}; + +u8 func102d_holo3_object2[] = { + beginloop(0x04) + if_chr_activated_object(CHR_ANY, 0x66, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, 0x65, TRUE) + set_object_image(0x66, 0, TVCMDLIST_13) + set_object_flag2(0x66, OBJFLAG2_IMMUNETOANTI) + set_returnlist(CHR_SELF, AILIST_HOLO3_OBJECT2) + set_ailist(CHR_SELF, AILIST_HOLO3_CHECK_DONE) + endlist +}; + +u8 func041c_holo3_check_done[] = { + label(0x04) + yield + if_object_flag2(0x65, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_object_flag2(0x66, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_097) // "Holoprogram 3 has been completed successfully." + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + label(0x06) + return + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1028_holo4_main[] = { + label(0x80) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + disable_chr(0x04) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0274, AILIST_HOLO4_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x08) + label(0x08) + label(0x91) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) + remove_hudmsgs + if_chr_has_chrflag(0x0d, CHRCFLAG_00000040, /*goto*/ 0x61) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_107) // "Unarmed combat - knock out the target. - Press Z Button repeatedly to punch." + goto_next(0x2f) + + label(0x61) + if_chr_has_chrflag(0x0e, CHRCFLAG_00000040, /*goto*/ 0x62) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_108) // "Now try against a moving target..." + goto_next(0x2f) + + label(0x62) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_109) // "And finally against a target that fights back." + goto_next(0x2f) + + label(0x2f) + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO4_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + label(0x84) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + remove_chr(0x0d) + remove_chr(0x0e) + remove_chr(0x0f) + enable_object(0x45) + label(0x06) + remove_hudmsgs + + beginloop(0x6d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO4, FALSE, /*goto*/ 0x2f) + endloop(0x6d) + + label(0x2f) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0403_holo4_guard1[] = { + set_chr_id(0x0d) + set_shotlist(AILIST_HOLO4_GUARD1) + + beginloop(0x04) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + set_self_chrflag(CHRCFLAG_00000040) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0277, AILIST_HOLO4_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x08) + label(0x08) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_108) // "Now try against a moving target..." + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0404_holo4_guard2[] = { + set_chr_id(0x0e) + set_shotlist(AILIST_HOLO4_GUARD2) + label(0x04) + yield + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + set_self_chrflag(CHRCFLAG_00000040) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_027A, AILIST_HOLO4_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x0a) + label(0x0a) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_109) // "And finally against a target that fights back." + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x06) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + + beginloop(0x08) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + restart_timer + retreat(GOPOSFLAG_RUN, 1) + + beginloop(0x09) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x04) + + endlist +}; + +u8 func0405_holo4_guard3[] = { + set_chr_id(0x0f) + set_shotlist(AILIST_HOLO4_GUARD3) + restart_timer + + beginloop(0x04) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func1033_holo4_part1[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x57) + if_chr_deadish(0x0d, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x57) + if_chr_deadish(0x0e, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x57) + if_chr_deadish(0x0f, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + restart_timer + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_088) // "Holoprogram 4 has been completed successfully." + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + + beginloop(0x57) + if_stage_flag_eq(STAGEFLAG_IN_HOLO4, FALSE, /*goto*/ 0x2f) + endloop(0x57) + + label(0x2f) + goto_first(0x8f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1029_holo5_main[] = { + label(0x80) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + disable_chr(0x04) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0126, AILIST_HOLO5_INIT_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x06) + label(0x06) + yield + label(0x91) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) + remove_hudmsgs + if_chr_has_chrflag(0x10, CHRCFLAG_00000040, /*goto*/ 0x61) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_092) // "Disarm this live target if you can." + goto_next(0x2f) + + label(0x61) + if_chr_has_chrflag(0x11, CHRCFLAG_00000040, /*goto*/ 0x62) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_093) // "Knock out this target - stealth is the key." + goto_next(0x2f) + + label(0x62) + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_094) // "And the final guard..." + goto_next(0x2f) + + label(0x2f) + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x2f) + goto_first(0x82) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO5_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + remove_chr(0x10) + remove_chr(0x11) + remove_chr(0x12) + enable_object(0x45) + remove_hudmsgs + + beginloop(0x6d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO5, FALSE, /*goto*/ 0x2f) + endloop(0x6d) + + label(0x2f) + goto_first(0x08) + + endlist +}; + +u8 func0406_holo5_init_guard1[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_alertness(100) +#endif + set_chr_id(0x10) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x40000000, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO5_GUARD1) + endlist +}; + +u8 func0407_holo5_guard1[] = { + set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) + set_shotlist(AILIST_HOLO5_GUARD1) + set_chr_maxdamage(CHR_SELF, 300) + add_health_or_armor(300) + label(0x04) + yield + label(0x2f) + if_chr_deadish(CHR_SELF, /*goto*/ 0x30) + if_has_gun(CHR_SELF, /*goto*/ 0x06) + label(0x2f) +#if VERSION >= VERSION_NTSC_1_0 + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) +#else + set_alertness(100) +#endif + set_self_chrflag(CHRCFLAG_00000040) + set_shotlist(GAILIST_IDLE) + goto_next(0x0a) + label(0x30) + restart_timer + set_self_chrflag(CHRCFLAG_INVINCIBLE) + + beginloop(0x62) + if_timer_gt(60, /*goto*/ 0x63) + endloop(0x62) + + label(0x63) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x0a) + set_self_chrflag(CHRCFLAG_00000040) +#if VERSION >= VERSION_NTSC_1_0 + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) +#else + set_alertness(100) +#endif + surrender + show_hudmsg(CHR_BOND, L_DISH_090) // "Guard has been successfully disarmed." + + beginloop(0x59) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0272, AILIST_HOLO5_INIT_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2f) + endloop(0x59) + + label(0x2f) + set_shotlist(GAILIST_IDLE) + + beginloop(0x0b) + endloop(0x0b) + + label(0x06) + if_distance_to_target_lt(300, /*goto*/ 0x2f) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + + beginloop(0x08) + if_distance_to_target_lt(300, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + restart_timer + retreat(GOPOSFLAG_RUN, 1) + + beginloop(0x09) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x04) + + endlist +}; + +u8 func0408_holo5_init_guard2[] = { + set_chr_maxdamage(CHR_SELF, 200) + set_alertness(100) + set_chr_id(0x11) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x40000000, /*goto*/ 0x06) + label(0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_093) // "Knock out this target - stealth is the key." + set_ailist(CHR_SELF, AILIST_HOLO5_GUARD2) + endlist +}; + +u8 func0409_holo5_guard2[] = { + set_shotlist(AILIST_HOLO5_GUARD2) + label(0x04) + yield + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + restart_timer + assign_path(0) + start_patrol + label(0x08) + yield + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + if_target_in_sight(/*goto*/ 0x09) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_alertness(0) + goto_first(0x08) + + label(0x06) + label(0x09) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) + + beginloop(0x0a) + if_can_see_target(/*goto*/ 0x06) + goto_first(0x04) + + label(0x06) + endloop(0x0a) + + label(0x2f) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_00000040) + + beginloop(0x57) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0125, AILIST_HOLO5_INIT_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040a_holo5_init_guard3[] = { + set_reaction_speed(100) + set_chr_id(0x12) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x40000000, /*goto*/ 0x06) + label(0x06) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_094) // "And the final guard..." + set_alertness(100) + set_ailist(CHR_SELF, AILIST_HOLO5_GUARD3) + endlist +}; + +u8 func040b_holo5_guard3[] = { + set_shotlist(AILIST_HOLO_GUARD_ARMED_UNALERT) + restart_timer + + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) + + beginloop(0x04) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + restart_timer + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_089) // "Holoprogram 5 has been completed successfully." + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1034_holo5_part1[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x2f) + endloop(0x8f) + + label(0x2f) + yield + yield + yield + yield + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_has_flag_bankx(0x10, CHRFLAG0_00008000, BANK_0, /*goto*/ 0x2f) + label(0x06) + endloop(0x04) + + label(0x2f) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x11, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x12, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + restart_timer + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_089) // "Holoprogram 5 has been completed successfully." + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO5, FALSE, /*goto*/ 0x2f) + endloop(0x0d) + + label(0x2f) + goto_first(0x8f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102e_holo6_main[] = { + label(0x80) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + disable_chr(0x04) + + beginloop(0x57) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0127, AILIST_HOLO6_INIT_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x59) + endloop(0x57) + + beginloop(0x59) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0128, AILIST_HOLO6_INIT_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5b) + endloop(0x59) + + beginloop(0x5b) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0129, AILIST_HOLO6_INIT_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5c) + endloop(0x5b) + + beginloop(0x5c) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012A, AILIST_HOLO6_INIT_GUARD4, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5d) + endloop(0x5c) + + label(0x5d) + label(0x2f) + label(0x91) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_110) // "Defeat all enemies without getting hit." + label(0x2f) + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO6_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + remove_chr(0x13) + remove_chr(0x14) + remove_chr(0x15) + remove_chr(0x16) + enable_object(0x45) + label(0x06) + remove_hudmsgs + + beginloop(0x6d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO6, FALSE, /*goto*/ 0x2f) + endloop(0x6d) + + label(0x2f) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_holo6_init_guard1[] = { + set_chr_id(0x13) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func040d_holo6_init_guard2[] = { + set_chr_id(0x14) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func040e_holo6_init_guard3[] = { + set_chr_id(0x15) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func040f_holo6_init_guard4[] = { + set_chr_id(0x16) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func0415_holo_guard_unarmed_unalert[] = { + set_alertness(100) + set_chr_maxdamage(CHR_SELF, 100) + yield + yield + yield + rebuild_teams + rebuild_squadrons + yield + yield + yield + yield + set_action(MA_NORMAL, FALSE) + set_shotlist(AILIST_HOLO_GUARD_UNARMED_ALERT) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x04) + if_within_targets_fovx_by_angle(40, /*goto*/ 0x04) + endloop(0x08) + + beginloop(0x04) + if_distance_to_target_lt(500, /*goto*/ 0x06) + call_rng + if_rand_lt(1, /*goto*/ 0x06) + label(0x2f) + endloop(0x04) + + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) + endlist +}; + +u8 func0416_holo_guard_unarmed_alert[] = { + set_shotlist(AILIST_HOLO_GUARD_UNARMED_ALERT) + set_action(MA_UNARMEDATTACK, FALSE) + if_chr_injured_target(CHR_SELF, /*goto*/ 0x09) + label(0x8f) + restart_timer + try_run_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x06) + if_distance_to_target_lt(300, /*goto*/ 0x2f) + if_timer_gt(15, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + goto_first(0x8f) + + label(0x2f) + set_returnlist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT2) + + label(0x09) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0a) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + set_stage_flag(STAGEFLAG_HOLO_FAILED) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_111) // "Training failed - you have been hit." + restart_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x5e) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) + if_timer_gt(180, /*goto*/ 0x2f) + endloop(0x5e) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0416_holo_guard_unarmed_alert2[] = { + set_action(MA_UNARMEDATTACK, FALSE) + restart_timer + + beginloop(0x04) + if_chr_dead(CHR_TARGET, /*goto*/ 0x57) + if_chr_knockedout(CHR_TARGET, /*goto*/ 0x57) + if_distance_to_target_gt(100, /*goto*/ 0x2f) + if_can_see_attack_target(/*goto*/ 0x2f) + if_timer_gt(120, /*goto*/ 0x10) + endloop(0x04) + + label(0x2f) + if_distance_to_target_gt(400, /*goto*/ 0x10) + if_distance_to_target_lt(100, /*goto*/ 0x06) + restart_timer + try_run_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_chr_dead(CHR_TARGET, /*goto*/ 0x57) + if_chr_knockedout(CHR_TARGET, /*goto*/ 0x57) + if_timer_gt(20, /*goto*/ 0x10) + if_chr_stopped(/*goto*/ 0x10) + if_target_is_player(/*goto*/ 0x0e) + label(0x0e) + if_distance_to_target_gt(400, /*goto*/ 0x10) + if_distance_to_target_lt(100, /*goto*/ 0x06) + endloop(0x08) + + label(0x2f) + restart_timer + goto_first(0x04) + + label(0x06) + restart_timer + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_chr_dead(CHR_TARGET, /*goto*/ 0x57) + if_chr_knockedout(CHR_TARGET, /*goto*/ 0x57) + if_distance_to_target_gt(400, /*goto*/ 0x10) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x2f) + restart_timer + goto_first(0x04) + + label(0x06) + try_punch_or_kick(/*goto*/ 0x2f) + restart_timer + goto_first(0x04) + + label(0x2f) + + beginloop(0x0a) + if_timer_gt(180, /*goto*/ 0x06) + if_chr_injured_target(CHR_SELF, /*goto*/ 0x2f) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + if_chr_injured_target(CHR_SELF, /*goto*/ 0x2f) + say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) + goto_next(0x06) + + label(0x2f) + say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0f) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + set_stage_flag(STAGEFLAG_HOLO_FAILED) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_111) // "Training failed - you have been hit." + restart_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x5e) + if_timer_gt(180, /*goto*/ 0x2f) + endloop(0x5e) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + label(0x57) + label(0x10) + return + endlist +}; + +u8 func041a_handle_holo_failure[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_HOLO_FAILED, TRUE, /*goto*/ 0x2f) + endloop(0x8f) + + label(0x2f) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) + if_timer_gt(180, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + label(0x09) + unset_stage_flag(STAGEFLAG_HOLO_FAILED) + goto_first(0x8f) + + endlist +}; + +u8 func102f_holo1_part1[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x13, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x14, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x15, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x16, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_112) // "Holoprogram 6 has been completed successfully." + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO6, FALSE, /*goto*/ 0x2f) + endloop(0x0d) + + label(0x2f) + goto_first(0x8f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1030_holo7_main[] = { + label(0x80) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x81) + endloop(0x08) + + label(0x81) + set_stage_flag(STAGEFLAG_CONSIDER_WARP) + lock_door(0x75, 0x40) + lock_door(0x76, 0x40) + close_door(0x75) + unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) + label(0x2f) + unset_stage_flag(STAGEFLAG_HOLO_ABORTING) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + disable_object(0x45) + disable_chr(0x04) + + beginloop(0x57) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012B, AILIST_HOLO7_INIT_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x59) + endloop(0x57) + + beginloop(0x59) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012C, AILIST_HOLO7_INIT_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5b) + endloop(0x59) + + beginloop(0x5b) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012D, AILIST_HOLO7_INIT_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5c) + endloop(0x5b) + + beginloop(0x5c) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012E, AILIST_HOLO7_INIT_GUARD4, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5d) + endloop(0x5c) + + beginloop(0x5d) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012F, AILIST_HOLO7_INIT_GUARD5, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5e) + endloop(0x5d) + + label(0x5e) + label(0x2f) + label(0x91) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_110) // "Defeat all enemies without getting hit." + label(0x2f) + restart_timer + + beginloop(0x82) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) + if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) + if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) + goto_next(0x59) + + label(0x57) + set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) + label(0x59) + if_timer_gt(1200, /*goto*/ 0x2f) + endloop(0x82) + + label(0x2f) + goto_first(0x91) + + label(0x85) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + goto_next(0x84) + + label(0x83) + set_savefile_flag(GAMEFILEFLAG_CI_HOLO7_DONE) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + yield + goto_next(0x84) + + label(0x84) + label(0x90) +#if VERSION >= VERSION_NTSC_1_0 + set_stage_flag(STAGEFLAG_CONSIDER_WARP) +#endif + unlock_door(0x75, 0x40) + unlock_door(0x76, 0x40) + remove_hudmsgs + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + enable_chr(0x04) + remove_chr(0x19) + remove_chr(0x1a) + remove_chr(0x1b) + remove_chr(0x17) + remove_chr(0x18) + enable_object(0x45) + remove_hudmsgs + + beginloop(0x6d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO7, FALSE, /*goto*/ 0x2f) + endloop(0x6d) + + label(0x2f) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_holo7_init_guard1[] = { + set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) + set_chr_id(0x19) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) + endlist +}; + +u8 func0413_holo7_init_guard2[] = { + set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) + set_chr_id(0x1a) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) + endlist +}; + +u8 func0414_holo7_init_guard3[] = { + set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) + set_chr_id(0x1b) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) + endlist +}; + +u8 func0410_holo7_init_guard4[] = { + set_chr_id(0x17) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func0411_holo7_init_guard5[] = { + set_chr_id(0x18) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) + endlist +}; + +u8 func0418_holo_guard_armed_unalert[] = { + set_accuracy(50) + set_reaction_speed(20) + set_chr_maxdamage(CHR_SELF, 40) + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_action(MA_NORMAL, FALSE) + set_shotlist(AILIST_HOLO_GUARD_UNARMED_ALERT) + restart_timer + + beginloop(0x04) + if_distance_to_target_lt(500, /*goto*/ 0x06) + if_timer_gt(300, /*goto*/ 0x2f) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x06) + endloop(0x04) + + label(0x2f) + call_rng + goto_next(0x06) + + label(0x2f) + goto_first(0x04) + + label(0x06) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_ALERT) + endlist +}; + +u8 func0419_holo_guard_armed_alert[] = { + set_shotlist(AILIST_HOLO_GUARD_ARMED_ALERT) + if_has_gun(CHR_SELF, /*goto*/ 0x2f) + increase_squadron_alertness(100) + set_returnlist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) + set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) + label(0x2f) + label(0x8f) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) + + beginloop(0x04) + if_can_see_attack_target(/*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + + beginloop(0x08) + if_chr_injured_target(CHR_SELF, /*goto*/ 0x2f) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + goto_first(0x8f) + + say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) + label(0x2f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + set_stage_flag(STAGEFLAG_HOLO_FAILED) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_111) // "Training failed - you have been hit." + restart_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x5e) + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) + if_timer_gt(180, /*goto*/ 0x2f) + endloop(0x5e) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1031_holo7_part1[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x04) + endloop(0x8f) + + beginloop(0x04) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x19, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x1a, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x1b, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x17, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + yield + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + if_chr_deadish(0x18, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) + remove_hudmsgs + show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_113) // "Holoprogram 7 has been completed successfully." + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_IN_HOLO7, FALSE, /*goto*/ 0x2f) + endloop(0x0d) + + label(0x2f) + goto_first(0x8f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1035_manage_music[] = { + beginloop(0x8f) + if_stage_flag_eq(STAGEFLAG_IN_TRAINING, TRUE, /*goto*/ 0x2f) + reloop(0x8f) + + label(0x2f) + play_track_isolated(MUSIC_CI_TRAINING) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_IN_TRAINING, FALSE, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + play_default_tracks + stop_ambient_track + endloop(0x8f) + + endlist +}; + +u8 func1000_jo_typing[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + camera_movement(ANIM_CUT_DISH_INTRO_CAM) + cmd0175(60) + if_controller_button_pressed(/*goto*/ 0x7b) + play_cutscene_track(MUSIC_CI_INTRO) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DISH_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + + beginloop(0x57) + if_controller_button_pressed(/*goto*/ 0x7b) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + play_sound(SFX_8116, CHANNEL_5) + + beginloop(0x59) + if_controller_button_pressed(/*goto*/ 0x7b) + if_timer_gt(175, /*goto*/ 0x06) + endloop(0x59) + + label(0x06) + play_sound(SFX_TYPING_8118, CHANNEL_6) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2f) + goto_next(0x7b) + + label(0x2f) + if_controller_button_pressed(/*goto*/ 0x7b) + label(0x2f) + endloop(0x08) + + label(0x7b) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_DISH_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + enter_firstperson + passive_mode(TRUE) + fade_to_color(0x00000000, 0) + yield + yield + yield + yield + stop_cutscene_track + stop_ambient_track + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1040_lift_door_sounds[] = { + // Disable autoguns + yield + set_autogun_target_team(0x8b, TEAM_ENEMY) + set_autogun_target_team(0x8c, TEAM_ENEMY) + set_autogun_target_team(0x8d, TEAM_ENEMY) + restart_timer + + beginloop(0x57) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x57) + + label(0x2f) + set_object_flag(0x8b, OBJFLAG_DEACTIVATED) + set_object_flag(0x8c, OBJFLAG_DEACTIVATED) + set_object_flag(0x8d, OBJFLAG_DEACTIVATED) + + // Play sounds when lift doors activated + beginloop(0x8f) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x80, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x81, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x82, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x83, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x84, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x85, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x86, /*goto*/ 0x2f) + if_chr_activated_object(CHR_P1P2, 0x87, /*goto*/ 0x2f) + reloop(0x8f) + + label(0x2f) + play_sound(SFX_DOOR_81B0, -1) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + endloop(0x8f) + + endlist +}; + +s32 intro[] = { + spawn(PAD_DISH_00F5) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + PAD_DISH_002F, + PAD_DISH_002D, + -1, +}; + +u8 func1032_setup_lifts[] = { + activate_lift(1, 0x43) + activate_lift(2, 0x44) + set_lights_state(0x0007, LIGHTOP_1, 0x32, 0x00, 0x00) + set_lights_state(0x0008, LIGHTOP_1, 0x32, 0x00, 0x00) + set_lights_state(0x0009, LIGHTOP_1, 0x32, 0x00, 0x00) + set_lights_state(0x000a, LIGHTOP_1, 0x19, 0x00, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1042_check_jo_in_training_room[] = { + beginloop(0x04) + // Wait until player in training +#if VERSION >= VERSION_NTSC_1_0 +#endif + if_stage_flag_eq(STAGEFLAG_TRIGGER_UPLINK, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_ECMMINE, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CAMSPY, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DOORDECODER, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_RTRACKER, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_XRAY, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x2f) + reloop(0x04) + + // And has exited the training rooms + // 0x0014 = lobby outside holo room + // 0x001d = entry to device training room + // 0x001a = entry to information room + // 0x000b = entry to carrington's office + label(0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x0014, /*goto*/ 0x30) + if_chr_in_room(CHR_BOND, 0x00, 0x001d, /*goto*/ 0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x001a, /*goto*/ 0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x000b, /*goto*/ 0x2f) + reloop(0x04) + + label(0x30) + set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) + label(0x2f) + set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 +#endif + yield + yield + yield + yield + + label(0x57) +#if VERSION >= VERSION_NTSC_1_0 +#endif + yield + if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, TRUE, /*goto*/ 0x2f) + goto_first(0x57) + + label(0x2f) + label(0x59) +#if VERSION >= VERSION_NTSC_1_0 +#endif + yield + if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, FALSE, /*goto*/ 0x2f) + goto_first(0x59) + + label(0x2f) +#if VERSION >= VERSION_NTSC_1_0 +#endif + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + endloop(0x04) + + // Unreachable + label(0x5b) + restart_timer + label(0x5c) +#if VERSION >= VERSION_NTSC_1_0 +#endif + yield + if_timer_gt(60, /*goto*/ 0x2f) + goto_first(0x5c) + label(0x2f) + goto_first(0x04) + + endlist +}; + +u8 func1041_setup_environment[] = { + yield + configure_environment(0x0045, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0055, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0056, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1043_remove_hovercrate[] = { + yield + beginloop(0x8f) + if_object_in_room(OBJ_HOVERCRATE, 0x0016, /*goto*/ 0x08) + if_object_in_room(OBJ_HOVERCRATE, 0x0017, /*goto*/ 0x08) + if_object_in_room(OBJ_HOVERCRATE, 0x0018, /*goto*/ 0x08) + if_object_in_room(OBJ_HOVERCRATE, 0x0019, /*goto*/ 0x08) + goto_first(0x8f) + + label(0x08) + if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x2f) + goto_first(0x8f) + + label(0x2f) + move_object_to_pad(OBJ_HOVERCRATE, PAD_DISH_0141) + endloop(0x8f) + + endlist +}; + +struct ailist ailists[] = { + { func0401_move_to_deviceroom, 0x0401 }, + { func0402_move_to_holoroom, 0x0402 }, + { func0403_holo4_guard1, 0x0403 }, + { func0404_holo4_guard2, 0x0404 }, + { func0405_holo4_guard3, 0x0405 }, + { func0406_holo5_init_guard1, 0x0406 }, + { func0407_holo5_guard1, 0x0407 }, + { func0408_holo5_init_guard2, 0x0408 }, + { func0409_holo5_guard2, 0x0409 }, + { func040a_holo5_init_guard3, 0x040a }, + { func040b_holo5_guard3, 0x040b }, + { func040c_holo6_init_guard1, 0x040c }, + { func040d_holo6_init_guard2, 0x040d }, + { func040e_holo6_init_guard3, 0x040e }, + { func040f_holo6_init_guard4, 0x040f }, + { func0410_holo7_init_guard4, 0x0410 }, + { func0411_holo7_init_guard5, 0x0411 }, + { func0412_holo7_init_guard1, 0x0412 }, + { func0413_holo7_init_guard2, 0x0413 }, + { func0414_holo7_init_guard3, 0x0414 }, + { func0415_holo_guard_unarmed_unalert, 0x0415 }, + { func0416_holo_guard_unarmed_alert, 0x0416 }, + { func0416_holo_guard_unarmed_alert2, 0x0417 }, + { func0418_holo_guard_armed_unalert, 0x0418 }, + { func0419_holo_guard_armed_alert, 0x0419 }, + { func041a_handle_holo_failure, 0x041a }, + { func041b_holo2_part1, 0x041b }, + { func041c_holo3_check_done, 0x041c }, + { func041d_init_collegue_when_sighted, 0x041d }, + { func041e_colleague, 0x041e }, + { func041f_colleague1, 0x041f }, + { func0420_colleague2, 0x0420 }, + { func0421_colleague3, 0x0421 }, + { func0422_colleague4, 0x0422 }, + { func0423_colleague5, 0x0423 }, + { func0424_colleague6, 0x0424 }, + { func0425_colleague7, 0x0425 }, + { func0426_colleague8, 0x0426 }, + { func0427_colleague9, 0x0427 }, + { func0428_colleague10, 0x0428 }, + { func0429_grimshaw_disguise, 0x0429 }, + { func042a_carrington_cloak, 0x042a }, + { func042b_init_carrington, 0x042b }, + { func042c_carrington_tour, 0x042c }, + { func042e_devicegirl_reply_to_carrington, 0x042e }, + { func042f_holo2_part2, 0x042f }, + { func0430_holo1_check_done, 0x0430 }, + { func1023_holo2_object1, 0x0431 }, + { func1024_holo2_object2, 0x0432 }, + { func1025_holo2_object3, 0x0433 }, + { func1026_holo2_object4, 0x0434 }, + { func102c_holo3_object1, 0x0435 }, + { func102d_holo3_object2, 0x0436 }, + { func101d_holo1_switch1, 0x0437 }, + { func101e_holo1_switch2, 0x0438 }, + { func101f_holo1_switch3, 0x0439 }, + { func1020_holo1_monitor_switches, 0x043a }, + { func1000_jo_typing, 0x1000 }, + { func1001_set_jo_team, 0x1001 }, + { func1002_devicetraining_camspy, 0x1002 }, + { func1003_devicetraining_nightvision, 0x1003 }, + { func1004_devicetraining_doordecoder, 0x1004 }, + { func1005_devicetraining_xray, 0x1005 }, + { func1006_devicetraining_disguise, 0x1006 }, + { func1007_devicetrainign_ir, 0x1007 }, + { func1008_devicetraining_rtracker, 0x1008 }, + { func1009_devicetraining_cloak, 0x1009 }, + { func100a_devicetraining_ecmmine, 0x100a }, + { func100b_devicetraining_uplink, 0x100b }, + { func100c_cloak_detection, 0x100c }, + { func100e_training_unlockables, 0x100e }, + { func1010_doorproxy, 0x1010 }, + { func1012_cloak_doorproxy, 0x1012 }, + { func1013_msg_hovercrate, 0x1013 }, + { func1014_msg_hoverbike, 0x1014 }, + { func1015_msg_doors, 0x1015 }, + { func1016_msg_elevators, 0x1016 }, + { func1017_msg_terminals, 0x1017 }, + { func1018_lightswitch, 0x1018 }, + { func1019_setup_carrington, 0x1019 }, + { func101a_move_jo_to_training_room, 0x101a }, + { func101b_ir_door, 0x101b }, + { func101c_holo1_main, 0x101c }, + { func101d_holo1_switch1, 0x101d }, + { func101e_holo1_switch2, 0x101e }, + { func101f_holo1_switch3, 0x101f }, + { func1020_holo1_monitor_switches, 0x1020 }, + { func1021_holo1_code1, 0x1021 }, + { func1022_holo2_main, 0x1022 }, + { func1023_holo2_object1, 0x1023 }, + { func1024_holo2_object2, 0x1024 }, + { func1025_holo2_object3, 0x1025 }, + { func1026_holo2_object4, 0x1026 }, + { func1027_holo3_main, 0x1027 }, + { func1028_holo4_main, 0x1028 }, + { func1029_holo5_main, 0x1029 }, + { func102a_holo3_part1, 0x102a }, + { func102b_holo3_part2, 0x102b }, + { func102c_holo3_object1, 0x102c }, + { func102d_holo3_object2, 0x102d }, + { func102e_holo6_main, 0x102e }, + { func102f_holo1_part1, 0x102f }, + { func1030_holo7_main, 0x1030 }, + { func1031_holo7_part1, 0x1031 }, + { func1032_setup_lifts, 0x1032 }, + { func1033_holo4_part1, 0x1033 }, + { func1034_holo5_part1, 0x1034 }, + { func1035_manage_music, 0x1035 }, + { func041a_handle_holo_failure, 0x1037 }, + { func1040_lift_door_sounds, 0x1040 }, + { func1041_setup_environment, 0x1041 }, + { func1042_check_jo_in_training_room, 0x1042 }, + { func1043_remove_hovercrate, 0x1043 }, + { func1021_holo1_code2, 0x1044 }, + { func1021_holo1_code3, 0x1045 }, + { func1021_holo1_code4, 0x1046 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, PATHFLAG_CIRCULAR }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupear.c b/src/ailists/setupear.c new file mode 100644 index 000000000..6a6852da2 --- /dev/null +++ b/src/ailists/setupear.c @@ -0,0 +1,3394 @@ +// +// Investigation +// + +#include "stagesetup.h" + +// Characters +#define CHR_DRCAROLL 0x39 +#define CHR_INTRO_GUARD 0x3a +#define CHR_K7_GUARD 0x3b + +// Objects +#define OBJ_CACHETERMINAL 0x01 +#define OBJ_BOT_ACTIVATION_TERMINAL 0x02 +#define OBJ_BOT_PROGRAMMING_TERMINAL 0x03 +#define OBJ_K7AVENGER 0x04 +#define OBJ_NIGHTVISION 0x05 +#define OBJ_SHIELD 0x06 +#define OBJ_GOODTERM1 0x07 +#define OBJ_GOODTERM2 0x08 +#define OBJ_GOODTERM3 0x09 +#define OBJ_UPLINKPC 0x0a +#define OBJ_ALARMTERM1 0x0f +#define OBJ_ALARMTERM2 0x14 +#define OBJ_ALARMTERM3 0x19 +#define OBJ_UPLINKDOOR 0x22 +#define OBJ_DATAUPLINK_BOND 0x25 +#define OBJ_YELLOWBOT 0x37 // opens the secret door +#define OBJ_PURPLEBOT 0x38 // lasers +#define OBJ_HATCHPC 0x3a +#define OBJ_DATAUPLINK_COOP 0x48 +#define OBJ_CACHEDOOR1 0x55 +#define OBJ_CACHEDOOR2 0x56 +#define OBJ_CMP150_1 0x57 +#define OBJ_CMP150_2 0x58 +#define OBJ_PROXYMINES 0x59 + +// Stage flags +#define STAGEFLAG_DRCAROLL_LOCATED 0x00000001 +#define STAGEFLAG_UPLINK_SEARCHING 0x00000002 +#define STAGEFLAG_00000004 0x00000004 +#define STAGEFLAG_00000008 0x00000008 +#define STAGEFLAG_TRIGGER_OUTRO_AUDIO 0x00000010 +#define STAGEFLAG_HAS_K7AVENGER 0x00000020 +#define STAGEFLAG_HAS_NIGHTVISION 0x00000040 +#define STAGEFLAG_HAS_SHIELD 0x00000080 +#define STAGEFLAG_ITEMS_UNCOLLECTABLE 0x00000100 +#define STAGEFLAG_BOT_ACTIVE 0x00000200 +#define STAGEFLAG_BOT_REPROGRAMMED 0x00000400 +#define STAGEFLAG_ALL_ITEMS_COLLECTED 0x00000800 +#define STAGEFLAG_UNACCEPTABLE_CASUALTIES 0x00001000 +#define STAGEFLAG_CAMSPY_DESTROYED 0x00002000 +#define STAGEFLAG_SHUT_DOWN_EXPERIMENT1 0x00004000 +#define STAGEFLAG_SHUT_DOWN_EXPERIMENT2 0x00008000 +#define STAGEFLAG_SHUT_DOWN_EXPERIMENT3 0x00010000 +#define STAGEFLAG_UPLINK_FINISHED 0x00020000 +#define STAGEFLAG_BOT_ACTIVE_MAINTENANCE 0x00040000 +#define STAGEFLAG_BOT_ACTIVATION_TERMINAL_DESTROYED 0x00080000 +#define STAGEFLAG_BOT_PROGRAMMING_TERMINAL_DESTROYED 0x00100000 +#define STAGEFLAG_ONE_SCIENTIST_DONE 0x00200000 +#define STAGEFLAG_TWO_SCIENTISTS_DONE 0x00400000 +#define STAGEFLAG_THREE_SCIENTISTS_DONE 0x00800000 +#define STAGEFLAG_ALARM1_ACTIVE 0x01000000 +#define STAGEFLAG_ALARM2_ACTIVE 0x02000000 +#define STAGEFLAG_ALARM3_ACTIVE 0x04000000 +#define STAGEFLAG_ALARM_RESPONDERS_SPAWNED 0x08000000 +#define STAGEFLAG_UPLINKPC_DESTROYED 0x10000000 +#define STAGEFLAG_BOT_ACTIVE_CLEANING 0x20000000 +#define STAGEFLAG_BOT_ACTIVE_NOPROGRAM 0x40000000 +#define STAGEFLAG_GOODTERM_DESTROYED 0x80000000 + +// AI Lists +#define AILIST_K7_GUARD 0x0402 +#define AILIST_K7_SCIENTIST 0x0403 +#define AILIST_SCIENTIST 0x0404 +#define AILIST_INIT_SCIENTIST 0x0405 +#define AILIST_NASTY_SCIENTIST 0x0406 +#define AILIST_INIT_NASTY_SCIENTIST 0x0407 +#define AILIST_ALARM_RESPONDER 0x0408 +#define AILIST_UPLINK_RESPONDER 0x0409 +#define AILIST_INIT_BASIC_GUARD 0x040a +#define AILIST_INIT_SHOCK_GUARD 0x040b +#define AILIST_PATH00 0x040c +#define AILIST_PATH01 0x040d // unused +#define AILIST_PATH02 0x040e +#define AILIST_PATH03 0x040f +#define AILIST_PATH04 0x0410 // unused +#define AILIST_PURPLEBOT_AT_LASERS 0x0413 +#define AILIST_RADIOACTIVITY 0x0415 +#define AILIST_OUTRO 0x0417 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_EAR_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_EAR_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_EAR_002) + briefing(BRIEFINGTYPE_TEXT_A, L_EAR_003) + + beginobjective(0, L_EAR_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Holograph radioactive isotope" + require_object_holographed(0x39) + fail_flags(STAGEFLAG_CAMSPY_DESTROYED) + endobjective + + beginobjective(1, L_EAR_011, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Start security maintenance cycle" + complete_flags(STAGEFLAG_BOT_ACTIVE_MAINTENANCE) + fail_flags(STAGEFLAG_BOT_ACTIVATION_TERMINAL_DESTROYED) + fail_flags(STAGEFLAG_BOT_PROGRAMMING_TERMINAL_DESTROYED) + endobjective + + beginobjective(2, L_EAR_010, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Shut down experiments" + complete_flags(STAGEFLAG_SHUT_DOWN_EXPERIMENT1) + complete_flags(STAGEFLAG_SHUT_DOWN_EXPERIMENT2) + complete_flags(STAGEFLAG_SHUT_DOWN_EXPERIMENT3) + fail_flags(STAGEFLAG_GOODTERM_DESTROYED) + fail_flags(STAGEFLAG_UNACCEPTABLE_CASUALTIES) + fail_flags(STAGEFLAG_00000008) + endobjective + + beginobjective(3, L_EAR_012, (DIFFBIT_PA | DIFFBIT_PD)) // "Obtain experimental technologies" + complete_flags(STAGEFLAG_ALL_ITEMS_COLLECTED) + require_object_collected(OBJ_K7AVENGER) + require_object_collected(OBJ_NIGHTVISION) + require_object_collected(OBJ_SHIELD) + endobjective + + beginobjective(4, L_EAR_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate Dr. Caroll" + complete_flags(STAGEFLAG_DRCAROLL_LOCATED) + fail_flags(STAGEFLAG_UPLINKPC_DESTROYED) + endobjective + + tag(0x60, 1) + lift(0x0100, MODEL_LIFT_PLATFORM, PAD_EAR_025B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x025b, 0x025c, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000b6, 0x0010aaaa, 0x15000000) + door(0x0100, MODEL_DD_ACCESSDOORUP, PAD_EAR_019B, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_DD_ACCESSDOORDN, PAD_EAR_019C, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_ACCESSDOORUP, PAD_EAR_019D, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_DD_ACCESSDOORDN, PAD_EAR_019E, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_ACCESSDOORUP, PAD_EAR_019F, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_DD_ACCESSDOORDN, PAD_EAR_01A0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_015A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_015B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_015C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + tag(0x27, 1) + door(0x0100, MODEL_DD_LAB_DOOR_SEC, PAD_EAR_015D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000004, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + tag(0x24, 2) + tag(0x40, 2) + door(0x0100, MODEL_DOOR4A_G5, PAD_EAR_0169, OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000708, 0x00000000, 0x00000001, 0x00001200) + door(0x0100, MODEL_DOOR4B_G5, PAD_EAR_0168, OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000708, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_DOOR_WIND, PAD_EAR_015E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00c80384, 0x00000000, 0x00000100) + tag(0x5b, 1) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_015F, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_016D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + tag(0x5d, 1) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_016E, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_016F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + tag(0x5c, 1) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_0170, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + tag(0x5e, 2) + tag(0x5f, 2) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0175, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_DOORTOP, PAD_EAR_0176, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0178, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DD_LAB_DOORTOP, PAD_EAR_0177, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xfffffffd, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0179, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_DOORTOP, PAD_EAR_017A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_017C, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DD_LAB_DOORTOP, PAD_EAR_017B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xfffffffd, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0171, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_SECTOR2TOP, PAD_EAR_0172, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0162, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_CAUTIONTOP, PAD_EAR_0163, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0164, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_CAUTIONTOP, PAD_EAR_0165, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + tag(0x47, 1) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0166, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_CAUTIONTOP, PAD_EAR_0167, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0173, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_SECTOR2TOP, PAD_EAR_0174, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_017F, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_DOORTOP, PAD_EAR_0180, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0181, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_SECTOR3TOP, PAD_EAR_0182, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + tag(0x45, 1) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0183, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_DOORTOP, PAD_EAR_0184, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0xffffffff, 0x00000000) + tag(0x44, 1) + door(0x0100, MODEL_DD_LAB_SECTOR3, PAD_EAR_017D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_4000, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LAB_SECTOR3, PAD_EAR_017E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_4000, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_0185, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LABDOOR, PAD_EAR_0186, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + tag(0x22, 1) + door(0x0100, MODEL_DD_LAB_SECTOR3WIND, PAD_EAR_0187, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00c80384, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LAB_SECTOR3WIND, PAD_EAR_0188, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00c80384, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_0189, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_RESTRICTED, PAD_EAR_018A, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + tag(0x5a, 1) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_018B, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_RESTRICTED, PAD_EAR_018C, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + tag(0x26, -1) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_018D, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_RESTRICTED, PAD_EAR_018E, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LAB_SECTOR2BOT, PAD_EAR_018F, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_DD_LAB_SECTOR4TOP, PAD_EAR_0190, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + tag(0x23, 1) + door(0x0100, MODEL_DR_CAROLL_DOOR, PAD_EAR_0199, OBJFLAG_00000010, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f851, 0x0000e666, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000012c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DR_CAROLL_DOOR_MAIN, PAD_EAR_0198, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_DR_CAROLL_DOOR_LEFT, PAD_EAR_0196, OBJFLAG_00000010, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DR_CAROLL_DOOR_RIGHT, PAD_EAR_0197, OBJFLAG_00000010, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DR_CAROLL_DOOR_BMAIN, PAD_EAR_0195, OBJFLAG_00000010, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DR_CAROLL_DOOR_BLEFT, PAD_EAR_0193, OBJFLAG_00000010, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_DR_CAROLL_DOOR_BRIGHT, PAD_EAR_0194, OBJFLAG_00000010, 0, 0, 1000, 0x0000f851, 0x0000f333, 0x00035555, 0x00035555, 0x00000666, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xfffffffb, 0x00000000) + tag(0x28, 5) + tag(0x29, 5) + tag(0x2a, 5) + tag(0x2b, 5) + tag(0x2c, 5) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000002, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000002, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000002, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000002, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000002, 0x000000f0, 0x00000000, 0xfffffffc, 0x00000000) +#else + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffc, 0x00000000) +#endif + tag(0x2d, 5) + tag(0x2e, 5) + tag(0x2f, 5) + tag(0x30, 5) + tag(0x31, 5) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01F9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffc, 0x00000000) + tag(0x32, 5) + tag(0x33, 5) + tag(0x34, 5) + tag(0x35, 5) + tag(0x36, 5) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01FA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01FB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01FC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01FD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_EAR_01FE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffc, 0x00000000) + tag(0x3f, 1) + door(0x0100, MODEL_DD_GRATE, PAD_EAR_016A, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE | OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x01, 1) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0213, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_DEACTIVATED | OBJFLAG_MONITOR_RENDERPOSTBG, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x02, 1) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0214, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_DEACTIVATED | OBJFLAG_MONITOR_RENDERPOSTBG, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x03, 1) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0215, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_DEACTIVATED | OBJFLAG_MONITOR_RENDERPOSTBG, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0216, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_DEACTIVATED | OBJFLAG_MONITOR_RENDERPOSTBG, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0217, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_DEACTIVATED | OBJFLAG_MONITOR_RENDERPOSTBG, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0218, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_DEACTIVATED | OBJFLAG_MONITOR_RENDERPOSTBG, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0219, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_021A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_021B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + tag(0x3a, 1) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_021C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 4) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_021D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_021E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_021F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0220, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0221, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0222, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0223, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0224, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0225, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0226, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0227, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0228, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0229, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_022A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_022B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_022C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_022D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_022E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_022F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0230, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0231, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0232, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0233, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0234, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0235, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_TVSCREEN, PAD_EAR_0236, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0245, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 35) + chr(SPAWNFLAG_00000200, 0x2f, PAD_EAR_0146, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x30, PAD_EAR_0147, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x31, PAD_EAR_0148, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x32, PAD_EAR_0149, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x33, PAD_EAR_014A, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x00, PAD_EAR_001F, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_PATH00, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x01, PAD_EAR_0135, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0019, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_01, 0x3c, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x02, PAD_EAR_0136, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x001a, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_01, 0x3d, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x3c, PAD_EAR_0134, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x03, PAD_EAR_0137, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, 0x3e, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x04, PAD_EAR_0111, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x05, PAD_EAR_0112, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x06, PAD_EAR_0113, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0a, PAD_EAR_0031, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_PATH02, -1, -1, 200, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0b, PAD_EAR_0038, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_PATH02, -1, -1, 200, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0c, PAD_EAR_0062, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_PATH03, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0d, PAD_EAR_006E, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_PATH03, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0e, PAD_EAR_0114, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0f, PAD_EAR_0115, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0060, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x10, PAD_EAR_0116, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0060, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x11, PAD_EAR_0117, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0065, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x12, PAD_EAR_0118, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0065, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x13, PAD_EAR_0119, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0069, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x14, PAD_EAR_011A, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0069, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x15, PAD_EAR_011B, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x16, PAD_EAR_011C, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x17, PAD_EAR_011D, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x18, PAD_EAR_011E, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x19, PAD_EAR_011F, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x1a, PAD_EAR_0120, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x1b, PAD_EAR_0121, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x1c, PAD_EAR_0122, BODY_DD_SHOCK_INF, HEAD_DDSHOCK, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1d, PAD_EAR_0123, BODY_DD_SHOCK_INF, HEAD_DDSHOCK, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 100, CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x1e, PAD_EAR_0124, BODY_DD_SHOCK_INF, HEAD_DDSHOCK, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 20, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1f, PAD_EAR_0125, BODY_DD_SHOCK_INF, HEAD_DDSHOCK, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 20, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x20, PAD_EAR_0126, BODY_DD_SHOCK_INF, HEAD_DDSHOCK, AILIST_INIT_BASIC_GUARD, -1, -1, 200, 20, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x21, PAD_EAR_0127, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 200, 20, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x22, PAD_EAR_0128, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 200, 20, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x23, PAD_EAR_0129, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 200, 20, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x24, PAD_EAR_012A, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_SHOCK_GUARD, -1, -1, 200, 20, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x3b, PAD_EAR_013B, BODY_DD_SHOCK_INF, HEAD_DDSHOCK, AILIST_K7_GUARD, -1, -1, 1, 20, CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x003b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, WEAPON_K7AVENGER) + tag(0x04, -1) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x38, PAD_EAR_013C, BODY_DD_LABTECH, HEAD_RANDOM, AILIST_K7_SCIENTIST, 0x0076, -1, 1, 20, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x29, PAD_EAR_0155, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2a, PAD_EAR_0156, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0060, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002a, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2b, PAD_EAR_014B, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2c, PAD_EAR_014C, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0060, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002c, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2d, PAD_EAR_0151, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x2e, PAD_EAR_0152, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_BASIC_GUARD, 0x0060, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x35, PAD_EAR_0138, BODY_DD_LABTECH, HEAD_JAMIE, AILIST_INIT_SCIENTIST, 0x0076, -1, 1000, 10, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x36, PAD_EAR_0139, BODY_DD_LABTECH, HEAD_JON, AILIST_INIT_SCIENTIST, -1, -1, 1000, 10, CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 1, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x37, PAD_EAR_013A, BODY_DD_LABTECH, HEAD_DUNCAN2, AILIST_INIT_SCIENTIST, -1, -1, 1000, 10, 0, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x3a, PAD_EAR_0106, BODY_DDSHOCK, HEAD_DARLING, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x39, PAD_EAR_010C, BODY_DRCAROLL, 0x00, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + tag(0x0b, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0246, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x0c, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0247, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x0d, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0248, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x0e, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0249, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x10, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_024A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x11, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_024B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x12, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_024C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x13, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_024D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x08, 3) + tag(0x14, 2) + tag(0x15, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_024E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x16, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_024F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x17, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0250, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x18, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0251, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x09, 3) + tag(0x19, 2) + tag(0x1a, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0252, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x1b, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0253, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x1c, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0254, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x1d, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0255, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x07, 3) + tag(0x0f, 2) + tag(0x1e, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0256, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x1f, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0257, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x20, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0258, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + tag(0x21, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0259, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_INTERACTSHORTRANGE, 1000, 3) + stdobject(0x0100, MODEL_LAB_TABLE, PAD_EAR_023C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x0a, 1) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_025A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_01000000, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x37, 1) + hovercar(0x00c0, MODEL_HOOVERBOT, PAD_EAR_0001, OBJFLAG_00000008 | OBJFLAG_20000000 | OBJFLAG_HOVERCAR_40000000 | OBJFLAG_HOVERCAR_ISHOVERBOT, OBJFLAG2_IMMUNETOANTI, 0, 100, 0x00000411) + tag(0x38, 1) + hovercar(0x00c0, MODEL_TESTERBOT, PAD_EAR_003B, OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_HOVERCAR_40000000 | OBJFLAG_HOVERCAR_ISHOVERBOT, OBJFLAG2_IMMUNETOANTI, 0, 100, 0x00000412) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01B3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01B4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01B8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01B9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01BA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01BB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01BC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + tinted_glass(0x0100, MODEL_WINDOW, PAD_EAR_01B5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000, 0x00c80384) + tinted_glass(0x0100, MODEL_WINDOW, PAD_EAR_01B6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000, 0x00c80384) + tinted_glass(0x0100, MODEL_WINDOW, PAD_EAR_01B7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000, 0x00c80384) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01BD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01BE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01BF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x3e, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_EAR_020C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_EAR_020B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_020A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + stdobject(0x0100, MODEL_LAB_CHAIR, PAD_EAR_020D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_LAB_TABLE, PAD_EAR_020E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_020F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + stdobject(0x0100, MODEL_LAB_CHAIR, PAD_EAR_0211, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_LAB_TABLE, PAD_EAR_0210, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + singlemonitor(0x0100, MODEL_SINISTERPC, PAD_EAR_0212, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01CF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01CE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01CD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01CB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01CA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01C8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01CC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01DD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01DF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01DE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01E9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01EA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01EB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01EC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01D9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01DA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01DB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01DC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01ED, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01EE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_EAR_01EF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x3d, 1) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_EAR_01A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_EAR_01AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x3c, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_EAR_01AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_EAR_01AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_EAR_01AD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_EAR_01AE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_EAR_01AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_EAR_01B0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_EAR_01B1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_EAR_01B2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_EAR_01A1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0166, MODEL_DD_PLANTRUBBER, PAD_EAR_01A2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_EAR_01A3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0180, MODEL_DD_PLANTSPIKE, PAD_EAR_01A4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0180, MODEL_DD_PLANTRUBBER, PAD_EAR_01A5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_EAR_01A6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0180, MODEL_DD_PLANTRUBBER, PAD_EAR_01A7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0133, MODEL_DD_PLANTSPIKE, PAD_EAR_01A8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_025D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_025E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_025F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_0260, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_0261, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_0262, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_0263, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_0264, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_0265, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_0266, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_EAR_0267, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_0268, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0033, MODEL_QUADPOD, PAD_EAR_013D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + + /** + * @bug: This should be using MODEL_CHRNIGHTSIGHT. + * + * When picking up night vision the game checks if the perfect darkness + * cheat is enabled and skips adding the night vision to your inventory as + * it would already be there. But because this uses IR specs instead, the + * check doesn't match and a duplicate night vision is added to the + * inventory. + */ + tag(0x05, 1) + stdobject(0x0100, MODEL_MISC_IRSPECS, PAD_EAR_013D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_COLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PLAYERUNDROPPABLE, 1000) + rename_object(-1, WEAPON_NIGHTVISION, L_EAR_045, L_EAR_046, L_EAR_047, L_EAR_048, L_EAR_049) // "Obtain Night Vision." + + tag(0x06, 1) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_CHRSHIELD, PAD_EAR_0243, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_COLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PLAYERUNDROPPABLE, 1000) + rename_object(-1, WEAPON_SHIELDTECHITEM, L_EAR_050, L_EAR_051, L_EAR_052, L_EAR_053, L_EAR_054) // "Obtain shield tech item." +#else + stdobject(0x0100, MODEL_CHRSHIELD, PAD_EAR_0243, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_COLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PLAYERUNDROPPABLE, 1000) + rename_object(-1, WEAPON_BRIEFCASE, L_EAR_050, L_EAR_051, L_EAR_052, L_EAR_053, L_EAR_054) // "Obtain shield tech item." +#endif + tag(0x25, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_EAR_055, L_EAR_056, L_EAR_057, L_EAR_058, L_EAR_059) // "Obtain Data Uplink." + tag(0x48, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_EAR_055, L_EAR_056, L_EAR_057, L_EAR_058, L_EAR_059) // "Obtain Data Uplink." + tag(0x41, 1) + autogun(0x0099, MODEL_ROOFGUN, PAD_EAR_026B, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000, 0x026e, 0x00004000, 0xffffc000, 0x000000da, 0x000a0000) + tag(0x42, 1) + autogun(0x0099, MODEL_ROOFGUN, PAD_EAR_026C, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000, 0x026f, 0x00004000, 0xffffc000, 0x000000da, 0x000a0000) + tag(0x43, 1) + autogun(0x0099, MODEL_ROOFGUN, PAD_EAR_026D, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 1000, 0x0270, 0x00004000, 0xffffc000, 0x000005b0, 0x000a0000) + autogun(0x0099, MODEL_ROOFGUN, PAD_EAR_026B, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A, 0, 1000, 0x026e, 0x00004000, 0xffffc000, 0x00000e38, 0x00140000) + autogun(0x0099, MODEL_ROOFGUN, PAD_EAR_026C, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A, 0, 1000, 0x026f, 0x00004000, 0xffffc000, 0x00000e38, 0x00140000) + stdobject(0x0133, MODEL_A51_CRATE2, PAD_EAR_0269, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0133, MODEL_A51_CRATE2, PAD_EAR_026A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x39, 1) + stdobject(0x0400, MODEL_ISOTOPE, PAD_EAR_0158, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0400, MODEL_ISOTOPEEXPERIMENT, PAD_EAR_0157, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x49, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_EAR_027E, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x4a, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_EAR_027F, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x4b, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0271, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x4c, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0272, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x4d, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0273, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x4e, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0274, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x4f, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0275, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x50, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0276, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x51, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0277, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x52, 1) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_0278, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_RIFLE) + tag(0x53, 1) + weapon(0x0100, MODEL_CHRCMP150, PAD_EAR_0279, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_CMP150) + tag(0x54, 1) + weapon(0x0100, MODEL_CHRCMP150, PAD_EAR_027A, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_CMP150) + tag(0x55, 2) + tag(0x56, 2) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_016B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_EAR_016C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x57, 2) + tag(0x58, 2) + weapon(0x0100, MODEL_CHRCMP150, PAD_EAR_027B, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, WEAPON_CMP150) + weapon(0x0100, MODEL_CHRCMP150, PAD_EAR_027C, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, WEAPON_CMP150) + link_guns(-1, -2) + tag(0x59, 1) + weapon(0x0080, MODEL_MULTI_AMMO_CRATE, PAD_EAR_027D, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_PROXIMITYMINE) + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2, -1) + ammo(AMMOTYPE_PISTOL, 100) + ammo(AMMOTYPE_RIFLE, 50) + intro_weapon(WEAPON_EYESPY, -1) + outfit(OUTFIT_DEFAULT) + spawn(PAD_EAR_001B) + endintro +}; + +s32 path00[] = { + PAD_EAR_001F, + PAD_EAR_001E, + PAD_EAR_001D, + PAD_EAR_001C, + PAD_EAR_000C, + PAD_EAR_000F, + PAD_EAR_0010, + PAD_EAR_000E, + PAD_EAR_0004, + PAD_EAR_0003, + PAD_EAR_0001, + PAD_EAR_0012, + PAD_EAR_0011, + PAD_EAR_0013, + PAD_EAR_0014, + PAD_EAR_0015, + -1, +}; + +s32 path01[] = { + PAD_EAR_004F, + PAD_EAR_004E, + PAD_EAR_004D, + PAD_EAR_004C, + PAD_EAR_004B, + PAD_EAR_004A, + PAD_EAR_0049, + PAD_EAR_002A, + PAD_EAR_002B, + PAD_EAR_002C, + PAD_EAR_002D, + PAD_EAR_002E, + PAD_EAR_0029, + PAD_EAR_002A, + PAD_EAR_0049, + PAD_EAR_004A, + PAD_EAR_004B, + PAD_EAR_004C, + PAD_EAR_004D, + PAD_EAR_004E, + -1, +}; + +s32 path02[] = { + PAD_EAR_0031, + PAD_EAR_0034, + PAD_EAR_0033, + PAD_EAR_0032, + PAD_EAR_0035, + PAD_EAR_0036, + PAD_EAR_0038, + PAD_EAR_0039, + PAD_EAR_003A, + -1, +}; + +s32 path03[] = { + PAD_EAR_0062, + PAD_EAR_0061, + PAD_EAR_0063, + PAD_EAR_0065, + PAD_EAR_0066, + PAD_EAR_0067, + PAD_EAR_0069, + PAD_EAR_006A, + PAD_EAR_006D, + PAD_EAR_006E, + -1, +}; + +s32 path04[] = { + PAD_EAR_0107, + PAD_EAR_0108, + PAD_EAR_0109, + -1, +}; + +s32 path05[] = { + PAD_EAR_0001, + PAD_EAR_0002, + PAD_EAR_000C, + PAD_EAR_001D, + PAD_EAR_001E, + PAD_EAR_001F, + PAD_EAR_0028, + PAD_EAR_0029, + PAD_EAR_002D, + PAD_EAR_002A, + PAD_EAR_002E, + PAD_EAR_002E, + PAD_EAR_002E, + -1, +}; + +s32 path06[] = { + PAD_EAR_002E, + PAD_EAR_0029, + PAD_EAR_0028, + PAD_EAR_001F, + PAD_EAR_001E, + PAD_EAR_001D, + PAD_EAR_000C, + PAD_EAR_0002, + PAD_EAR_0002, + PAD_EAR_0002, + -1, +}; + +s32 path07[] = { + PAD_EAR_003B, + PAD_EAR_0039, + PAD_EAR_003B, + PAD_EAR_0039, + -1, +}; + +s32 path08[] = { + PAD_EAR_003B, + PAD_EAR_003C, + PAD_EAR_003B, + -1, +}; + +s32 path09[] = { + PAD_EAR_0038, + PAD_EAR_0035, + PAD_EAR_0033, + PAD_EAR_0034, + PAD_EAR_0031, + PAD_EAR_0030, + PAD_EAR_002B, + PAD_EAR_002A, + PAD_EAR_0049, + PAD_EAR_004A, + PAD_EAR_004B, + PAD_EAR_004C, + PAD_EAR_004D, + PAD_EAR_0050, + PAD_EAR_004E, + PAD_EAR_0042, + PAD_EAR_0043, + PAD_EAR_005E, + PAD_EAR_0061, + PAD_EAR_0065, + PAD_EAR_0069, + PAD_EAR_006D, + PAD_EAR_006B, + PAD_EAR_006C, + PAD_EAR_00BD, + PAD_EAR_00BE, + -1, +}; + +s32 path10[] = { + PAD_EAR_00BE, + PAD_EAR_012E, + PAD_EAR_012F, + PAD_EAR_0130, + PAD_EAR_00C7, + PAD_EAR_00CD, + PAD_EAR_00C8, + PAD_EAR_00C4, + PAD_EAR_0130, + PAD_EAR_012F, + PAD_EAR_012E, + PAD_EAR_00BE, + PAD_EAR_00BD, + PAD_EAR_011C, + PAD_EAR_00BE, + -1, +}; + +s32 path11[] = { + PAD_EAR_003B, + PAD_EAR_003B, + PAD_EAR_003B, + -1, +}; + +s32 path12[] = { + PAD_EAR_007F, + PAD_EAR_007F, + PAD_EAR_007F, + -1, +}; + +s32 path13[] = { + PAD_EAR_0080, + PAD_EAR_0080, + PAD_EAR_0080, + -1, +}; + +#define init_path(pathid) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(1) \ + set_reaction_speed(20) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + +u8 func040c_start_path00[] = { + init_path(0) + endlist +}; + +u8 func040d_start_path01[] = { + init_path(1) + endlist +}; + +u8 func040e_start_path02[] = { + init_path(2) + endlist +}; + +u8 func040f_start_path03[] = { + init_path(3) + endlist +}; + +u8 func0410_start_path04[] = { + init_path(4) + endlist +}; + +/** + * @unused + * + * The function doesn't do any checks for detecting Jo, so the guard would + * ignore you if it were assigned. + */ +u8 func0414_walk_3_pads[] = { + label(0x03) + walk_to_pad(PAD_EAR_0002) + + beginloop(0x06) + if_chr_stopped(/*goto*/ 0x2f) + endloop(0x06) + + label(0x2f) + walk_to_pad(PAD_EAR_0003) + + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x04) + + label(0x08) + walk_to_pad(PAD_EAR_0001) + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x0a) + endloop(0x09) + + label(0x0a) + goto_first(0x03) + + endlist +}; + +/** + * Unused. + */ +u8 func0401_init_chr_with_flag[] = { + set_self_chrflag(CHRCFLAG_00000200) + set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) + endlist +}; + +u8 func0405_init_scientist[] = { + set_chr_maxdamage(CHR_SELF, 20) + set_ailist(CHR_SELF, AILIST_SCIENTIST) + endlist +}; + +u8 func0404_scientist[] = { + set_shotlist(AILIST_SCIENTIST) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x2f) + endloop(0x10) + + label(0x2f) + set_ailist(CHR_SELF, AILIST_INIT_NASTY_SCIENTIST) + + label(0x06) + stop_chr + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x2f) + if_distance_to_target_lt(500, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_ONE_SCIENTIST_DONE, TRUE, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_ONE_SCIENTIST_DONE) + goto_next(0x03) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_TWO_SCIENTISTS_DONE, TRUE, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_TWO_SCIENTISTS_DONE) + goto_next(0x03) + + label(0x06) + set_stage_flag(STAGEFLAG_THREE_SCIENTISTS_DONE) + if_stage_flag_eq(STAGEFLAG_THREE_SCIENTISTS_DONE, FALSE, /*goto*/ 0x03) + set_ailist(CHR_SELF, AILIST_INIT_NASTY_SCIENTIST) + + label(0x03) + if_chr_in_room(CHR_P1P2, 0x00, 0x0031, /*goto*/ 0x6a) + if_chr_in_room(CHR_P1P2, 0x00, 0x0032, /*goto*/ 0x6a) + if_chr_in_room(CHR_P1P2, 0x00, 0x0042, /*goto*/ 0x6d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0043, /*goto*/ 0x6d) + goto_next(0x06) + + label(0x6a) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x6b) + if_chr_deadish(0x2b, /*goto*/ 0x2f) + if_chr_stopped(/*goto*/ 0x6c) + reloop(0x6b) + + label(0x2f) + if_chr_deadish(0x2c, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x6c) + endloop(0x6b) + + label(0x6c) + goto_first(0x6a) + + label(0x6d) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x6e) + if_chr_deadish(0x2d, /*goto*/ 0x2f) + if_chr_stopped(/*goto*/ 0x6f) + reloop(0x6e) + + label(0x2f) + if_chr_deadish(0x2e, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x6f) + endloop(0x6e) + + label(0x6f) + goto_first(0x6d) + + label(0x06) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + endloop(0x09) + + label(0x2f) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + goto_first(0x09) + + label(0x06) + say_quip(CHR_TARGET, 0x0a, 0xff, 0x00, 0xff, 0x81, 0x03, 0x08) + restart_timer + stop_chr + + beginloop(0x56) + if_timer_lt(120, /*goto*/ 0x2f) + if_chr_in_view(/*goto*/ 0x06) + label(0x2f) + endloop(0x56) + + label(0x06) + say_quip(CHR_TARGET, 0x0b, 0xff, 0x00, 0xff, 0x81, 0x04, 0x09) + restart_timer + + beginloop(0x57) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + label(0x0a) + say_quip(CHR_TARGET, 0x0c, 0xff, 0x00, 0xff, 0x81, 0x05, 0x08) + restart_timer + chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0b) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) + set_pad_preset_to_investigation_terminal(OBJ_GOODTERM3) + goto_next(0x12) + + label(0x06) + set_pad_preset_to_investigation_terminal(OBJ_GOODTERM1) + goto_next(0x12) + + label(0x2f) + set_pad_preset_to_investigation_terminal(OBJ_GOODTERM2) + label(0x12) + go_to_target_pad(GOPOSFLAG_JOG) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) + if_object_in_good_condition(OBJ_GOODTERM3, /*goto*/ 0x19) + say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) + show_hudmsg_top_middle(CHR_TARGET, L_EAR_044, COLOR_00_GREEN) // "It appears someone has broken my PC." + goto_next(0x0e) + + label(0x19) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, FALSE, /*goto*/ 0x15) + say_quip(CHR_TARGET, 0x0f, 0xff, 0x00, 0xff, 0x81, 0x08, 0x08) + goto_next(0x0e) + + label(0x15) + set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT3) + say_quip(CHR_TARGET, 0x0d, 0xff, 0x00, 0xff, 0x81, 0x06, 0x08) + assign_sound(SFX_01C3, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_GOODTERM3, TRUE) + goto_next(0x0f) + + label(0x06) + if_object_in_good_condition(OBJ_GOODTERM1, /*goto*/ 0x19) + say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) + goto_next(0x0e) + + label(0x19) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, FALSE, /*goto*/ 0x16) + say_quip(CHR_TARGET, 0x0f, 0xff, 0x00, 0xff, 0x81, 0x08, 0x08) + goto_next(0x0e) + + label(0x16) + set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT1) + say_quip(CHR_TARGET, 0x0d, 0xff, 0x00, 0xff, 0x81, 0x06, 0x08) + assign_sound(SFX_01C3, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_GOODTERM1, TRUE) + goto_next(0x0f) + + label(0x2f) + if_object_in_good_condition(OBJ_GOODTERM1, /*goto*/ 0x19) + say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) + goto_next(0x0e) + + label(0x19) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, FALSE, /*goto*/ 0x17) + say_quip(CHR_TARGET, 0x0f, 0xff, 0x00, 0xff, 0x81, 0x08, 0x08) + goto_next(0x0e) + + label(0x17) + set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT2) + say_quip(CHR_TARGET, 0x0d, 0xff, 0x00, 0xff, 0x81, 0x06, 0x08) + assign_sound(SFX_01C3, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_GOODTERM2, TRUE) + goto_next(0x0f) + + label(0x0f) + show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." + stop_chr + + beginloop(0x0e) + endloop(0x0e) + + endlist +}; + +u8 func0407_init_nasty_scientist[] = { + set_ailist(CHR_SELF, AILIST_NASTY_SCIENTIST) + endlist +}; + +u8 func0406_nasty_scientist[] = { + set_shotlist(AILIST_NASTY_SCIENTIST) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2f) + if_num_times_shot_lt(1, /*goto*/ 0x06) + label(0x2f) + play_sound(MP3_028C, CHANNEL_7) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x10) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) + set_pad_preset_to_investigation_terminal(OBJ_ALARMTERM3) + goto_next(0x12) + + label(0x06) + set_pad_preset_to_investigation_terminal(OBJ_ALARMTERM1) + goto_next(0x12) + + label(0x2f) + set_pad_preset_to_investigation_terminal(OBJ_ALARMTERM2) + label(0x12) + if_num_times_shot_lt(1, /*goto*/ 0x13) + go_to_target_pad(GOPOSFLAG_JOG) + goto_next(0x55) + + label(0x13) + label(0x08) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + reloop(0x09) + + label(0x2f) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + say_quip(CHR_TARGET, 0x0a, 0xff, 0x00, 0xff, 0x81, 0x03, 0x08) + restart_timer + + beginloop(0x56) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x56) + + label(0x06) + say_quip(CHR_TARGET, 0x0b, 0xff, 0x00, 0xff, 0x81, 0x04, 0x09) + restart_timer + + beginloop(0x57) + if_timer_gt(120, /*goto*/ 0x0a) + endloop(0x57) + + label(0x0a) + restart_timer + stop_chr + say_quip(CHR_TARGET, 0x0c, 0xff, 0x00, 0xff, 0x81, 0x05, 0x08) + + beginloop(0x0b) + if_timer_gt(90, /*goto*/ 0x55) + endloop(0x0b) + + label(0x55) + go_to_target_pad(GOPOSFLAG_JOG) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) + if_object_in_good_condition(OBJ_ALARMTERM3, /*goto*/ 0x30) + goto_next(0x11) + + label(0x30) + set_stage_flag(STAGEFLAG_ALARM3_ACTIVE) + assign_sound(SFX_TYPING_8118, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_GOODTERM3, TRUE) + goto_next(0x0f) + + label(0x06) + if_object_in_good_condition(OBJ_ALARMTERM1, /*goto*/ 0x30) + goto_next(0x11) + + label(0x30) + set_stage_flag(STAGEFLAG_ALARM1_ACTIVE) + assign_sound(SFX_TYPING_8118, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_GOODTERM1, TRUE) + goto_next(0x0f) + + label(0x2f) + if_object_in_good_condition(OBJ_ALARMTERM2, /*goto*/ 0x30) + goto_next(0x11) + + label(0x30) + set_stage_flag(STAGEFLAG_ALARM2_ACTIVE) + assign_sound(SFX_TYPING_8118, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_GOODTERM2, TRUE) + goto_next(0x0f) + + label(0x11) + say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) + goto_next(0x78) + + label(0x0f) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + say_quip(CHR_TARGET, 0x0e, 0xff, 0x00, 0xff, 0x81, 0x07, 0x08) + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x30) + endloop(0x0d) + + label(0x30) + activate_alarm + label(0x78) + label(0x06) + stop_chr + + beginloop(0x0e) + endloop(0x0e) + + endlist +}; + +u8 func1009_weaponscache[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_CACHETERMINAL, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED, /*goto*/ 0x2f) + show_hudmsg(CHR_TARGET, L_EAR_098) // "Secret weapons compartment opened." + play_sound(SFX_00F7, -1) + assign_sound(SFX_043B, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_CMP150_1, TRUE) + disable_object(OBJ_CACHEDOOR1) + disable_object(OBJ_CACHEDOOR2) + unset_object_flag(OBJ_CMP150_1, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_CMP150_1, OBJFLAG2_INVISIBLE) + unset_object_flag(OBJ_CMP150_2, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_CMP150_2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_CMP150_1, OBJFLAG2_PICKUPWITHOUTLOS) + set_object_flag2(OBJ_CMP150_2, OBJFLAG2_PICKUPWITHOUTLOS) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_099) // "Enemy detected - weapon cache locked." + play_sound(SFX_00F7, -1) + unset_stage_flag(STAGEFLAG_BOT_ACTIVE) + unset_stage_flag(STAGEFLAG_BOT_REPROGRAMMED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * The second terminal you're supposed to activate. + * + * If turning the bot on without reprogramming it first, the bot will run + * without a program where it moves in a small circle at slow speed. + * + * If turning the bot on after reprogramming it will start the maintenance + * cycle (lasers). + */ +u8 func1002_bot_activation_terminal[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + goto_next(0x04) + + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_BOT_ACTIVATION_TERMINAL, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_objective_failed(1, /*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_BOT_REPROGRAMMED, TRUE, /*goto*/ 0x2f) + + // Activating prior to reprogramming + play_sound(SFX_01CA, -1) + assign_sound(SFX_01C5, CHANNEL_3) + play_sound_from_object(CHANNEL_3, OBJ_PURPLEBOT, 1, 600, 800) + show_hudmsg(CHR_TARGET, L_EAR_015) // "Maintenance robots activated." + set_stage_flag(STAGEFLAG_BOT_ACTIVE) + set_stage_flag(STAGEFLAG_BOT_ACTIVE_NOPROGRAM) + reloop(0x04) + + // Activating after reprogramming + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_015) // "Maintenance robots activated." + set_stage_flag(STAGEFLAG_BOT_ACTIVE) + yield + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_018) // "Maintenance cycle activated." + set_stage_flag(STAGEFLAG_BOT_ACTIVE_MAINTENANCE) + reloop(0x04) + + // Attempting to deactivate while bot reprogrammed and running + label(0x08) + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_020) // "Operation not allowed - robots busy." + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + reloop(0x04) + + // Deactivating + label(0x0a) + show_hudmsg(CHR_TARGET, L_EAR_021) // "Maintenance robots deactivated." + unset_stage_flag(STAGEFLAG_BOT_ACTIVE) + unset_stage_flag(STAGEFLAG_BOT_ACTIVE_CLEANING) + unset_stage_flag(STAGEFLAG_BOT_ACTIVE_NOPROGRAM) + play_sound(SFX_01C9, -1) + mute_channel(CHANNEL_3) + reloop(0x04) + + label(0x0b) + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_023) // "Maintenance robot system offline." + endloop(0x04) + + endlist +}; + +/** + * The first terminal you're supposed to activate. + * + * If activated while the bot is offline, the bot is reprogrammed with the + * maintenance cycle (ie. lasers) but still needs to be started. + * + * If activated while the bot is running with no program, the bot is + * reprogrammed with the cleaning cycle (up and down the room at medium speed). + */ +u8 func1003_bot_programming_terminal[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + goto_next(0x04) + + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_BOT_PROGRAMMING_TERMINAL, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_objective_failed(1, /*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x09) + + // Reprogramming + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_016) // "Maintenance robots reprogrammed." + set_stage_flag(STAGEFLAG_BOT_REPROGRAMMED) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE, TRUE, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + yield + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_019) // "Routine cleaning cycle activated." + set_stage_flag(STAGEFLAG_BOT_ACTIVE_CLEANING) + restart_timer + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + reloop(0x04) + + // Attempting to reprogram while bot already reprogrammed and running + label(0x09) + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_020) // "Operation not allowed - robots busy." + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + reloop(0x04) + + label(0x0b) + show_hudmsg(CHR_TARGET, L_EAR_023) // "Maintenance robot system offline." + endloop(0x04) + + endlist +}; + +u8 func1004_check_items_collected[] = { + yield + set_object_flag3(OBJ_K7AVENGER, OBJFLAG3_PLAYERUNDROPPABLE) + set_object_flag3(OBJ_NIGHTVISION, OBJFLAG3_PLAYERUNDROPPABLE) + set_object_flag3(OBJ_SHIELD, OBJFLAG3_PLAYERUNDROPPABLE) + + beginloop(0x04) + if_chr_has_object(CHR_BOND, OBJ_K7AVENGER, /*goto*/ 0x2f) + if_chr_has_object(CHR_COOP, OBJ_K7AVENGER, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_chr_has_object(CHR_BOND, OBJ_NIGHTVISION, /*goto*/ 0x2f) + if_chr_has_object(CHR_COOP, OBJ_NIGHTVISION, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_chr_has_object(CHR_BOND, OBJ_SHIELD, /*goto*/ 0x2f) + if_chr_has_object(CHR_COOP, OBJ_SHIELD, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + yield + set_stage_flag(STAGEFLAG_ALL_ITEMS_COLLECTED) + unset_stage_flag(STAGEFLAG_ITEMS_UNCOLLECTABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_item_pickup_messages[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_HAS_K7AVENGER, TRUE, /*goto*/ 0x2f) + if_chr_has_object(CHR_P1P2, OBJ_K7AVENGER, /*goto*/ 0x06) + goto_next(0x2f) + + label(0x06) + show_hudmsg(CHR_P1P2, L_EAR_086) // "Experimental item 1 acquired." + set_stage_flag(STAGEFLAG_HAS_K7AVENGER) + label(0x2f) + if_stage_flag_eq(STAGEFLAG_HAS_NIGHTVISION, TRUE, /*goto*/ 0x2f) + if_chr_has_object(CHR_P1P2, OBJ_NIGHTVISION, /*goto*/ 0x06) + goto_next(0x2f) + + label(0x06) + show_hudmsg(CHR_P1P2, L_EAR_087) // "Experimental item 2 acquired." + set_stage_flag(STAGEFLAG_HAS_NIGHTVISION) + label(0x2f) + if_stage_flag_eq(STAGEFLAG_HAS_SHIELD, TRUE, /*goto*/ 0x2f) + if_chr_has_object(CHR_P1P2, OBJ_SHIELD, /*goto*/ 0x06) + goto_next(0x2f) + + label(0x06) + show_hudmsg(CHR_P1P2, L_EAR_088) // "Experimental item 3 acquired." + set_stage_flag(STAGEFLAG_HAS_SHIELD) + label(0x2f) + endloop(0x04) + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_check_unacceptable_casualties[] = { + beginloop(0x04) + if_chr_dead(0x35, /*goto*/ 0x08) + if_chr_death_animation_finished(0x35, /*goto*/ 0x08) + if_chr_dead(0x36, /*goto*/ 0x09) + if_chr_death_animation_finished(0x36, /*goto*/ 0x09) + if_chr_dead(0x37, /*goto*/ 0x0a) + if_chr_death_animation_finished(0x37, /*goto*/ 0x0a) + if_chr_dead(0x38, /*goto*/ 0x0a) + if_chr_death_animation_finished(0x38, /*goto*/ 0x0a) + reloop(0x04) + + label(0x08) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) + goto_next(0x0f) + + if_chr_dead(0x36, /*goto*/ 0x0b) + if_chr_death_animation_finished(0x36, /*goto*/ 0x0b) + if_chr_dead(0x37, /*goto*/ 0x0c) + if_chr_death_animation_finished(0x37, /*goto*/ 0x0c) + label(0x0b) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + goto_next(0x0f) + + label(0x2f) + if_chr_dead(0x37, /*goto*/ 0x0f) + if_chr_death_animation_finished(0x37, /*goto*/ 0x0f) + reloop(0x04) + + label(0x0c) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + goto_next(0x0f) + label(0x2f) + reloop(0x04) + + label(0x09) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) + goto_next(0x0f) + label(0x2f) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + if_chr_dead(0x37, /*goto*/ 0x0f) + if_chr_death_animation_finished(0x37, /*goto*/ 0x0f) + label(0x2f) + endloop(0x04) + + label(0x0a) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) + goto_next(0x0f) + + label(0x2f) + label(0x0f) + set_stage_flag(STAGEFLAG_UNACCEPTABLE_CASUALTIES) + show_hudmsg(CHR_BOND, L_EAR_026) // "Unacceptable scientist casualties." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_terminal_activation[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_GOODTERM1, /*goto*/ 0x08) + if_chr_activated_object(CHR_TARGET, OBJ_ALARMTERM1, /*goto*/ 0x09) + if_chr_activated_object(CHR_TARGET, OBJ_GOODTERM2, /*goto*/ 0x0d) + if_chr_activated_object(CHR_TARGET, OBJ_ALARMTERM2, /*goto*/ 0x0b) + if_chr_activated_object(CHR_TARGET, OBJ_GOODTERM3, /*goto*/ 0x0f) + if_chr_activated_object(CHR_TARGET, OBJ_ALARMTERM3, /*goto*/ 0x0c) + if_chr_activated_object(CHR_TARGET, 0x0b, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x0c, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x0d, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x0e, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x10, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x11, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x12, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x13, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x15, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x16, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x17, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x18, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x1a, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x1b, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x1c, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x1d, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x1e, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x1f, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x20, /*goto*/ 0x2f) + if_chr_activated_object(CHR_TARGET, 0x21, /*goto*/ 0x2f) + endloop(0x04) + + // Inactive terminal + label(0x2f) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + show_hudmsg(CHR_TARGET, L_EAR_027) // "Terminal is not active." + restart_timer + + beginloop(0x56) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x56) + + label(0x2f) + reloop(0x04) + + // Good terminal 0x07 + label(0x08) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, FALSE, /*goto*/ 0x2f) + restart_timer + + beginloop(0x56) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x56) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_042) // "Experiment already powered down." + reloop(0x04) + + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." + assign_sound(SFX_01C3, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_GOODTERM1, TRUE) + restart_timer + + beginloop(0x0a) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." + set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT1) + reloop(0x04) + + // Good terminal 0x08 + label(0x0d) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, FALSE, /*goto*/ 0x2f) + restart_timer + + beginloop(0x57) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x57) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_042) // "Experiment already powered down." + goto_first(0x04) + + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." + assign_sound(SFX_01C3, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_GOODTERM2, TRUE) + restart_timer + + beginloop(0x0e) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." + set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT2) + reloop(0x04) + + // Good terminal 0x09 + label(0x0f) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, FALSE, /*goto*/ 0x2f) + restart_timer + + beginloop(0x58) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x58) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_042) // "Experiment already powered down." + reloop(0x04) + + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." + assign_sound(SFX_01C3, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_GOODTERM3, TRUE) + restart_timer + + beginloop(0x10) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x10) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." + set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT3) + reloop(0x04) + + // Alarm terminal 0x0f + label(0x09) + if_alarm_active(/*goto*/ 0x06) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + show_hudmsg(CHR_TARGET, L_EAR_030) // "Alarm activated." + set_stage_flag(STAGEFLAG_ALARM1_ACTIVE) + activate_alarm + reloop(0x04) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_031) // "Alarm deactivated." + unset_stage_flag(STAGEFLAG_ALARM1_ACTIVE) + deactivate_alarm + reloop(0x04) + + // Alarm terminal 0x14 + label(0x0b) + if_alarm_active(/*goto*/ 0x06) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + show_hudmsg(CHR_TARGET, L_EAR_030) // "Alarm activated." + set_stage_flag(STAGEFLAG_ALARM2_ACTIVE) + activate_alarm + reloop(0x04) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_031) // "Alarm deactivated." + unset_stage_flag(STAGEFLAG_ALARM2_ACTIVE) + deactivate_alarm + reloop(0x04) + + // Alarm terminal 0x19 + label(0x0c) + if_alarm_active(/*goto*/ 0x06) + speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text + show_hudmsg(CHR_TARGET, L_EAR_030) // "Alarm activated." + set_stage_flag(STAGEFLAG_ALARM3_ACTIVE) + activate_alarm + reloop(0x04) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_031) // "Alarm deactivated." + unset_stage_flag(STAGEFLAG_ALARM3_ACTIVE) + deactivate_alarm + reloop(0x04) + + label(0x2f) + endloop(0x04) + + endlist +}; + +u8 func1007_uplink[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x30) + goto_next(0x0d) + + label(0x30) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_UPLINKPC, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_UPLINK_FINISHED, FALSE, /*goto*/ 0x06) + + // Activating a second time + speak(CHR_TARGET, 0xffff, SFX_8116, CHANNEL_9, COLOR_00_GREEN) // unknown text + show_hudmsg(CHR_TARGET, L_EAR_041) // "Security door already unlocked." + reloop(0x04) + + label(0x06) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + + // Activated computer without uplink + speak(CHR_TARGET, 0xffff, SFX_8116, CHANNEL_9, COLOR_00_GREEN) // unknown text + show_hudmsg(CHR_TARGET, L_EAR_036) // "ACCESS DENIED - security code required." + reloop(0x04) + + // Uplinking + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_060) // "Connection established." + restart_timer + + // First second of uplinking + beginloop(0x08) + if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x30) + goto_next(0x0d) + + label(0x30) + if_timer_gt(60, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_TARGET, 200, PAD_EAR_025A, /*goto*/ 0x09) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, FALSE, /*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, FALSE, /*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, FALSE, /*goto*/ 0x0b) + label(0x2f) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + goto_next(0x09) + label(0x2f) + endloop(0x08) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_037) // "Searching for password." + restart_timer + set_stage_flag(STAGEFLAG_UPLINK_SEARCHING) + assign_sound(SFX_01BF, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_UPLINKPC, TRUE) + + beginloop(0x14) + if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x30) + goto_next(0x0d) + + label(0x30) + if_timer_gt(400, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_TARGET, 200, PAD_EAR_025A, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2f) + goto_next(0x09) + label(0x2f) + endloop(0x14) + + label(0x06) + mute_channel(CHANNEL_5) + assign_sound(SFX_01C1, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_UPLINKPC, TRUE) + show_hudmsg(CHR_TARGET, L_EAR_039) // "Password located - bypassing lock." + yield + show_hudmsg(CHR_TARGET, L_EAR_017) // "Security doors unlocked." + set_stage_flag(STAGEFLAG_UPLINK_FINISHED) + unlock_door(OBJ_UPLINKDOOR, 0x02) + + beginloop(0x15) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x15) + + label(0x06) + assign_sound(SFX_043B, CHANNEL_6) + control_sound_from_object(CHANNEL_6, 0x22, TRUE) + reloop(0x04) + + // Moved away from PC or switched weapon + label(0x09) + show_hudmsg(CHR_TARGET, L_EAR_040) // "Contact broken - reestablish link." + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_UPLINKPC, TRUE) + restart_timer + + beginloop(0x16) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x16) + + label(0x06) + mute_channel(CHANNEL_6) + reloop(0x04) + + label(0x0b) + restart_timer + + beginloop(0x0c) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_085) // "Connection broken - experiments still active." + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_UPLINKPC, TRUE) + restart_timer + + beginloop(0x17) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x17) + + label(0x06) + mute_channel(CHANNEL_6) + endloop(0x04) + + label(0x0d) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_check_bot_terminals_destroyed[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVATION_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x2f) + if_object_in_good_condition(OBJ_BOT_ACTIVATION_TERMINAL, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_BOT_ACTIVATION_TERMINAL_DESTROYED) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + label(0x2f) + if_stage_flag_eq(STAGEFLAG_BOT_PROGRAMMING_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x2f) + if_object_in_good_condition(OBJ_BOT_PROGRAMMING_TERMINAL, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_BOT_PROGRAMMING_TERMINAL_DESTROYED) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + label(0x2f) + endloop(0x04) + + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + // These are scientist chrs + set_chr_chrflag(0x35, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x36, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x37, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x38, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func100a_spawn_alarm_responders[] = { + beginloop(0x04) + if_alarm_active(/*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_ALARM_RESPONDERS_SPAWNED, TRUE, /*goto*/ 0x0c) + set_stage_flag(STAGEFLAG_ALARM_RESPONDERS_SPAWNED) + restart_timer + + beginloop(0x56) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x08) + endloop(0x56) + + beginloop(0x08) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + beginloop(0x57) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x09) + endloop(0x57) + + beginloop(0x09) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + beginloop(0x58) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x0a) + endloop(0x58) + + beginloop(0x0a) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + beginloop(0x59) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x0b) + endloop(0x59) + + beginloop(0x0b) + if_timer_gt(30, /*goto*/ 0x0c) + endloop(0x0b) + + set_stage_flag(STAGEFLAG_ALARM_RESPONDERS_SPAWNED) + label(0x0c) + endloop(0x04) + + endlist +}; + +u8 func0408_alarm_responder[] = { + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + set_accuracy(20) + goto_next(0x06) + + label(0x2f) + set_accuracy(10) + + label(0x06) + try_inherit_properties(0x19, /*goto*/ 0x06) + label(0x06) + try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_squadron(SQUADRON_09) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) + set_alertness(90) + set_self_chrflag(CHRCFLAG_00000200) + + // Run to scientist based on which alarm was triggered + if_stage_flag_eq(STAGEFLAG_ALARM1_ACTIVE, TRUE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_ALARM2_ACTIVE, TRUE, /*goto*/ 0x09) + try_run_to_chr(0x37, /*goto*/ 0x06) + goto_next(0x06) + + label(0x08) + try_run_to_chr(0x35, /*goto*/ 0x06) + goto_next(0x06) + + label(0x09) + try_run_to_chr(0x36, /*goto*/ 0x06) + goto_next(0x06) + + label(0x06) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) + endlist +}; + +u8 func100b_check_uplink_pc_destroyed[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_UPLINK_FINISHED, TRUE, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_UPLINKPC_DESTROYED) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + goto_next(0x08) + label(0x2f) + endloop(0x04) + + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0411_yellowbot[] = { + label(0x03) + begin_hovercar_path(0x05) + set_vehicle_speed(512, 120) + + beginloop(0x04) + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 10, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + begin_hovercar_path(0x06) + set_vehicle_speed(512, 120) + + beginloop(0x08) + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 8, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + goto_first(0x03) + + endlist +}; + +u8 func0412_purplebot_programs[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x04) + + // Agent + move_object_to_pad(OBJ_PURPLEBOT, PAD_EAR_00BE) + goto_next(0x14) + + // SA or PA + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x0c) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x08) + endloop(0x04) + + // Cleaning cycle (up and down the terminal room at medium speed) + label(0x08) + begin_hovercar_path(0x07) + set_vehicle_speed(512, 120) + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, FALSE, /*goto*/ 0x0e) + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 1, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x08) + + // No program (small circles at low speed) + label(0x0a) + begin_hovercar_path(0x08) + set_vehicle_speed(128, 120) + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, FALSE, /*goto*/ 0x0e) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x10) + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 1, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + goto_first(0x0a) + + // Maintenance cycle - on route to lasers (high speed) + label(0x0c) + begin_hovercar_path(0x09) + set_vehicle_speed(768, 120) + + beginloop(0x0d) + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 24, /*goto*/ 0x06) + endloop(0x0d) + + label(0x14) + label(0x06) + set_ailist(CHR_SELF, AILIST_PURPLEBOT_AT_LASERS) + + // Returning to offline + label(0x0e) + begin_hovercar_path(0x0b) + set_vehicle_speed(512, 120) + unset_stage_flag(STAGEFLAG_BOT_ACTIVE_CLEANING) + unset_stage_flag(STAGEFLAG_BOT_REPROGRAMMED) + unset_stage_flag(STAGEFLAG_BOT_ACTIVE) + + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, TRUE, /*goto*/ 0x11) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x12) + if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x10) + if_hoverbot_next_step(OPERATOR_GREATER_THAN, 1, /*goto*/ 0x06) + endloop(0x0f) + + label(0x06) + set_vehicle_speed(0, 1) + goto_first(0x04) + + label(0x11) + goto_first(0x0a) + + label(0x12) + goto_first(0x0a) + + label(0x10) + goto_first(0x08) + + endlist +}; + +u8 func0413_purplebot_at_lasers[] = { +#if VERSION < VERSION_NTSC_1_0 + open_door(0x45) +#endif + label(0x03) + begin_hovercar_path(0x0a) + set_vehicle_speed(512, 120) + + beginloop(0x13) + endloop(0x13) + + endlist +}; + +u8 func100c_shuffle_terminals[] = { + shuffle_investigation_terminals(OBJ_GOODTERM1, OBJ_ALARMTERM1, 0x1e, 0x1f, 0x20, 0x21) + shuffle_investigation_terminals(OBJ_GOODTERM2, OBJ_ALARMTERM2, 0x1a, 0x1b, 0x1c, 0x1d) + shuffle_investigation_terminals(OBJ_GOODTERM3, OBJ_ALARMTERM3, 0x15, 0x16, 0x17, 0x18) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_experiment_terminals_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_GOODTERM1, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_GOODTERM_DESTROYED, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, TRUE, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_GOODTERM_DESTROYED) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + + label(0x2f) + if_object_in_good_condition(OBJ_GOODTERM2, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_GOODTERM_DESTROYED, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, TRUE, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_GOODTERM_DESTROYED) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + + label(0x2f) + if_object_in_good_condition(0x09, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_GOODTERM_DESTROYED, TRUE, /*goto*/ 0x2f) + if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, TRUE, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_GOODTERM_DESTROYED) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + + label(0x2f) + endloop(0x04) + + endlist +}; + +u8 func0416_intro[] = { + play_cutscene_track(MUSIC_INVESTIGATION_INTRO) + camera_movement(ANIM_CUT_EAR_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_chrflag(CHR_BOND, CHRCFLAG_PERIMDISABLEDTMP) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_EAR_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_PERIMDISABLEDTMP) + unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_EAR_INTRO_GUARD_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 4) + + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x77) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(0, 0x56) + play_sound(SFX_01D5, CHANNEL_7) + + wait_until(250, 0x57) + play_sound(SFX_00EC, CHANNEL_10) + + wait_until(270, 0x58) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(290, 0x59) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(320, 0x5a) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(380, 0x5b) + open_door(0x24) + play_sound(SFX_0165, CHANNEL_7) + + wait_until(580, 0x5c) + play_sound(SFX_01D2, CHANNEL_7) + + wait_until(950, 0x5d) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(990, 0x5e) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(1060, 0x5f) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(1090, 0x60) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(1140, 0x61) + play_sound(SFX_01D3, CHANNEL_7) + + wait_until(1190, 0x62) + play_sound(SFX_0031, CHANNEL_7) + + wait_until(1196, 0x68) + play_sound(SFX_ARGH_MALE_008F, CHANNEL_6) + + wait_until(1310, 0x63) + play_sound(SFX_0085, CHANNEL_7) + + wait_until(1370, 0x64) + play_sound(SFX_007B, CHANNEL_7) + + wait_until(1410, 0x65) + play_sound(SFX_0175, CHANNEL_7) + + wait_until(1430, 0x66) + play_sound(SFX_0176, CHANNEL_7) + + wait_until(1600, 0x67) + play_sound(SFX_0171, CHANNEL_7) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2f) + goto_next(0x77) + label(0x2f) + if_controller_button_pressed(/*goto*/ 0x77) + label(0x2f) + endloop(0x08) + + label(0x77) + set_door_open(0x24) + set_door_open(0x40) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_PERIMDISABLEDTMP) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_EAR_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) + set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_INVINCIBLE) + set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_EAR_INTRO_GUARD_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) + + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + stop_cutscene_track + stop_ambient_track + enter_firstperson + yield + chr_do_animation(ANIM_CUT_EAR_INTRO_GUARD_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) + yield + kill(CHR_INTRO_GUARD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0417_outro[] = { + play_cutscene_track(MUSIC_INVESTIGATION_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_stage_flag(STAGEFLAG_TRIGGER_OUTRO_AUDIO) + + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + + set_ailist(CHR_DRCAROLL, GAILIST_IDLE) + set_ailist(CHR_K7_GUARD, GAILIST_IDLE) + restart_timer + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_01) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + set_cutscene_weapon(CHR_P1P2, -1, -1) + yield + set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2) + show_nonessential_chrs(FALSE) + + #define wait_for_camera(loopid) \ + beginloop(loopid) \ + if_camera_animating(/*goto*/ 0x2f) \ + goto_next(0x06) \ + label(0x2f) \ + if_controller_button_pressed(/*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_for_camera(0x08) + + if_controller_button_pressed(/*goto*/ 0x06) + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_02) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + + wait_for_camera(0x09) + + if_controller_button_pressed(/*goto*/ 0x06) + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_03) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + + wait_for_camera(0x0a) + + if_controller_button_pressed(/*goto*/ 0x06) + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_04) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_04, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + restart_timer + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2f) + goto_next(0x06) + label(0x2f) + if_controller_button_pressed(/*goto*/ 0x06) + if_timer_gt(282, /*goto*/ 0x2f) + endloop(0x0b) + + label(0x2f) + open_door(0x23) + + beginloop(0x5f) + if_camera_animating(/*goto*/ 0x2f) + goto_next(0x06) + label(0x2f) + if_controller_button_pressed(/*goto*/ 0x06) + endloop(0x5f) + + label(0x2f) + label(0x06) + if_controller_button_pressed(/*goto*/ 0x06) + unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_05) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_05, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) + + wait_for_camera(0x0c) + + if_controller_button_pressed(/*goto*/ 0x06) + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_06) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_06, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) + + wait_for_camera(0x0d) + + if_controller_button_pressed(/*goto*/ 0x06) + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_07) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_07, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) + + wait_for_camera(0x0e) + + camera_movement(ANIM_CUT_EAR_OUTRO_CAM_08) + chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_08, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_04, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) + + wait_for_camera(0x0f) + + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_intro_from_menu[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, 0x0416) + endlist +}; + +u8 func0417_outro_from_menu[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 unregistered_function1[] = { + set_returnlist(CHR_SELF, 0x0419) + set_ailist(CHR_SELF, 0x0416) + endlist +}; + +u8 unregistered_function2[] = { + set_returnlist(CHR_SELF, 0x041a) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func1415_outro_audio[] = { + label(0x79) + if_stage_flag_eq(STAGEFLAG_TRIGGER_OUTRO_AUDIO, TRUE, /*goto*/ 0x7a) + yield + goto_first(0x79) + + label(0x7a) + unset_stage_flag(STAGEFLAG_TRIGGER_OUTRO_AUDIO) + label(0x2f) + restart_timer + disable_object(0x37) + disable_object(0x38) + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_1) + mute_channel(CHANNEL_2) + mute_channel(CHANNEL_3) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + + #define outro_wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x77) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + outro_wait_until(78, 0x56) + play_sound(SFX_0161, CHANNEL_6) + + outro_wait_until(116, 0x57) + play_sound(SFX_0165, CHANNEL_7) + + outro_wait_until(131, 0x58) + play_sound(SFX_0166, CHANNEL_5) + + outro_wait_until(162, 0x59) + play_sound(SFX_0167, CHANNEL_6) + + outro_wait_until(197, 0x5a) + play_sound(SFX_0168, CHANNEL_7) + + outro_wait_until(236, 0x5b) + play_sound(SFX_0167, CHANNEL_5) + + outro_wait_until(266, 0x5c) + play_sound(SFX_0168, CHANNEL_6) + + outro_wait_until(281, 0x5d) + play_sound(SFX_0165, CHANNEL_7) + + outro_wait_until(335, 0x5e) + play_sound(SFX_0162, CHANNEL_5) + + outro_wait_until(384, 0x5f) + play_sound(SFX_0163, CHANNEL_6) + + outro_wait_until(415, 0x60) + play_sound(SFX_0164, CHANNEL_7) + + outro_wait_until(434, 0x61) + play_sound(SFX_0163, CHANNEL_5) + + outro_wait_until(474, 0x62) + play_sound(SFX_0164, CHANNEL_6) + + outro_wait_until(511, 0x63) + play_sound(SFX_0163, CHANNEL_7) + + outro_wait_until(356, 0x65) + play_sound(SFX_0164, CHANNEL_5) + + outro_wait_until(581, 0x66) + play_sound(SFX_0161, CHANNEL_6) + + outro_wait_until(620, 0x68) + speak(CHR_P1P2, L_EAR_100, MP3_03EC, CHANNEL_7, COLOR_09_BLUE) // "Dr. Caroll?" + + outro_wait_until(676, 0x67) + play_sound(SFX_0162, CHANNEL_6) + + outro_wait_until(747, 0x69) + play_sound(SFX_0163, CHANNEL_5) + + outro_wait_until(750, 0x6a) + speak(CHR_P1P2, L_EAR_101, MP3_03ED, CHANNEL_7, COLOR_09_BLUE) // "Dr. Caroll, are you here?" + + outro_wait_until(864, 0x6b) + speak(CHR_P1P2, L_EAR_102, MP3_03EE, CHANNEL_7, COLOR_04_ORANGE) // "Well, is it safe to come out?" + + outro_wait_until(1027, 0x6c) + speak(CHR_P1P2, L_EAR_103, MP3_03EF, CHANNEL_7, COLOR_09_BLUE) // "Yes, all clear." + + outro_wait_until(1200, 0x6f) + mute_channel(CHANNEL_6) + + play_sound(SFX_DOOR_042C, CHANNEL_4) + outro_wait_until(1219, 0x70) + + outro_wait_until(1254, 0x71) + speak(CHR_P1P2, L_EAR_104, MP3_03F0, CHANNEL_7, COLOR_09_BLUE) // "Wh..what... you're..." + + outro_wait_until(1460, 0x73) + speak(CHR_P1P2, L_EAR_105, MP3_03F1, CHANNEL_7, COLOR_04_ORANGE) // "Very professionally done, my dear, but there's no ..." + + outro_wait_until(1556, 0x74) + mute_channel(CHANNEL_5) + play_sound(SFX_DOOR_042C, CHANNEL_6) + + outro_wait_until(1900, 0x75) + speak(CHR_P1P2, L_EAR_106, MP3_03F2, CHANNEL_7, COLOR_04_ORANGE) // "Come on. I have vital information, and you must pr..." + + outro_wait_until(2200, 0x76) + play_sound(SFX_0161, CHANNEL_6) + + label(0x77) + goto_first(0x79) + + endlist +}; + +u8 func100f_check_for_end_level[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0063, /*goto*/ 0x2f) + if_chr_in_room(CHR_P1P2, 0x00, 0x0065, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_door_state(0x26, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_DRCAROLL_LOCATED) + yield +#if VERSION < VERSION_NTSC_1_0 + yield +#endif + if_all_objectives_complete(/*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2f) + goto_next(0x06) + + label(0x2f) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) + give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1011_spawn_guards_during_uplink[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_UPLINK_SEARCHING, TRUE, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + restart_timer + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_0131, AILIST_UPLINK_RESPONDER, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x09) + + beginloop(0x09) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_0132, AILIST_UPLINK_RESPONDER, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0a) + + beginloop(0x0a) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0409_uplink_responder[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + set_accuracy(20) + goto_next(0x06) + + label(0x2f) + set_accuracy(10) + + label(0x06) + try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_squadron(SQUADRON_09) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) + set_alertness(110) + set_self_chrflag(CHRCFLAG_00000200) + label(0x06) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1012_start_laser_sound[] = { + label(0x04) + yield + assign_sound(SFX_8119, CHANNEL_0) + play_sound_from_object(CHANNEL_0, 0x28, 1, 300, 400) + label(0x2f) + assign_sound(SFX_811A, CHANNEL_1) + play_sound_from_object(CHANNEL_1, 0x2d, 1, 300, 400) + label(0x2f) + assign_sound(SFX_8119, CHANNEL_2) + play_sound_from_object(CHANNEL_2, 0x32, 1, 300, 400) + assign_sound(SFX_01C5, CHANNEL_3) + play_sound_from_object(CHANNEL_3, 0x38, 1, 600, 800) + assign_sound(SFX_01C5, CHANNEL_4) + play_sound_from_object(CHANNEL_4, 0x37, 1, 600, 800) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_hatch_pc[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_HATCHPC, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_door_locked(0x3f, 0x08, /*goto*/ 0x56) + goto_next(0x2f) + + label(0x56) + play_sound(SFX_00F7, -1) + show_hudmsg(CHR_TARGET, L_EAR_061) // "Maintenance hatch is now open." + unlock_door(0x3f, 0x08) + reloop(0x04) + + label(0x2f) + show_hudmsg(CHR_TARGET, L_EAR_062) // "Maintenance hatch is already open." + restart_timer + + beginloop(0x57) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x57) + + label(0x2f) + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_radioactivity[] = { + restart_timer + + beginloop(0x04) + if_chr_in_room(CHR_TARGET, 0x00, 0x0014, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0015, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0016, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0017, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0018, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0019, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x001a, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + show_hudmsg(CHR_TARGET, L_EAR_063) // "WARNING - radioactive matter detected." + restart_timer + label(0x08) + yield + add_motion_blur(CHR_TARGET, 10, TRUE) + if_timer_lt(300, /*goto*/ 0x2f) + restart_timer + damage_chr_by_amount(CHR_TARGET, 4, 0) + label(0x2f) + if_chr_in_room(CHR_TARGET, 0x00, 0x0014, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0015, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0016, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0017, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0018, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0019, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x001a, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + goto_first(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_jo_radioactivity[] = { + set_target_chr(CHR_BOND) + set_ailist(CHR_SELF, AILIST_RADIOACTIVITY) + endlist +}; + +u8 func101d_coop_radioactivty[] = { + yield + set_target_chr(CHR_COOP) + if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x2f) + set_ailist(CHR_SELF, AILIST_RADIOACTIVITY) + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1021_counterop_radioactivity[] = { + yield + set_target_chr(CHR_ANTI) + if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x2f) + set_ailist(CHR_SELF, AILIST_RADIOACTIVITY) + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_k7_guard[] = { + set_accuracy(20) + set_reaction_speed(100) + set_shotlist(GAILIST_ALERTED) + + beginloop(0x0f) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + set_chrpreset(CHR_P1P2) + if_chr_in_room(CHR_TARGET, 0x00, 0x0036, /*goto*/ 0x03) + if_chr_in_room(CHR_TARGET, 0x00, 0x0037, /*goto*/ 0x03) + if_chr_in_room(CHR_TARGET, 0x00, 0x003a, /*goto*/ 0x03) + endloop(0x0f) + + label(0x03) + restart_timer + call_rng + if_rand_gt(128, /*goto*/ 0x06) + label(0x2f) + say_quip(CHR_PRESET, 0x09, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + label(0x06) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_near_miss(/*goto*/ 0x0c) + if_num_times_shot_gt(0, /*goto*/ 0x0c) + if_saw_injury(0x00, /*goto*/ 0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + try_attack_stand(ATTACKFLAG_AIMATPAD | ATTACKFLAG_AIMONLY, 0x0159, /*goto*/ 0x2f) + label(0x2f) + try_modify_attack(ATTACKFLAG_AIMATPAD, 0x0159, /*goto*/ 0x2f) + label(0x2f) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x32, 0x02, 0xff, BANK_0, 0x00, 0x00) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_near_miss(/*goto*/ 0x0c) + if_num_times_shot_gt(0, /*goto*/ 0x0c) + if_saw_injury(0x00, /*goto*/ 0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) + if_chr_stopped(/*goto*/ 0x2f) + goto_first(0x08) + + label(0x2f) + call_rng + if_rand_gt(200, /*goto*/ 0x2f) + goto_first(0x03) + + label(0x2f) + stop_chr + restart_timer + call_rng + if_rand_gt(128, /*goto*/ 0x06) + assign_sound(MP3_0299, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + + beginloop(0x0c) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x0c) + + label(0x2f) + say_quip(CHR_PRESET, 0x08, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + label(0x06) + if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_EAR_013B, /*goto*/ 0x2f) + walk_to_pad(PAD_EAR_013B) + label(0x2f) + restart_timer + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_near_miss(/*goto*/ 0x0c) + if_num_times_shot_gt(0, /*goto*/ 0x0c) + if_saw_injury(0x00, /*goto*/ 0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + restart_timer + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_near_miss(/*goto*/ 0x0c) + if_num_times_shot_gt(0, /*goto*/ 0x0c) + if_saw_injury(0x00, /*goto*/ 0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + goto_first(0x03) + + label(0x0c) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0403_k7_scientist[] = { + beginloop(0x14) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_in_room(CHR_TARGET, 0x00, 0x0035, /*goto*/ 0x03) + if_chr_in_room(CHR_TARGET, 0x00, 0x0036, /*goto*/ 0x03) + if_chr_in_room(CHR_TARGET, 0x00, 0x0037, /*goto*/ 0x03) + if_chr_in_room(CHR_TARGET, 0x00, 0x003a, /*goto*/ 0x03) + endloop(0x14) + + label(0x03) + stop_chr + restart_timer + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_near_miss(/*goto*/ 0x0c) + if_num_times_shot_gt(0, /*goto*/ 0x0c) + if_saw_injury(0x00, /*goto*/ 0x0c) + if_saw_death(0x00, /*goto*/ 0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) + call_rng + if_rand_lt(1, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + call_rng + if_rand_lt(64, /*goto*/ 0x09) + if_rand_lt(128, /*goto*/ 0x0a) + if_rand_lt(196, /*goto*/ 0x0b) + chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + goto_next(0x0f) + label(0x09) + chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + goto_next(0x0f) + label(0x0a) + chr_do_animation(ANIM_ROLL_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + goto_next(0x0f) + label(0x0b) + chr_do_animation(ANIM_GRAB_BUTT, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + goto_next(0x0f) + + beginloop(0x0f) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_near_miss(/*goto*/ 0x0c) + if_num_times_shot_gt(0, /*goto*/ 0x0c) + if_saw_injury(0x00, /*goto*/ 0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) + if_chr_stopped(/*goto*/ 0x2f) + endloop(0x0f) + + label(0x2f) + goto_first(0x03) + + label(0x0c) + assign_sound(MP3_028F, CHANNEL_6) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) +#endif + increase_squadron_alertness(100) + jog_to_pad(PAD_EAR_0133) + + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x10) + endloop(0x0d) + + label(0x10) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x0e) + if_chr_stopped(/*goto*/ 0x2f) + endloop(0x0e) + + label(0x2f) + goto_first(0x10) + + endlist +}; + +u8 func1016_setup_drcaroll[] = { + set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) + set_ailist(CHR_DRCAROLL, GAILIST_INVINCIBLE_AND_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040a_init_basic_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(1) + set_reaction_speed(20) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040b_init_shock_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(11) + set_reaction_speed(20) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(10) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1019_msg_securitysector[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0052, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + speak(CHR_P1P2, L_EAR_094, SFX_8173, CHANNEL_6, COLOR_09_BLUE) // "That's the highest security sector - Dr. Caroll ha..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_msg_lotofpower[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0031, /*goto*/ 0x2f) + if_chr_in_room(CHR_P1P2, 0x00, 0x0042, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + speak(CHR_P1P2, L_EAR_095, MP3_03A5, CHANNEL_6, COLOR_09_BLUE) // "Something around here's using a lot of power." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101b_msg_reprogram[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0026, /*goto*/ 0x2f) + if_chr_in_room(CHR_P1P2, 0x00, 0x0024, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + speak(CHR_P1P2, L_EAR_096, SFX_8174, CHANNEL_6, COLOR_09_BLUE) // "Reprogram that cleaning bot - it'll give you a way..." + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_msg_radioactive[] = { + beginloop(0x04) + if_objective_complete(0, /*goto*/ 0x06) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0014, /*goto*/ 0x2f) + endloop(0x04) + + label(0x2f) + speak(CHR_P1P2, L_EAR_097, SFX_8175, CHANNEL_6, COLOR_09_BLUE) // "Get out, Jo! The levels are too high. Use the CamS..." + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_unlock_drcaroll_door[] = { + beginloop(0x04) + if_objective_complete(0, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_objective_complete(1, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_objective_complete(2, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + if_objective_complete(3, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unlock_door(0x26, 0x40) + unlock_door(0x5a, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_check_bot_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_PURPLEBOT, /*goto*/ 0x2f) + goto_next(0x08) + label(0x2f) + endloop(0x04) + + // 0x32 is a laser + beginloop(0x08) + if_door_state(0x32, DOORSTATE_CLOSED, /*goto*/ 0x2f) + endloop(0x08) + + label(0x2f) + if_chr_in_room(CHR_BOND, 0x00, 0x004d, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x004e, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x004f, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0050, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0051, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0052, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0053, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0054, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0055, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0056, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0057, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0058, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0059, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x005a, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x005b, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x005c, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x005d, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x005e, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x005f, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0061, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0062, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0063, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x006c, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x006b, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0069, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0068, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x006d, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x006e, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0064, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0065, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0066, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0060, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0067, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x006a, /*goto*/ 0x06) + + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x0b) + if_chr_in_room(CHR_COOP, 0x00, 0x004d, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x004e, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x004f, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0050, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0051, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0052, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0053, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0054, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0055, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0056, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0057, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0058, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0059, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x005a, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x005b, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x005c, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x005d, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x005e, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x005f, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0061, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0062, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0063, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x006c, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x006b, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0069, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0068, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x006d, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x006e, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0064, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0065, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0066, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0060, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x0067, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x006a, /*goto*/ 0x06) + + label(0x0b) + show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." + set_stage_flag(STAGEFLAG_00000008) + set_stage_flag(STAGEFLAG_00000004) + if_stage_flag_eq(STAGEFLAG_HAS_K7AVENGER, TRUE, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_ITEMS_UNCOLLECTABLE) + label(0x2f) + if_stage_flag_eq(STAGEFLAG_HAS_NIGHTVISION, TRUE, /*goto*/ 0x2f) + set_stage_flag(STAGEFLAG_ITEMS_UNCOLLECTABLE) + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_objective_complete(0, /*goto*/ 0x2f) + goto_first(0x0b) + + label(0x2f) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + if_objective_complete(2, /*goto*/ 0x2f) + goto_first(0x0b) + + label(0x2f) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + if_chr_has_object(CHR_BOND, OBJ_K7AVENGER, /*goto*/ 0x2f) + if_chr_has_object(CHR_COOP, OBJ_K7AVENGER, /*goto*/ 0x2f) + goto_first(0x0b) + + label(0x2f) + if_chr_has_object(CHR_BOND, OBJ_NIGHTVISION, /*goto*/ 0x2f) + if_chr_has_object(CHR_COOP, OBJ_NIGHTVISION, /*goto*/ 0x2f) + goto_first(0x0b) + + label(0x2f) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_lock_agent_doors[] = { + label(0x04) + yield + if_difficulty_gt(DIFF_A, /*goto*/ 0x2f) + lock_door(0x5b, 0x08) + lock_door(0x5c, 0x08) + lock_door(0x5d, 0x08) + lock_door(0x5e, 0x08) + lock_door(0x5f, 0x08) + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_setup_rtracker[] = { + yield + set_object_flag3(OBJ_CMP150_1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_CMP150_2, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_PROXYMINES, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1423_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x0001, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0060, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0069, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1424_start_lift[] = { + activate_lift(1, 0x60) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_init_chr_with_flag, 0x0401 }, + { func0402_k7_guard, 0x0402 }, + { func0403_k7_scientist, 0x0403 }, + { func0404_scientist, 0x0404 }, + { func0405_init_scientist, 0x0405 }, + { func0406_nasty_scientist, 0x0406 }, + { func0407_init_nasty_scientist, 0x0407 }, + { func0408_alarm_responder, 0x0408 }, + { func0409_uplink_responder, 0x0409 }, + { func040a_init_basic_guard, 0x040a }, + { func040b_init_shock_guard, 0x040b }, + { func040c_start_path00, 0x040c }, + { func040d_start_path01, 0x040d }, + { func040e_start_path02, 0x040e }, + { func040f_start_path03, 0x040f }, + { func0410_start_path04, 0x0410 }, + { func0411_yellowbot, 0x0411 }, + { func0412_purplebot_programs, 0x0412 }, + { func0413_purplebot_at_lasers, 0x0413 }, + { func0415_radioactivity, 0x0415 }, + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_bot_activation_terminal, 0x1002 }, + { func1003_bot_programming_terminal, 0x1003 }, + { func1004_check_items_collected, 0x1004 }, + { func1005_check_unacceptable_casualties, 0x1005 }, + { func1006_terminal_activation, 0x1006 }, + { func1007_uplink, 0x1007 }, + { func1008_check_bot_terminals_destroyed, 0x1008 }, + { func1009_weaponscache, 0x1009 }, + { func100a_spawn_alarm_responders, 0x100a }, + { func100b_check_uplink_pc_destroyed, 0x100b }, + { func100c_shuffle_terminals, 0x100c }, + { func100e_experiment_terminals_destroyed, 0x100e }, + { func100f_check_for_end_level, 0x100f }, + { func1010_intro_from_menu, 0x1010 }, + { func1011_spawn_guards_during_uplink, 0x1011 }, + { func1012_start_laser_sound, 0x1012 }, + { func1013_hatch_pc, 0x1013 }, + { func1014_jo_radioactivity, 0x1014 }, + { func1415_outro_audio, 0x1415 }, + { func1016_setup_drcaroll, 0x1016 }, + { func1018_item_pickup_messages, 0x1018 }, + { func1019_msg_securitysector, 0x1019 }, + { func101a_msg_lotofpower, 0x101a }, + { func101b_msg_reprogram, 0x101b }, + { func101c_msg_radioactive, 0x101c }, + { func101d_coop_radioactivty, 0x101d }, + { func101e_unlock_drcaroll_door, 0x101e }, + { func101f_check_bot_destroyed, 0x101f }, + { func1020_lock_agent_doors, 0x1020 }, + { func1021_counterop_radioactivity, 0x1021 }, + { func1022_setup_rtracker, 0x1022 }, + { func1423_setup_environment, 0x1423 }, + { func1424_start_lift, 0x1424 }, + { func0414_walk_3_pads, 0x0414 }, + { func0416_intro, 0x0416 }, + { func0417_outro, 0x0417 }, + { func1010_intro_from_menu, 0x0c00 }, + { func0417_outro_from_menu, 0x0c01 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, +#if VERSION >= VERSION_NTSC_1_0 + { path10, 10, PATHFLAG_CIRCULAR }, +#else + { path10, 10, 0 }, +#endif + { path11, 11, 0 }, + { path12, 12, 0 }, + { path13, 13, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupeld.c b/src/ailists/setupeld.c new file mode 100644 index 000000000..a9c200d00 --- /dev/null +++ b/src/ailists/setupeld.c @@ -0,0 +1,3260 @@ +// +// Villa +// + +#include "stagesetup.h" + +// Characters +#define CHR_SNIPER1 0x00 +#define CHR_SNIPER2 0x01 +#define CHR_SNIPER3 0x02 +#define CHR_SNIPER4 0x03 +#define CHR_SNIPER5 0x04 +#define CHR_SNIPER6 0x05 +#define CHR_SNIPER7 0x06 +#define CHR_SNIPER8 0x07 +#define CHR_BASEMENT1 0x43 +#define CHR_BASEMENT2 0x44 +#define CHR_BASEMENT3 0x45 +#define CHR_BASEMENT4 0x46 +#define CHR_BASEMENT5 0x47 +#define CHR_BASEMENT6 0x48 +#define CHR_BASEMENT7 0x49 +#define CHR_BASEMENT8 0x4a +#define CHR_BASEMENT9 0x4b +#define CHR_TAKER1 0x4e +#define CHR_TAKER2 0x4f +#define CHR_NEGOTIATOR 0x50 +#define CHR_CARRINGTON 0x51 +#define CHR_HACKER1 0x52 +#define CHR_HACKER2 0x53 +#define CHR_HACKER3 0x54 +#define CHR_CISOLDIER 0x55 + +// Objects +#define OBJ_DROPSHIP 0x00 +#define OBJ_COOLING_SWITCH 0x03 +#define OBJ_POWER_SWITCH 0x04 +#define OBJ_WINDMILL_SWITCH 0x05 +#define OBJ_KEYCARD 0x0a +#define OBJ_HACKERPC1 0x0b +#define OBJ_HACKERPC2 0x0c +#define OBJ_HACKERPC3 0x0d +#define OBJ_HACKERPC4 0x0e +#define OBJ_WINDMILL 0x0f +#define OBJ_CMP150_1 0x8e +#define OBJ_CMP150_2 0x8f +#define OBJ_DEVASTATOR 0x99 + +// Stage flags +#define STAGEFLAG_NEGOTIATOR_DEAD 0x00000100 +#define STAGEFLAG_NEGOTIATOR_ESCAPED 0x00000200 +#define STAGEFLAG_SNIPERS_DEAD 0x00000400 +#define STAGEFLAG_COOLING_ACTIVE 0x00000800 +#define STAGEFLAG_POWER_ACTIVE 0x00001000 +#define STAGEFLAG_WINDMILL_ACTIVATED 0x00002000 +#define STAGEFLAG_WINDMILL_SWITCH_DESTROYED 0x00004000 +#define STAGEFLAG_HACKERS_DEAD 0x00008000 +#define STAGEFLAG_HACKERS_SUCCEEDED 0x00010000 +#define STAGEFLAG_CARRINGTON_RESCUED 0x00020000 +#define STAGEFLAG_TAKERS_DEAD 0x00080000 +#define STAGEFLAG_GUARD_CAPTURED 0x00100000 +#define STAGEFLAG_HACKER_PC_DESTROYED 0x00200000 +#define STAGEFLAG_HACKERS_STARTED 0x00400000 +#define STAGEFLAG_INTRO_FINISHED 0x00800000 +#define STAGEFLAG_ONE_BASEMENT_GUARD_REMAINING 0x01000000 +#define STAGEFLAG_PLAYING_INTRO_FROM_MENU 0x02000000 +#define STAGEFLAG_FORGOT_TO_KO_GUARD 0x04000000 + +// AI Lists +#define AILIST_INIT_TAKER 0x0401 +#define AILIST_TAKER 0x0402 +#define AILIST_NEGOTIATOR 0x0403 +#define AILIST_SNIPER 0x0404 +#define AILIST_HACKER 0x0405 +#define AILIST_INIT_HACKER 0x0406 +#define AILIST_INIT_SNIPER 0x0407 +#define AILIST_OUTRO 0x0408 +#define AILIST_INTRO 0x0409 +#define AILIST_ENABLE_SNIPER 0x040a +#define AILIST_INIT_BASEMENT_GUARD 0x040b +#define AILIST_INIT_TYPE1_GUARD 0x040c +#define AILIST_INIT_TYPE2_GUARD 0x040d // has better accuracy on PA +#define AILIST_PATH01 0x040e +#define AILIST_PATH02 0x040f +#define AILIST_CARRINGTON 0x0410 +#define AILIST_CISOLIDER 0x0411 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_ELD_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_ELD_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_ELD_002) + briefing(BRIEFINGTYPE_TEXT_A, L_ELD_003) + + beginobjective(0, L_ELD_005, (DIFFBIT_A | DIFFBIT_SA)) // "Save the negotiator" + complete_flags(STAGEFLAG_NEGOTIATOR_ESCAPED) + fail_flags(STAGEFLAG_NEGOTIATOR_DEAD) + endobjective + + beginobjective(1, L_ELD_006, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Eliminate rooftop snipers" + complete_flags(STAGEFLAG_SNIPERS_DEAD) + endobjective + + beginobjective(2, L_ELD_007, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Activate wind generator" + complete_flags(STAGEFLAG_WINDMILL_ACTIVATED) + fail_flags(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) + endobjective + + beginobjective(3, L_ELD_008, (DIFFBIT_PA | DIFFBIT_PD)) // "Locate and eliminate dataDyne hackers" + complete_flags(STAGEFLAG_HACKERS_DEAD) + fail_flags(STAGEFLAG_HACKERS_SUCCEEDED) + fail_flags(STAGEFLAG_HACKER_PC_DESTROYED) + endobjective + + beginobjective(4, L_ELD_010, (DIFFBIT_PA | DIFFBIT_PD)) // "Capture dataDyne guard" + complete_flags(STAGEFLAG_GUARD_CAPTURED) +#if VERSION >= VERSION_NTSC_1_0 + fail_flags(STAGEFLAG_FORGOT_TO_KO_GUARD) +#endif + endobjective + + beginobjective(5, L_ELD_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Rescue Carrington" + complete_flags(STAGEFLAG_CARRINGTON_RESCUED) + endobjective + + // Note these snipers are replaced with new ones further below. + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA, CHR_SNIPER1, PAD_ELD_0192, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA, CHR_SNIPER2, PAD_ELD_0193, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA, CHR_SNIPER3, PAD_ELD_0194, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA, CHR_SNIPER6, PAD_ELD_0197, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA, CHR_SNIPER7, PAD_ELD_0198, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + + tag(0x8e, 2) + tag(0x8f, 2) + weapon(0x0100, MODEL_CHRCMP150, PAD_ELD_019A, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CMP150) + weapon(0x0100, MODEL_CHRCMP150, PAD_ELD_019A, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CMP150) + link_guns(-1, -2) + + chr(SPAWNFLAG_FORCESUNGLASSES, CHR_SNIPER5, PAD_ELD_0196, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES, CHR_SNIPER8, PAD_ELD_0199, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES, CHR_SNIPER4, PAD_ELD_0195, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 40, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONPA, CHR_SNIPER1, PAD_ELD_0192, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 80, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONPA, CHR_SNIPER2, PAD_ELD_0193, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 80, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONPA, CHR_SNIPER3, PAD_ELD_0194, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 80, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONPA, CHR_SNIPER6, PAD_ELD_0197, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 500, 80, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONPA, CHR_SNIPER7, PAD_ELD_0198, BODY_DDSNIPER, HEAD_DDSNIPER, AILIST_INIT_SNIPER, -1, -1, 500, 80, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SNIPERRIFLE) + tag(0x8e, 2) + tag(0x8f, 2) + weapon(0x0100, MODEL_CHRCMP150, PAD_ELD_019A, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CMP150) + weapon(0x0100, MODEL_CHRCMP150, PAD_ELD_019A, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CMP150) + link_guns(-1, -2) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_NEGOTIATOR, PAD_ELD_022B, BODY_SECRETARY, HEAD_SECRETARY, GAILIST_IDLE, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_ALLY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FORCESUNGLASSES, CHR_TAKER1, PAD_ELD_0229, BODY_DD_GUARD, HEAD_JON, GAILIST_IDLE, -1, -1, 500, 150, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES, CHR_TAKER2, PAD_ELD_022A, BODY_DD_GUARD, HEAD_BEAU1, GAILIST_IDLE, -1, -1, 500, 150, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x08, PAD_ELD_00B4, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x09, PAD_ELD_022F, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x0a, PAD_ELD_019B, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x0b, PAD_ELD_00B8, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x0c, PAD_ELD_0231, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE | CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x0d, PAD_ELD_0232, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x23, PAD_ELD_01B1, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x24, PAD_ELD_01B2, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x25, PAD_ELD_01B3, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x26, PAD_ELD_01B4, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x27, PAD_ELD_01B5, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x28, PAD_ELD_01B6, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x29, PAD_ELD_01B7, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x2a, PAD_ELD_01B8, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x2b, PAD_ELD_01B9, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x2c, PAD_ELD_01BA, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x2d, PAD_ELD_01BB, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x2e, PAD_ELD_01BC, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA | SPAWNFLAG_00000200, 0x2f, PAD_ELD_01BD, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ONLYONA | SPAWNFLAG_ONLYONSA | SPAWNFLAG_00000200, 0x30, PAD_ELD_01BE, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x31, PAD_ELD_01BF, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x32, PAD_ELD_01C0, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x33, PAD_ELD_01C1, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x34, PAD_ELD_01C2, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x35, PAD_ELD_01C3, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0035, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x36, PAD_ELD_01C4, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0036, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3d, PAD_ELD_01CB, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x37, PAD_ELD_01C5, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0037, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x38, PAD_ELD_01C6, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0038, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_00000200, 0x39, PAD_ELD_01C7, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0039, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3a, PAD_ELD_01C8, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3b, PAD_ELD_01C9, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3c, PAD_ELD_01CA, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3e, PAD_ELD_01CC, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3f, PAD_ELD_01CD, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x40, PAD_ELD_01CE, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE2_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0040, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x41, PAD_ELD_01CF, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0041, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x42, PAD_ELD_01D0, BODY_DD_GUARD, HEAD_RANDOM, AILIST_INIT_TYPE1_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0042, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT1, PAD_ELD_01D1, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0043, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT2, PAD_ELD_01D2, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0044, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT3, PAD_ELD_01D3, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0045, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT4, PAD_ELD_01D4, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0046, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT5, PAD_ELD_01D5, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0047, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT6, PAD_ELD_01D6, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, 0x0233, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0048, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT7, PAD_ELD_01D7, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, 0x00d2, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0049, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT8, PAD_ELD_01D8, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, CHR_BASEMENT9, PAD_ELD_01D9, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_BASEMENT_GUARD, -1, -1, 500, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_CARRINGTON, PAD_ELD_00DC, BODY_CARRINGTON, HEAD_CARRINGTON, AILIST_CARRINGTON, -1, -1, 500, 50, 0, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_RTRACKED, CHR_HACKER1, PAD_ELD_022C, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_HACKER, -1, -1, 500, 30, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, 0x8d, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0052, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_RTRACKED, CHR_HACKER2, PAD_ELD_022D, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_HACKER, -1, -1, 500, 30, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_00, 0x8b, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0053, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_RTRACKED, CHR_HACKER3, PAD_ELD_022E, BODY_DD_SHOCK_INF, HEAD_RANDOM, AILIST_INIT_HACKER, -1, -1, 500, 30, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS, 0, TEAM_20, SQUADRON_00, 0x8c, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0054, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x4c, PAD_ELD_0096, BODY_DD_GUARD, HEAD_RANDOM, AILIST_PATH01, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_LOOK_AROUND, TEAM_20, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x4d, PAD_ELD_0085, BODY_DD_GUARD, HEAD_RANDOM, AILIST_PATH02, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x004d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_CISOLDIER, PAD_ELD_0234, BODY_CISOLDIER, HEAD_RANDOM, AILIST_CISOLIDER, -1, -1, 500, 50, CHRFLAG0_CAN_FLANK | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSNIPERRIFLE, 0x0055, OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, WEAPON_SNIPERRIFLE) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0151, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0152, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0155, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0156, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0157, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0158, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0159, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_015A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_015B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_015C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_015E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0161, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_015F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0162, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0164, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0166, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0167, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0168, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0169, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_016A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_016B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_0165, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_016C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_016D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_015D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_016E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + tinted_glass(0x0100, MODEL_WINDOW, PAD_ELD_016F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012c0258) + glass(0x0100, MODEL_WINDOW, PAD_ELD_0160, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x93, 2) + tag(0x94, 2) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0170, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0171, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0172, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0173, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x90, 2) + tag(0x91, 2) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0174, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0175, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_017C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_017D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x92, 1) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0176, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x06, 2) + tag(0x07, 2) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0189, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_018A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_018B, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_018C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ELD_018D, OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_ELD_018E, OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x95, 1) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0177, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000080, 0x000005dc, 0x00000000, 0x00000000, 0x00000600) + tag(0x97, 2) + tag(0x98, 2) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0179, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000080, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0178, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000080, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_018F, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0190, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + tag(0x96, 1) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_017B, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000080, 0x000005dc, 0x00000000, 0x00000000, 0x00000600) + tag(0x1e, 12) + tag(0x1f, 12) + tag(0x20, 12) + tag(0x21, 12) + tag(0x22, 12) + tag(0x23, 12) + tag(0x24, 12) + tag(0x25, 12) + tag(0x26, 12) + tag(0x27, 12) + tag(0x28, 12) + tag(0x29, 12) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00E5, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00E6, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00E7, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00E8, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00E9, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00EA, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00EB, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00EC, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_00ED, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00EE, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00EF, OBJFLAG_00000008 | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00F0, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x2a, 6) + tag(0x2b, 6) + tag(0x2c, 6) + tag(0x2d, 6) + tag(0x2e, 6) + tag(0x2f, 6) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00F1, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00F2, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00F3, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00F4, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00F5, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00F6, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x30, 12) + tag(0x31, 12) + tag(0x32, 12) + tag(0x33, 12) + tag(0x34, 12) + tag(0x35, 12) + tag(0x36, 12) + tag(0x37, 12) + tag(0x38, 12) + tag(0x39, 12) + tag(0x3a, 12) + tag(0x3b, 12) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00F7, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_00F8, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00F9, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00FA, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00FB, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00FC, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00FD, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_00FE, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_00FF, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0100, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0101, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0102, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x3c, 6) + tag(0x3d, 6) + tag(0x3e, 6) + tag(0x3f, 6) + tag(0x40, 6) + tag(0x41, 6) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0103, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0104, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0105, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0106, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0107, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0108, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x42, 12) + tag(0x43, 12) + tag(0x44, 12) + tag(0x45, 12) + tag(0x46, 12) + tag(0x47, 12) + tag(0x48, 12) + tag(0x49, 12) + tag(0x4a, 12) + tag(0x4b, 12) + tag(0x4c, 12) + tag(0x4d, 12) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0109, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_010A, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_010B, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_010C, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_010D, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_010E, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_010F, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0110, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0111, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0112, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0113, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0114, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x4e, 6) + tag(0x4f, 6) + tag(0x50, 6) + tag(0x51, 6) + tag(0x52, 6) + tag(0x53, 6) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0115, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0116, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0117, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0118, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0119, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_011A, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x54, 6) + tag(0x55, 6) + tag(0x56, 6) + tag(0x57, 6) + tag(0x58, 6) + tag(0x59, 6) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_011B, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_011C, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_011D, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_011E, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_011F, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0120, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x5a, 12) + tag(0x5b, 12) + tag(0x5c, 12) + tag(0x5d, 12) + tag(0x5e, 12) + tag(0x5f, 12) + tag(0x60, 12) + tag(0x61, 12) + tag(0x62, 12) + tag(0x63, 12) + tag(0x64, 12) + tag(0x65, 12) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0121, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0122, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0123, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0124, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0125, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0126, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0127, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0128, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0129, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_012A, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_012B, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_012C, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x66, 6) + tag(0x67, 6) + tag(0x68, 6) + tag(0x69, 6) + tag(0x6a, 6) + tag(0x6b, 6) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_012D, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_012E, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_012F, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0130, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0131, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0132, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x6c, 12) + tag(0x6d, 12) + tag(0x6e, 12) + tag(0x6f, 12) + tag(0x70, 12) + tag(0x71, 12) + tag(0x72, 12) + tag(0x73, 12) + tag(0x74, 12) + tag(0x75, 12) + tag(0x76, 12) + tag(0x77, 12) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0133, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0134, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0135, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0136, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0137, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0138, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0139, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_013A, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_013B, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_013C, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_013D, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_013E, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x78, 6) + tag(0x79, 6) + tag(0x7a, 6) + tag(0x7b, 6) + tag(0x7c, 6) + tag(0x7d, 6) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_013F, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0140, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0141, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0142, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0143, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0144, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x7e, 12) + tag(0x7f, 12) + tag(0x80, 12) + tag(0x81, 12) + tag(0x82, 12) + tag(0x83, 12) + tag(0x84, 12) + tag(0x85, 12) + tag(0x86, 12) + tag(0x87, 12) + tag(0x88, 12) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0145, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0146, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_0147, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT2, PAD_ELD_0148, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_0149, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_014A, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_014B, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_014C, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT3, PAD_ELD_014D, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_014E, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + glass(0x003a, MODEL_AIVILLABOT1, PAD_ELD_014F, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT, 0, 0, 500) + tag(0x0f, 1) + autogun(0x0100, MODEL_AIVILLAWINDMILL, PAD_ELD_0191, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, -1, 0x00020000, 0xfffe0000, 0x000000da, 0x000a0000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_019C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_019D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_019E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_019F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_01A1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_01A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_01A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_01A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_DEVASTATOR) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01EB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_DEVASTATOR) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01DC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01DD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_SMG) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01DE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01DF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_SMG) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01EA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01DA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_SMG) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01DB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_DEVASTATOR) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_SMG) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_SMG) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + ammocrate(0x0080, MODEL_MULTI_AMMO_CRATE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE, 0, 0, 1000, AMMOTYPE_SMG) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E9, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01E8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01ED, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01EE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_COFFEE_TABLE, PAD_ELD_01AE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_COFFEE_TABLE, PAD_ELD_01AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_COFFEE_TABLE, PAD_ELD_01AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x00, 1) + stdobject(0x0100, MODEL_DROPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x01, 1) + weapon(0x0100, MODEL_CHRDATATHIEF, PAD_ELD_00BF, OBJFLAG_00000001, 0, 0, WEAPON_LAPTOPGUN) + rename_object(-1, WEAPON_LAPTOPGUN, L_ELD_027, L_ELD_027, L_ELD_027, L_ELD_027, L_ELD_027) // "PC gun" + tag(0x89, 1) + weapon(0x0100, MODEL_CHRDATATHIEF, PAD_ELD_00BF, OBJFLAG_00000001, 0, 0, WEAPON_LAPTOPGUN) + rename_object(-1, WEAPON_LAPTOPGUN, L_ELD_027, L_ELD_027, L_ELD_027, L_ELD_027, L_ELD_027) // "PC gun" + tag(0x02, 1) + weapon(0x0100, MODEL_CHRDATATHIEF, PAD_ELD_00C0, OBJFLAG_00000001, 0, 0, WEAPON_SNIPERRIFLE) + rename_object(-1, WEAPON_SNIPERRIFLE, L_ELD_028, L_ELD_028, L_ELD_028, L_ELD_028, L_ELD_028) // "Sniper rifle" + tag(0x8a, 1) + weapon(0x0100, MODEL_CHRDATATHIEF, PAD_ELD_00C0, OBJFLAG_00000001, 0, 0, WEAPON_SNIPERRIFLE) + rename_object(-1, WEAPON_SNIPERRIFLE, L_ELD_028, L_ELD_028, L_ELD_028, L_ELD_028, L_ELD_028) // "Sniper rifle" + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01EF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x8c, 1) + stdobject(0x0100, MODEL_CV_CHAIR4, PAD_ELD_01F0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01F1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_CV_CHAIR4, PAD_ELD_01F2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01F4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x8d, 1) + stdobject(0x0100, MODEL_CV_CHAIR4, PAD_ELD_01F3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01F5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x8b, 1) + stdobject(0x0100, MODEL_CV_CHAIR4, PAD_ELD_01F6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x0b, 4) + tag(0x0c, 4) + tag(0x0d, 4) + tag(0x0e, 4) + singlemonitor(0x0100, MODEL_GOODPC, PAD_ELD_01F9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_GOODPC, PAD_ELD_01FA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_GOODPC, PAD_ELD_01F8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0100, MODEL_GOODPC, PAD_ELD_01F7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + tag(0x04, 3) + tag(0x03, 3) + tag(0x05, 3) + multimonitor(0x0099, MODEL_CIHUB, PAD_ELD_01FC, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INTERACTCHECKLOS, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + multimonitor(0x0099, MODEL_CIHUB, PAD_ELD_01FB, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INTERACTCHECKLOS, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + multimonitor(0x0099, MODEL_CIHUB, PAD_ELD_01FD, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INTERACTCHECKLOS, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_017F, OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0180, OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + tag(0x09, 1) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0187, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0188, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + tag(0x08, 1) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0183, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0184, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000040, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0185, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000600) + door(0x0100, MODEL_AIVILLADOOR2A, PAD_ELD_0186, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0a, 1) + key(0x0080, MODEL_KEYCARD, 0x004b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 64) + rename_object(-1, WEAPON_KEYCARD4A, L_ELD_030, L_ELD_031, L_ELD_032, L_ELD_033, L_ELD_034) // "Obtain door key." + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_01A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_SOFA, PAD_ELD_01A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_COFFEE_TABLE, PAD_ELD_01AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x014c, MODEL_DD_PLANTRUBBER, PAD_ELD_01FE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_ELD_01FF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0280, MODEL_DD_PLANTSPIKE, PAD_ELD_0200, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x014c, MODEL_DD_PLANTRUBBER, PAD_ELD_0201, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x014c, MODEL_DD_PLANTSPIDER, PAD_ELD_0202, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x014c, MODEL_DD_PLANTSPIKE, PAD_ELD_0203, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_PLANTRUBBER, PAD_ELD_0204, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0180, MODEL_DD_PLANTSPIDER, PAD_ELD_0205, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x014c, MODEL_DD_PLANTSPIKE, PAD_ELD_0206, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x014c, MODEL_DD_PLANTRUBBER, PAD_ELD_0207, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_ELD_0208, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0180, MODEL_DD_PLANTSPIKE, PAD_ELD_0209, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x014c, MODEL_DD_PLANTRUBBER, PAD_ELD_020A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_ELD_020B, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x014c, MODEL_DD_PLANTSPIKE, PAD_ELD_020C, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0133, MODEL_DD_PLANTSPIDER, PAD_ELD_020D, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIKE, PAD_ELD_020E, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_PLANTRUBBER, PAD_ELD_020F, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_ELD_0210, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x014c, MODEL_DD_PLANTSPIKE, PAD_ELD_0211, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0280, MODEL_DD_PLANTSPIKE, PAD_ELD_0212, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0100, MODEL_DD_PLANTSPIDER, PAD_ELD_0213, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, 0, 1000) + stdobject(0x0180, MODEL_DD_PLANTSPIKE, PAD_ELD_0214, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0180, MODEL_DD_PLANTSPIKE, PAD_ELD_0215, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0080, MODEL_DD_PLANTSPIKE, PAD_ELD_0216, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0080, MODEL_DD_PLANTSPIKE, PAD_ELD_0217, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0080, MODEL_DD_PLANTSPIKE, PAD_ELD_0218, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_ELD_021A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_ELD_021B, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_TABLE, PAD_ELD_01B0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_021C, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_021D, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_021E, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_021F, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_0220, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_0221, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_0222, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_0223, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_0224, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x00cc, MODEL_CV_CHAIR1, PAD_ELD_0225, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_ELD_0219, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_VILLASTOOL, PAD_ELD_0237, OBJFLAG_00000001 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CV_F_BED, PAD_ELD_0226, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0200, MODEL_CV_CABINET, PAD_ELD_0227, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0200, MODEL_CV_CABINET, PAD_ELD_0228, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x10, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_ELD_0238, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x11, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_ELD_0239, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_ELD_01EC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + weapon(0x0100, MODEL_CHRDEVASTATOR, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_INVINCIBLE | OBJFLAG_WEAPON_40000000, 0, 0, WEAPON_DEVASTATOR) + tag(0x99, -1) + endprops +}; + +s32 intro[] = { + spawn(PAD_ELD_00BE) + ammo(AMMOTYPE_RIFLE, 100) + ammo(AMMOTYPE_SMG, 100) + ammo(AMMOTYPE_DEVASTATOR, 3) + intro_weapon(WEAPON_UNARMED, -1) + intro_weapon(WEAPON_RTRACKER, -1) + endintro +}; + +s32 path00[] = { + PAD_ELD_0096, + PAD_ELD_008A, + PAD_ELD_008B, + PAD_ELD_008C, + PAD_ELD_0087, + PAD_ELD_0088, + PAD_ELD_0089, + PAD_ELD_0083, + PAD_ELD_0084, + PAD_ELD_0085, + -1, +}; + +s32 path01[] = { + PAD_ELD_0085, + PAD_ELD_0084, + PAD_ELD_0083, + PAD_ELD_0089, + PAD_ELD_0088, + PAD_ELD_0087, + PAD_ELD_008C, + PAD_ELD_008B, + PAD_ELD_008A, + PAD_ELD_0096, + -1, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_20) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1002_intro_from_menu[] = { + set_stage_flag(STAGEFLAG_PLAYING_INTRO_FROM_MENU) + set_ailist(CHR_SELF, AILIST_INTRO) + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + camera_movement(ANIM_CUT_ELD_INTRO_CAM_01) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + if_stage_flag_eq(STAGEFLAG_PLAYING_INTRO_FROM_MENU, TRUE, /*goto*/ 0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + label(0x2e) + chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + remove_chr(CHR_NEGOTIATOR) + play_cutscene_track(MUSIC_VILLA_INTRO3) + goto_next(0x06) + label(0x2d) + play_cutscene_track(MUSIC_VILLA_INTRO2) + chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 4) + label(0x06) + set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) + set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) + enable_object(OBJ_DROPSHIP) + set_object_flag2(OBJ_DROPSHIP, OBJFLAG2_04000000) + set_object_flag3(OBJ_DROPSHIP, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_ELD_INTRO_DROPSHIP_01, OBJ_DROPSHIP, 0x04, 0xffff) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x56) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + \ + label(0x06) + + wait_until(205, 0xab) + speak(CHR_BOND, L_ELD_039, MP3_03FF, CHANNEL_4, COLOR_09_BLUE) // "Agent Dark Mission Log, 1846 hours. Last night we ..." + + wait_until(680, 0x66) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(687, 0x67) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(708, 0x68) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(716, 0x69) + play_sound(SFX_0164, CHANNEL_7) + + wait_until(914, 0x6a) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(1010, 0x6b) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(1048, 0x6c) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(1075, 0x6d) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(1100, 0xac) + speak(CHR_BOND, L_ELD_040, MP3_0400, CHANNEL_4, COLOR_09_BLUE) // "Unfortunately, we don't have it. Daniel and Dr. Ca..." + + wait_until(1118, 0x6e) + play_sound(SFX_0162, CHANNEL_7) + + wait_until(1148, 0x6f) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(1175, 0x70) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(1193, 0x71) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(1214, 0x72) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(1313, 0x73) + play_sound(SFX_0164, CHANNEL_7) + + wait_until(1313, 0x74) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(1331, 0x75) + play_sound(SFX_0174, CHANNEL_7) + + wait_until(1348, 0x76) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(1366, 0x77) + play_sound(SFX_0162, CHANNEL_7) + + wait_until(1386, 0x78) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(1390, 0x79) + play_sound(SFX_0164, CHANNEL_7) + + wait_until(1450, 0x7a) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(1458, 0x7b) + play_sound(SFX_0164, CHANNEL_7) + + wait_until(1519, 0x7c) + play_sound(SFX_0162, CHANNEL_7) + + wait_until(1544, 0x7d) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(1554, 0x7e) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(1592, 0x7f) + play_sound(SFX_0162, CHANNEL_7) + + wait_until(1618, 0x81) + play_sound(SFX_0163, CHANNEL_7) + + wait_until(1645, 0x82) + play_sound(SFX_0162, CHANNEL_7) + + wait_until(1654, 0x83) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(1657, 0x84) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(1679, 0x85) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(1683, 0x86) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(1692, 0x87) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(1716, 0x88) + play_sound(SFX_0164, CHANNEL_6) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x56) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x56) + label(0x2d) + endloop(0x08) + + label(0x56) + if_controller_button_pressed(/*goto*/ 0x56) + camera_movement(ANIM_CUT_ELD_INTRO_CAM_02) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + if_stage_flag_eq(STAGEFLAG_PLAYING_INTRO_FROM_MENU, TRUE, /*goto*/ 0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + label(0x2e) + chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + goto_next(0x06) + label(0x2d) + chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 4) + label(0x06) + + set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) + + set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) + + restart_timer + + wait_until(50, 0xaa) + speak(CHR_BOND, L_ELD_041, MP3_0401, CHANNEL_4, COLOR_09_BLUE) // "Hopefully our phoney negotiator ploy will give me ..." + + restart_timer + wait_until(295, 0x89) + play_sound(SFX_0179, CHANNEL_6) + + wait_until(302, 0x8a) + play_sound(SFX_017A, CHANNEL_7) + + wait_until(333, 0x8b) + play_sound(SFX_017B, CHANNEL_7) + + wait_until(338, 0x8c) + play_sound(SFX_017A, CHANNEL_6) + + wait_until(344, 0x8d) + play_sound(SFX_017C, CHANNEL_7) + + wait_until(353, 0x8e) + play_sound(SFX_0179, CHANNEL_6) + + wait_until(372, 0x8f) + play_sound(SFX_017A, CHANNEL_6) + + wait_until(412, 0x90) + play_sound(SFX_017A, CHANNEL_6) + + wait_until(415, 0x91) + play_sound(SFX_017B, CHANNEL_7) + + wait_until(466, 0x92) + play_sound(SFX_0179, CHANNEL_6) + + wait_until(472, 0x93) + play_sound(SFX_017C, CHANNEL_7) + + wait_until(515, 0x94) + play_sound(SFX_017A, CHANNEL_6) + + wait_until(533, 0x95) + play_sound(SFX_017B, CHANNEL_6) + + wait_until(535, 0x96) + + wait_until(561, 0x97) + play_sound(SFX_017B, CHANNEL_6) + + wait_until(570, 0x98) + play_sound(SFX_017C, CHANNEL_7) + + wait_until(572, 0x99) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x56) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x56) + label(0x2d) + endloop(0x09) + + label(0x56) + if_stage_flag_eq(STAGEFLAG_PLAYING_INTRO_FROM_MENU, TRUE, /*goto*/ 0x4f) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x4e) + goto_next(0x4f) + label(0x4e) + camera_movement(ANIM_CUT_ELD_INTRO_CAM_03) + cmd0175(60) + if_controller_button_pressed(/*goto*/ 0x56) + + set_chr_chrflag(CHR_NEGOTIATOR, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_NEGOTIATOR, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_NEGOTIATOR, CHRHFLAG_00020000) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 4) + + set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) + + set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + enable_object(OBJ_DROPSHIP) + set_object_flag2(OBJ_DROPSHIP, OBJFLAG2_04000000) + set_object_flag3(OBJ_DROPSHIP, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_ELD_INTRO_DROPSHIP_02, OBJ_DROPSHIP, 0x04, 0xffff) + + restart_timer + + wait_until(238, 0x9e) + play_sound(SFX_046E, CHANNEL_6) + + wait_until(305, 0x9f) + play_sound(SFX_JO_LANDING_046F, CHANNEL_6) + + wait_until(313, 0xa0) + play_sound(SFX_04AE, CHANNEL_7) + + wait_until(350, 0xa1) + play_sound(SFX_0085, CHANNEL_6) + + wait_until(380, 0xa2) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(381, 0xa3) + play_sound(SFX_0162, CHANNEL_7) + + wait_until(400, 0xa4) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(429, 0xa5) + play_sound(SFX_0164, CHANNEL_6) + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x56) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x56) + label(0x2d) + endloop(0x0a) + + label(0x56) + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + label(0x06) + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_1) + mute_channel(CHANNEL_2) + mute_channel(CHANNEL_3) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_JO_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(CHR_NEGOTIATOR, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_NEGOTIATOR, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 2) + + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 2) + + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 2) + + disable_object(OBJ_DROPSHIP) + stop_cutscene_track + stop_ambient_track + play_x_track(XREASON_DEFAULT, 10, 30) + unset_stage_flag(STAGEFLAG_PLAYING_INTRO_FROM_MENU) + enter_firstperson + yield + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_NEGOTIATOR, 2) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_TAKER1, 2) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_TAKER2, 2) + set_ailist(CHR_TAKER1, AILIST_INIT_TAKER) + set_ailist(CHR_TAKER2, AILIST_INIT_TAKER) + set_ailist(CHR_NEGOTIATOR, AILIST_NEGOTIATOR) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x4f) + camera_movement(ANIM_CUT_ELD_INTRO_CAM_04) + cmd0175(60) + disable_object(OBJ_DROPSHIP) + if_controller_button_pressed(/*goto*/ 0x56) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) + set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) + restart_timer + + beginloop(0xa6) + if_controller_button_pressed(/*goto*/ 0x56) + if_timer_gt(17, /*goto*/ 0x06) + goto_first(0xa6) + + label(0x06) + play_sound(SFX_0179, CHANNEL_6) + + beginloop(0xa7) + if_controller_button_pressed(/*goto*/ 0x56) + if_timer_gt(60, /*goto*/ 0x06) + goto_first(0xa7) + + label(0x06) + play_sound(SFX_017A, CHANNEL_6) + + beginloop(0xa8) + if_controller_button_pressed(/*goto*/ 0x56) + if_timer_gt(96, /*goto*/ 0x06) + goto_first(0xa8) + + label(0x06) + play_sound(SFX_017B, CHANNEL_6) + + beginloop(0xa9) + if_controller_button_pressed(/*goto*/ 0x56) + if_timer_gt(144, /*goto*/ 0x06) + goto_first(0xa9) + + label(0x06) + play_sound(SFX_017C, CHANNEL_6) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x56) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x56) + label(0x2d) + goto_first(0x0b) + + label(0x56) + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + + label(0x06) + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_1) + mute_channel(CHANNEL_2) + mute_channel(CHANNEL_3) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) + set_chr_chrflag(CHR_TAKER1, CHRCFLAG_00000001) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 2) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) + set_chr_chrflag(CHR_TAKER2, CHRCFLAG_00000001) + chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 2) + disable_object(OBJ_DROPSHIP) + stop_cutscene_track + stop_ambient_track + play_x_track(XREASON_DEFAULT, 10, 30) + enter_firstperson + yield + set_ailist(CHR_TAKER1, AILIST_TAKER) + set_ailist(CHR_TAKER2, AILIST_TAKER) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c02_outro_from_menu[] = { + set_ailist(CHR_CARRINGTON, GAILIST_IDLE) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func0408_outro[] = { + camera_movement(ANIM_CUT_ELD_OUTRO_CAM) + play_cutscene_track(MUSIC_VILLA_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNEXPLODABLE) + + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_CARRINGTON, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_ELD_OUTRO_CARR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 4) + + show_nonessential_chrs(FALSE) + restart_timer + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + + #define outro_wait_until1(time, msg, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x56) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + #define outro_wait_until2(time, msg1, msg2, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x56) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + outro_wait_until1(14, '1', 0x66) + play_sound(SFX_FOOTSTEP_80D0, CHANNEL_7) + + outro_wait_until1(36, '2', 0x67) + play_sound(SFX_FOOTSTEP_80D1, CHANNEL_6) + + outro_wait_until1(40, '3', 0x68) + speak(CHR_P1P2, L_ELD_042, MP3_0402, CHANNEL_4, COLOR_09_BLUE) // "Sir? Are you injured?" + + outro_wait_until1(58, '4', 0xad) + play_sound(SFX_FOOTSTEP_80D2, CHANNEL_7) + + outro_wait_until1(80, '5', 0x69) + play_sound(SFX_FOOTSTEP_80D3, CHANNEL_7) + + outro_wait_until1(102, '6', 0x6a) + play_sound(SFX_FOOTSTEP_80D0, CHANNEL_7) + + outro_wait_until1(142, '7', 0x6b) + play_sound(SFX_FOOTSTEP_80D1, CHANNEL_7) + + outro_wait_until1(164, '8', 0x6c) + play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) + + outro_wait_until1(165, '9', 0xae) + speak(CHR_P1P2, L_ELD_043, MP3_0403, CHANNEL_4, COLOR_05_GREEN) // "No, Joanna, I'm okay, but those dataDyne thugs mad..." + + outro_wait_until2(195, '1','0', 0x6d) + play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) + + outro_wait_until2(213, '1','1', 0x6e) + play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) + + outro_wait_until2(231, '1','2', 0x6f) + play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) + + outro_wait_until2(235, '1','3', 0x70) + play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) + + // @bug: No check for button presses for about 8 seconds while Carrington is + // saying the above line. + beginloop(0xaf) + if_timer_gt(738, /*goto*/ 0x06) + endloop(0xaf) + + label(0x06) + speak(CHR_P1P2, L_ELD_044, MP3_0404, CHANNEL_4, COLOR_09_BLUE) // "It's not your fault, sir. I should have been quick..." + + outro_wait_until2(956, '1','5', 0xb0) + speak(CHR_P1P2, L_ELD_045, MP3_0405, CHANNEL_4, COLOR_05_GREEN) // "Don't blame yourself, Joanna. Dr. Caroll told me t..." + + outro_wait_until2(2280, '2','2', 0xb1) + speak(CHR_P1P2, L_ELD_046, MP3_0406, CHANNEL_4, COLOR_09_BLUE) // "That won't be a problem, sir. So, did Dr. Caroll h..." + + outro_wait_until2(2457, '1','6', 0x71) + play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) + + outro_wait_until2(2496, '1','7', 0x72) + play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) + + outro_wait_until2(2620, '2','6', 0x7a) + speak(CHR_P1P2, L_ELD_047, MP3_0407, CHANNEL_5, COLOR_05_GREEN) // "Oh, yes, indeed. He certainly did, and I'll brief ..." + + outro_wait_until2(2730, '1','8', 0x73) + play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) + + outro_wait_until2(2808, '1','9', 0x74) + play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) + + outro_wait_until2(2861, '2','0', 0x75) + play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) + + outro_wait_until2(3030, '2','1', 0x76) + play_sound(SFX_FOOTSTEP_80D1, CHANNEL_7) + + outro_wait_until2(3098, '2','3', 0x77) + play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) + + outro_wait_until2(3194, '2','4', 0x78) + play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) + + outro_wait_until2(3276, '2','5', 0x79) + play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) + + outro_wait_until2(3370, '2','7', 0x7b) + play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) + + outro_wait_until2(3463, '2','8', 0x7c) + play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) + + outro_wait_until2(3503, '2','9', 0x7d) + play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) + + outro_wait_until2(3545, '3','0', 0x7e) + play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x56) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x56) + label(0x2d) + endloop(0x08) + + label(0x56) + label(0x06) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + stop_cutscene_track + stop_ambient_track + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_give_items[] = { + yield + yield + yield + yield + label(0x04) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + + // PA + give_object_to_chr(0x01, CHR_BOND) + give_object_to_chr(0x89, CHR_COOP) + chr_draw_weapon(CHR_BOND, WEAPON_UNARMED) + chr_draw_weapon(CHR_COOP, WEAPON_UNARMED) + disable_object(0x02) + disable_object(0x8a) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // A and SA + label(0x06) + give_object_to_chr(0x02, CHR_BOND) + give_object_to_chr(0x8a, CHR_COOP) + chr_draw_weapon(CHR_BOND, WEAPON_SNIPERRIFLE) + chr_draw_weapon(CHR_COOP, WEAPON_SNIPERRIFLE) + disable_object(0x01) + disable_object(0x89) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Velvet doesn't exist + label(0x08) + disable_object(0x8a) + disable_object(0x89) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_check_negotiator[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x04) + goto_next(0x2d) + + // A and SA + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_NEGOTIATOR_ESCAPED, TRUE, /*goto*/ 0x2d) + if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + show_hudmsg(CHR_BOND, L_ELD_011) // "Negotiator has been killed." + set_stage_flag(STAGEFLAG_NEGOTIATOR_DEAD) + + // PA + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0401_init_taker[] = { + set_chr_maxdamage(CHR_SELF, 1) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) + unset_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) + label(0x2d) + set_ailist(CHR_SELF, AILIST_TAKER) + endlist +}; + +u8 func0402_taker[] = { + set_self_chrflag(CHRCFLAG_00000040) + yield + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + + // PA + set_shotlist(GAILIST_ALERTED) + goto_next(0x06) + + // A and SA + label(0x2d) + set_shotlist(AILIST_TAKER) + + // All difficulties + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x61) + goto_next(0x03) + + // Wait for injury recovery + beginloop(0x61) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x61) + + // Injury recovered + label(0x2d) + goto_next(0x6f) + + label(0x03) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) + if_self_flag_bankx_eq(CHRFLAG0_HOLD_POSITION, TRUE, BANK_0, /*goto*/ 0x6f) + set_self_flag_bankx(CHRFLAG0_HOLD_POSITION, BANK_0) + label(0x2d) + restart_timer + if_difficulty_lt(DIFF_PA, /*goto*/ 0x63) + + label(0x60) + if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x06) + goto_next(0x03) + label(0x06) + set_target_chr(CHR_BOND) + label(0x03) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x05) + + beginloop(0x05) + if_distance_to_target_gt(1000, /*goto*/ 0x2e) + if_distance_to_target_lt(300, /*goto*/ 0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + if_chr_weapon_equipped(CHR_BOND, WEAPON_LAPTOPGUN, /*goto*/ 0x0b) + label(0x2d) + if_timer_gt(600, /*goto*/ 0x06) + endloop(0x05) + + // Jo got away + label(0x2e) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + // Jo got too close + label(0x06) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + // Laptop gun equipped + label(0x0b) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + restart_timer + chr_do_animation(ANIM_SURPRISED_0202, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x5f) + if_timer_gt(180, /*goto*/ 0x5e) + endloop(0x5f) + + label(0x5e) + goto_first(0x60) + + label(0x63) + restart_timer + set_target_chr(CHR_NEGOTIATOR) + label(0x03) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_ELD_0236, /*goto*/ 0x06) + label(0x2d) + if_self_flag_bankx_eq(CHRFLAG0_CAN_FLEESURRENDER, TRUE, BANK_0, /*goto*/ 0x06) + set_target_chr(CHR_NEGOTIATOR) + if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x10) + if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x10) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + if_timer_gt(600, /*goto*/ 0x06) + reloop(0x04) + + label(0x2d) + if_timer_gt(900, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_chr_flag_bankx(CHR_TAKER1, CHRFLAG0_CAN_FLEESURRENDER, BANK_0) + set_chr_flag_bankx(CHR_TAKER2, CHRFLAG0_CAN_FLEESURRENDER, BANK_0) + restart_timer + + beginloop(0x0c) + if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x10) + if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x10) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + if_timer_gt(600, /*goto*/ 0x06) + reloop(0x0c) + + label(0x2d) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x0c) + + // Shoot + label(0x6f) + label(0x06) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + + beginloop(0x08) + if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x06) + if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x10) + if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x10) + goto_first(0x03) + + label(0x10) + try_walk_to_target(/*goto*/ 0x0d) + + beginloop(0x0d) + if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, FALSE, BANK_0, /*goto*/ 0x06) + if_distance_to_target_lt(200, /*goto*/ 0x2d) + reloop(0x0d) + + label(0x06) + if_distance_to_target_lt(200, /*goto*/ 0x2d) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x0d) + + label(0x2d) + if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x06) + chr_do_animation(ANIM_01FD, 0, -1, 0, 10, CHR_SELF, 2) + goto_next(0x0e) + label(0x06) + chr_do_animation(ANIM_TALKING_0232, 0, -1, 0, 10, CHR_SELF, 2) + + beginloop(0x0e) + if_saw_injury(0x00, /*goto*/ 0x2e) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x0e) + + label(0x2d) + if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x2d) + walk_to_pad(PAD_ELD_004F) + goto_next(0x11) + label(0x2d) + walk_to_pad(PAD_ELD_004F) + + beginloop(0x11) + if_saw_injury(0x00, /*goto*/ 0x2e) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x11) + + label(0x2d) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2e) + stop_chr + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_check_takers_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_TAKER1, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_deadish(CHR_TAKER2, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + set_stage_flag(STAGEFLAG_TAKERS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0403_negotiator[] = { + set_chr_maxdamage(CHR_SELF, 1) + stop_chr + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_TAKERS_DEAD, TRUE, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + run_to_pad(PAD_ELD_004F) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + show_hudmsg(CHR_BOND, L_ELD_013) // "Negotiator has escaped to safety." + set_stage_flag(STAGEFLAG_NEGOTIATOR_ESCAPED) + stop_x_track(XREASON_DEFAULT) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_toggle_snipers[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + goto_next(0x2e) + + // A and SA + label(0x2d) + disable_chr(CHR_SNIPER1) + disable_chr(CHR_SNIPER2) + disable_chr(CHR_SNIPER3) + disable_chr(CHR_SNIPER4) + disable_chr(CHR_SNIPER5) + disable_chr(CHR_SNIPER6) + disable_chr(CHR_SNIPER7) + disable_chr(CHR_SNIPER8) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x06) + endloop(0x08) + + // PA + label(0x2e) + disable_chr(CHR_SNIPER1) + disable_chr(CHR_SNIPER2) + disable_chr(CHR_SNIPER3) + disable_chr(CHR_SNIPER4) + disable_chr(CHR_SNIPER6) + disable_chr(CHR_SNIPER7) + set_ailist(CHR_SNIPER5, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER8, AILIST_ENABLE_SNIPER) + + // Room 0x004e is the dock, ramp, and wooden floor at the top of the ramp. + // @bug: When using small characters or play as Elvis cheats, the height + // criteria is not met so the snipers cannot be unhidden. Fixed in PAL. + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) +#if VERSION >= VERSION_PAL_FINAL + if_chr_y(CHR_P1P2, -550, OPERATOR_LESS_THAN, /*goto*/ 0x2d) +#else + if_chr_y(CHR_P1P2, -500, OPERATOR_LESS_THAN, /*goto*/ 0x2d) +#endif + if_chr_in_room(CHR_P1P2, 0x00, 0x004e, /*goto*/ 0x06) + label(0x2d) + endloop(0x09) + + // All difficulties + label(0x06) + enable_chr(CHR_SNIPER1) + yield + enable_chr(CHR_SNIPER2) + yield + enable_chr(CHR_SNIPER3) + yield + enable_chr(CHR_SNIPER4) + yield + enable_chr(CHR_SNIPER6) + yield + enable_chr(CHR_SNIPER7) + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + goto_next(0x06) + + // A and SA + label(0x2d) + yield + enable_chr(CHR_SNIPER5) + yield + enable_chr(CHR_SNIPER8) + rebuild_teams + rebuild_squadrons + + // All difficulties + label(0x06) + set_ailist(CHR_SNIPER1, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER2, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER3, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER4, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER5, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER6, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER7, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SNIPER8, AILIST_ENABLE_SNIPER) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0404_sniper[] = { + stop_chr + set_shotlist(AILIST_SNIPER) + set_target_chr(CHR_BOND) + if_chr_dead(CHR_SELF, /*goto*/ 0x64) + if_self_flag_bankx_eq(CHRFLAG0_COVER_TYPE2, TRUE, BANK_0, /*goto*/ 0x04) + + beginloop(0x60) + if_near_miss(/*goto*/ 0x04) + if_stage_flag_eq(STAGEFLAG_TAKERS_DEAD, TRUE, /*goto*/ 0x2d) + endloop(0x60) + + label(0x2d) + restart_timer + + beginloop(0x11) + if_near_miss(/*goto*/ 0x04) + if_chr_in_view(/*goto*/ 0x04) + if_timer_gt(300, /*goto*/ 0x04) + endloop(0x11) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x58) + + // Choose a direction to face + call_rng + if_rand_lt(64, /*goto*/ 0x59) + if_rand_lt(128, /*goto*/ 0x5a) + if_rand_lt(196, /*goto*/ 0x5b) + try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0, /*goto*/ 0x06) + reloop(0x04) + + label(0x59) + try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0x4000, /*goto*/ 0x06) + reloop(0x04) + + label(0x5a) + try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0x8000, /*goto*/ 0x06) + reloop(0x04) + + label(0x5b) + try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0xc000, /*goto*/ 0x06) + reloop(0x04) + + // Not actually running to a pad. Just waiting 2 seconds for the change + // in direction, or until detected player. + label(0x06) + restart_timer + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x58) + if_saw_death(0x00, /*goto*/ 0x58) + if_saw_injury(0x00, /*goto*/ 0x58) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + // 2 seconds passed + label(0x06) + restart_timer + + label(0x10) + // 4 in 255 chance of looking around, + // and the animation used is random too. + call_rng + if_rand_gt(3, /*goto*/ 0x0b) + call_rng + if_rand_lt(64, /*goto*/ 0x59) + if_rand_lt(128, /*goto*/ 0x5a) + if_rand_lt(196, /*goto*/ 0x5b) + chr_do_animation(ANIM_LOOK_AROUND_025B, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) + goto_next(0x0b) + label(0x59) + chr_do_animation(ANIM_LOOK_AROUND_025C, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) + goto_next(0x0b) + label(0x5a) + chr_do_animation(ANIM_LOOK_AROUND_025D, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) + goto_next(0x0b) + label(0x5b) + chr_do_animation(ANIM_LOOK_AROUND_025E, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) + + label(0x0b) + yield + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x58) + if_saw_death(0x00, /*goto*/ 0x58) + if_saw_injury(0x00, /*goto*/ 0x58) + call_rng + if_rand_gt(3, /*goto*/ 0x2d) + if_timer_gt(600, /*goto*/ 0x06) + label(0x2d) + if_chr_idle(/*goto*/ 0x2d) + goto_first(0x10) + + label(0x2d) + goto_first(0x0b) + + label(0x06) + goto_first(0x04) + + // Detected player + label(0x58) + if_can_see_attack_target(/*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + restart_timer + label(0x06) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x08) + reloop(0x04) + + label(0x08) + yield + label(0x06) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + reloop(0x04) + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x09) + + label(0x06) + endloop(0x04) + + label(0x64) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_check_snipers_dead[] = { + beginloop(0x04) + if_chr_dead(CHR_SNIPER1, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER1, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER2, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER2, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER3, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER3, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER4, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER4, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER5, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER5, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER6, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER6, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER7, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER7, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_dead(CHR_SNIPER8, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_SNIPER8, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + show_hudmsg(CHR_BOND, L_ELD_012) // "Snipers have been eliminated." + set_stage_flag(STAGEFLAG_SNIPERS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_cooling_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_COOLING_SWITCH, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_COOLING_SWITCH, TRUE) + if_stage_flag_eq(STAGEFLAG_COOLING_ACTIVE, TRUE, /*goto*/ 0x06) + show_hudmsg(CHR_P1P2, L_ELD_014) // "Cooling systems have been activated." + set_stage_flag(STAGEFLAG_COOLING_ACTIVE) + assign_sound(SFX_8148, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_COOLING_SWITCH, TRUE) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + assign_sound(SFX_811C, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_COOLING_SWITCH, 1, 1200, 1600) + reloop(0x04) + + label(0x06) + mute_channel(CHANNEL_1) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_COOLING_SWITCH, TRUE) + if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, FALSE, /*goto*/ 0x2d) + show_hudmsg(CHR_P1P2, L_ELD_048) // "Operation denied - windmill is active." + goto_next(0x67) + label(0x2d) + assign_sound(SFX_8149, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_COOLING_SWITCH, TRUE) + show_hudmsg(CHR_P1P2, L_ELD_015) // "Cooling systems have been deactivated." + unset_stage_flag(STAGEFLAG_COOLING_ACTIVE) + label(0x67) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func1008_power_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_POWER_SWITCH, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_POWER_SWITCH, TRUE) + if_stage_flag_eq(STAGEFLAG_POWER_ACTIVE, TRUE, /*goto*/ 0x06) + show_hudmsg(CHR_P1P2, L_ELD_016) // "Power systems have been activated." + set_stage_flag(STAGEFLAG_POWER_ACTIVE) + assign_sound(SFX_8148, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_POWER_SWITCH, TRUE) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + assign_sound(SFX_8146, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_POWER_SWITCH, 1, 1200, 1600) + reloop(0x04) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_POWER_SWITCH, TRUE) + if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, FALSE, /*goto*/ 0x2d) + show_hudmsg(CHR_P1P2, L_ELD_048) // "Operation denied - windmill is active." + goto_next(0x67) + label(0x2d) + assign_sound(SFX_8149, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_POWER_SWITCH, TRUE) + show_hudmsg(CHR_P1P2, L_ELD_017) // "Power systems have been deactivated." + unset_stage_flag(STAGEFLAG_POWER_ACTIVE) + label(0x67) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func1009_windmill_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_WINDMILL_SWITCH, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_COOLING_ACTIVE, FALSE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_POWER_ACTIVE, FALSE, /*goto*/ 0x06) + + // Activating + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_WINDMILL_SWITCH, TRUE) + assign_sound(SFX_8148, CHANNEL_2) + control_sound_from_object(CHANNEL_2, OBJ_WINDMILL_SWITCH, TRUE) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + assign_sound(SFX_0438, CHANNEL_2) + play_sound_from_object(CHANNEL_2, OBJ_WINDMILL_SWITCH, 1, 1800, 2400) + show_hudmsg(CHR_P1P2, L_ELD_018) // "Windmill has been reactivated." + yield + set_stage_flag(STAGEFLAG_WINDMILL_ACTIVATED) + set_object_flag2(OBJ_WINDMILL, OBJFLAG2_AICANNOTUSE) + unlock_door(0x06, 0x02) + unlock_door(0x07, 0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Cooling and power not active + label(0x06) + assign_sound(SFX_MENU_SUBFOCUS, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_WINDMILL_SWITCH, TRUE) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func100a_check_switches_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(0x03, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_COOLING_ACTIVE, TRUE, /*goto*/ 0x2d) + show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + if_object_in_good_condition(0x04, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_POWER_ACTIVE, TRUE, /*goto*/ 0x2d) + show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + if_object_in_good_condition(0x05, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, TRUE, /*goto*/ 0x2d) + show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func100b_invoke_hackers[] = { + yield + yield + yield + yield + yield + disable_chr(CHR_HACKER1) + disable_chr(CHR_HACKER2) + disable_chr(CHR_HACKER3) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + goto_next(0x04) + + // A or SA - exit + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // PA - wait for windmill + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + // Wait 10 seconds + label(0x06) + restart_timer + + beginloop(0x08) + if_timer_gt(600, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + speak(CHR_BOND, L_ELD_022, SFX_819F, CHANNEL_4, COLOR_05_GREEN) // "Joanna! It's Grimshaw. We've got hackers at the vi..." + set_stage_flag(STAGEFLAG_HACKERS_STARTED) + set_object_flag3(0x0b, OBJFLAG3_RTRACKED_YELLOW) + set_object_flag3(0x0d, OBJFLAG3_RTRACKED_YELLOW) + enable_chr(CHR_HACKER1) + yield + enable_chr(CHR_HACKER2) + yield + enable_chr(CHR_HACKER3) + yield + set_ailist(CHR_HACKER1, AILIST_HACKER) + set_ailist(CHR_HACKER2, AILIST_HACKER) + set_ailist(CHR_HACKER3, AILIST_HACKER) + unset_chr_chrflag(CHR_HACKER1, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_HACKER2, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_HACKER3, CHRCFLAG_HIDDEN) + rebuild_teams + rebuild_squadrons + play_x_track(XREASON_DEFAULT, 10, 60) + set_countdown_timer(60) + show_countdown_timer + start_countdown_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_HACKERS_DEAD, TRUE, /*goto*/ 0x2d) + if_countdown_timer_lt(1, /*goto*/ 0x06) + endloop(0x09) + + // Timer expired + label(0x06) + show_hudmsg(CHR_BOND, L_ELD_023) // "Hackers have uploaded vital data." + set_stage_flag(STAGEFLAG_HACKERS_SUCCEEDED) + + // Hackers dead + label(0x2d) + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0406_init_hacker[] = { + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0405_hacker[] = { + chr_do_animation(ANIM_SITTING_TYPING, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_HACKERS_SUCCEEDED, TRUE, /*goto*/ 0x2d) + if_can_see_target(/*goto*/ 0x09) + endloop(0x04) + + // Hackers succeeded + label(0x2d) + run_to_pad(PAD_ELD_0070) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x09) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + // Reached pad + label(0x06) + stop_chr + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Sees player + label(0x09) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func100c_check_hackers_dead[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + + beginloop(0x04) + // Wait for hackers to start + if_stage_flag_eq(STAGEFLAG_HACKERS_STARTED, TRUE, /*goto*/ 0x2d) + reloop(0x04) + + // Wait until they're all dead + label(0x2d) + yield + yield + yield + yield + yield + yield + if_chr_deadish(CHR_HACKER1, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_deadish(CHR_HACKER2, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_deadish(CHR_HACKER3, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + if_stage_flag_eq(STAGEFLAG_HACKERS_SUCCEEDED, TRUE, /*goto*/ 0x2d) + show_hudmsg(CHR_BOND, L_ELD_024) // "Hackers have been eliminated." + set_stage_flag(STAGEFLAG_HACKERS_DEAD) + + // Hackers succeeded + label(0x2d) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_check_objectives_complete[] = { + // @bug: This loop waits until the door is fully open, which allows the + // player to enter the cellar while closing the door behind them and then + // mess with Carrington. + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_door_state(0x09, DOORSTATE_OPEN, /*goto*/ 0x2d) + if_door_state(0x08, DOORSTATE_OPEN, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + show_hudmsg(CHR_P1P2, L_ELD_025) // "Carrington has been rescued." + set_stage_flag(STAGEFLAG_CARRINGTON_RESCUED) + yield + yield + set_invincible(CHR_BOND) + revoke_control(CHR_BOND, 4) + hide_countdown_timer + stop_countdown_timer + if_all_objectives_complete(/*goto*/ 0x5c) + show_hudmsg(CHR_BOND, L_ELD_026) // "All objectives not completed - mission failed." + + // If all objectives aren't complete, the player is shown the message, but + // if the objective completes within the next 4 seconds you pass the level + // anyway. + label(0x2d) + restart_timer + + beginloop(0x5d) + if_timer_gt(280, /*goto*/ 0x5c) + endloop(0x5d) + + label(0x5c) + if_all_objectives_complete(/*goto*/ 0x2d) + + // Mission failed - objectives incomplete + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) + goto_next(0x06) + label(0x2d) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x06) + + // Mission failed - players dead + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_chr_deadish(CHR_CARRINGTON, /*goto*/ 0x2d) + + // Mission complete + set_ailist(CHR_SELF, AILIST_OUTRO) + + // Carrington died... somehow + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_set_pa_negotiator_flag[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_NEGOTIATOR_ESCAPED) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_setup_snipers[] = { + set_chr_special_death_animation(CHR_SNIPER7, SPECIALDIE_FALLBACK) + set_chr_special_death_animation(CHR_SNIPER4, SPECIALDIE_ROLL1) + set_chr_special_death_animation(CHR_SNIPER5, SPECIALDIE_ROLL2) + set_chr_special_death_animation(CHR_SNIPER3, SPECIALDIE_ROLL3) + set_chr_chrflag(CHR_SNIPER3, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER4, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER5, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER7, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER1, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER2, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER6, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_SNIPER8, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_check_guard_subdued[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + + beginloop(0x04) + if_num_subdued(0, OPERATOR_GREATER_THAN, /*goto*/ 0x06) + + // @bug? I think this is supposed to be if_stage_flag_eq... + // CHRFLAG0_ALERT_ON_HEARSPAWN uses the same bitmask as STAGEFLAG_GUARD_CAPTURED. + if_self_flag_bankx_eq(CHRFLAG0_ALERT_ON_HEARSPAWN, FALSE, BANK_0, /*goto*/ 0x66) + unset_stage_flag(STAGEFLAG_GUARD_CAPTURED) + label(0x66) + reloop(0x04) + + // Captured someone + label(0x06) + if_stage_flag_eq(STAGEFLAG_GUARD_CAPTURED, TRUE, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_ELD_029) // "Enemy guard has been subdued." + label(0x2e) +#if VERSION >= VERSION_NTSC_1_0 + unset_stage_flag(STAGEFLAG_FORGOT_TO_KO_GUARD) + yield +#endif + set_stage_flag(STAGEFLAG_GUARD_CAPTURED) + + beginloop(0x67) + if_num_subdued(1, OPERATOR_LESS_THAN, /*goto*/ 0x06) + endloop(0x67) + + label(0x06) + unset_stage_flag(STAGEFLAG_GUARD_CAPTURED) + endloop(0x04) + + // A and SA + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_give_keycard[] = { + set_chr_chrflag(CHR_BASEMENT1, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT2, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT3, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT4, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT5, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT6, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT7, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT8, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_KILLCOUNTABLE) + set_object_flag(OBJ_KEYCARD, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_KEYCARD, OBJFLAG2_INVISIBLE) + + // Wait until one basement guard remaining + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ONE_BASEMENT_GUARD_REMAINING, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + + #define give_keycard_if_alive(chr) \ + if_chr_deadish(chr, /*goto*/ 0x2d) \ + give_object_to_chr(OBJ_KEYCARD, chr) \ + goto_next(0x09) \ + label(0x2d) + + give_keycard_if_alive(CHR_BASEMENT1) + give_keycard_if_alive(CHR_BASEMENT2) + give_keycard_if_alive(CHR_BASEMENT3) + give_keycard_if_alive(CHR_BASEMENT4) + give_keycard_if_alive(CHR_BASEMENT5) + give_keycard_if_alive(CHR_BASEMENT6) + give_keycard_if_alive(CHR_BASEMENT7) + give_keycard_if_alive(CHR_BASEMENT8) + + give_object_to_chr(OBJ_KEYCARD, CHR_BASEMENT9) + goto_next(0x09) + label(0x2d) + + // Gave key + label(0x09) + unset_object_flag(OBJ_KEYCARD, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_KEYCARD, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_check_computers_destroyed[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) + + beginloop(0x04) + if_object_in_good_condition(OBJ_HACKERPC1, /*goto*/ 0x2d) + goto_next(0x08) + label(0x2d) + if_object_in_good_condition(OBJ_HACKERPC2, /*goto*/ 0x2d) + goto_next(0x08) + label(0x2d) + if_object_in_good_condition(OBJ_HACKERPC3, /*goto*/ 0x2d) + goto_next(0x08) + label(0x2d) + if_object_in_good_condition(OBJ_HACKERPC4, /*goto*/ 0x2d) + goto_next(0x08) + label(0x2d) + endloop(0x04) + + label(0x08) + show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_HACKER_PC_DESTROYED) + label(0x09) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_guard(accuracy, reaction, health, recovery) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(accuracy) \ + set_reaction_speed(reaction) \ + set_chr_maxdamage(CHR_SELF, health) \ + add_health_or_armor(0) \ + set_recovery_speed(recovery) \ + set_shield(0) + +u8 func040a_enable_sniper[] = { + init_guard(13, 15, 10, 15) + set_ailist(CHR_SELF, AILIST_SNIPER) + endlist +}; + +u8 func040c_init_type1_guard[] = { + init_guard(3, 15, 40, 0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040d_init_type2_guard[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + init_guard(15, 15, 40, 0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + label(0x2d) + init_guard(3, 15, 40, 0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040b_init_basement_guard[] = { + init_guard(13, 15, 40, 10) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1016_msg_generator[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0077, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + speak(CHR_P1P2, L_ELD_035, MP3_03AC, CHANNEL_6, COLOR_09_BLUE) // "If I get the wind generator back online, I'll get ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_msg_gottobequick[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + restart_timer + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + speak(CHR_BOND, L_ELD_036, MP3_03AD, CHANNEL_6, COLOR_09_BLUE) // "I've got to be quick, or they'll kill the negotiat..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_msg_hidingdaniel[] = { + // Wait for windmill activated + beginloop(0x04) + if_objective_complete(2, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) + if_objective_complete(3, /*goto*/ 0x08) // hackers objective + endloop(0x04) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + speak(CHR_P1P2, L_ELD_037, MP3_03AE, CHANNEL_6, COLOR_09_BLUE) // "Here's where they must be holding Daniel." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1019_msg_hackershavetobestopped[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_HACKERS_STARTED, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(450, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + speak(CHR_BOND, L_ELD_038, MP3_03AF, CHANNEL_6, COLOR_09_BLUE) // "Those hackers have to be stopped before I rescue D..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040e_start_path00[] = { + init_guard(3, 15, 40, 0) + assign_path(0) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040f_start_path01[] = { + init_guard(3, 15, 40, 0) + assign_path(1) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func101b_toggle_basement_chrs[] = { + yield + yield + disable_chr(CHR_BASEMENT1) + disable_chr(CHR_BASEMENT2) + disable_chr(CHR_BASEMENT3) + disable_chr(CHR_BASEMENT4) + disable_chr(CHR_BASEMENT5) + disable_chr(CHR_BASEMENT6) + disable_chr(CHR_BASEMENT7) + disable_chr(CHR_BASEMENT8) + disable_chr(CHR_CARRINGTON) + + // Not sure which room 0x0087 is + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0087, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + enable_chr(CHR_BASEMENT1) + yield + enable_chr(CHR_BASEMENT2) + yield + enable_chr(CHR_BASEMENT3) + yield + enable_chr(CHR_BASEMENT4) + yield + enable_chr(CHR_BASEMENT5) + yield + enable_chr(CHR_BASEMENT6) + yield + enable_chr(CHR_BASEMENT7) + yield + enable_chr(CHR_BASEMENT8) + yield + yield + enable_chr(CHR_CARRINGTON) + yield + rebuild_teams + rebuild_squadrons + + // Every 5 frames, check if the wine bottles are destroyed. + // There's a lot of stuff going on here without yielding. If you destroyed + // all bottles except 0x88 then you might have a choppy experience. + label(0x08) + restart_timer + + beginloop(0x09) + if_timer_gt(5, /*goto*/ 0x2d) + goto_first(0x09) + + label(0x2d) + if_object_in_good_condition(0x1e, /*goto*/ 0x06) + if_object_in_good_condition(0x1f, /*goto*/ 0x06) + if_object_in_good_condition(0x20, /*goto*/ 0x06) + if_object_in_good_condition(0x21, /*goto*/ 0x06) + if_object_in_good_condition(0x22, /*goto*/ 0x06) + if_object_in_good_condition(0x23, /*goto*/ 0x06) + if_object_in_good_condition(0x24, /*goto*/ 0x06) + if_object_in_good_condition(0x25, /*goto*/ 0x06) + if_object_in_good_condition(0x26, /*goto*/ 0x06) + if_object_in_good_condition(0x27, /*goto*/ 0x06) + if_object_in_good_condition(0x28, /*goto*/ 0x06) + if_object_in_good_condition(0x29, /*goto*/ 0x06) + if_object_in_good_condition(0x2a, /*goto*/ 0x06) + if_object_in_good_condition(0x2b, /*goto*/ 0x06) + if_object_in_good_condition(0x2c, /*goto*/ 0x06) + if_object_in_good_condition(0x2d, /*goto*/ 0x06) + if_object_in_good_condition(0x2e, /*goto*/ 0x06) + if_object_in_good_condition(0x2f, /*goto*/ 0x06) + if_object_in_good_condition(0x30, /*goto*/ 0x06) + if_object_in_good_condition(0x31, /*goto*/ 0x06) + if_object_in_good_condition(0x32, /*goto*/ 0x06) + if_object_in_good_condition(0x33, /*goto*/ 0x06) + if_object_in_good_condition(0x34, /*goto*/ 0x06) + if_object_in_good_condition(0x35, /*goto*/ 0x06) + if_object_in_good_condition(0x36, /*goto*/ 0x06) + if_object_in_good_condition(0x37, /*goto*/ 0x06) + if_object_in_good_condition(0x38, /*goto*/ 0x06) + if_object_in_good_condition(0x39, /*goto*/ 0x06) + if_object_in_good_condition(0x3a, /*goto*/ 0x06) + if_object_in_good_condition(0x3b, /*goto*/ 0x06) + if_object_in_good_condition(0x3c, /*goto*/ 0x06) + if_object_in_good_condition(0x3d, /*goto*/ 0x06) + if_object_in_good_condition(0x3e, /*goto*/ 0x06) + if_object_in_good_condition(0x3f, /*goto*/ 0x06) + if_object_in_good_condition(0x40, /*goto*/ 0x06) + if_object_in_good_condition(0x41, /*goto*/ 0x06) + if_object_in_good_condition(0x42, /*goto*/ 0x06) + if_object_in_good_condition(0x43, /*goto*/ 0x06) + if_object_in_good_condition(0x44, /*goto*/ 0x06) + if_object_in_good_condition(0x45, /*goto*/ 0x06) + if_object_in_good_condition(0x46, /*goto*/ 0x06) + if_object_in_good_condition(0x47, /*goto*/ 0x06) + if_object_in_good_condition(0x48, /*goto*/ 0x06) + if_object_in_good_condition(0x49, /*goto*/ 0x06) + if_object_in_good_condition(0x4a, /*goto*/ 0x06) + if_object_in_good_condition(0x4b, /*goto*/ 0x06) + if_object_in_good_condition(0x4c, /*goto*/ 0x06) + if_object_in_good_condition(0x4d, /*goto*/ 0x06) + if_object_in_good_condition(0x4e, /*goto*/ 0x06) + if_object_in_good_condition(0x4f, /*goto*/ 0x06) + if_object_in_good_condition(0x50, /*goto*/ 0x06) + if_object_in_good_condition(0x51, /*goto*/ 0x06) + if_object_in_good_condition(0x52, /*goto*/ 0x06) + if_object_in_good_condition(0x53, /*goto*/ 0x06) + if_object_in_good_condition(0x54, /*goto*/ 0x06) + if_object_in_good_condition(0x55, /*goto*/ 0x06) + if_object_in_good_condition(0x56, /*goto*/ 0x06) + if_object_in_good_condition(0x57, /*goto*/ 0x06) + if_object_in_good_condition(0x58, /*goto*/ 0x06) + if_object_in_good_condition(0x59, /*goto*/ 0x06) + if_object_in_good_condition(0x5a, /*goto*/ 0x06) + if_object_in_good_condition(0x5b, /*goto*/ 0x06) + if_object_in_good_condition(0x5c, /*goto*/ 0x06) + if_object_in_good_condition(0x5d, /*goto*/ 0x06) + if_object_in_good_condition(0x5e, /*goto*/ 0x06) + if_object_in_good_condition(0x5f, /*goto*/ 0x06) + if_object_in_good_condition(0x60, /*goto*/ 0x06) + if_object_in_good_condition(0x61, /*goto*/ 0x06) + if_object_in_good_condition(0x62, /*goto*/ 0x06) + if_object_in_good_condition(0x63, /*goto*/ 0x06) + if_object_in_good_condition(0x64, /*goto*/ 0x06) + if_object_in_good_condition(0x65, /*goto*/ 0x06) + if_object_in_good_condition(0x66, /*goto*/ 0x06) + if_object_in_good_condition(0x67, /*goto*/ 0x06) + if_object_in_good_condition(0x68, /*goto*/ 0x06) + if_object_in_good_condition(0x69, /*goto*/ 0x06) + if_object_in_good_condition(0x6a, /*goto*/ 0x06) + if_object_in_good_condition(0x6b, /*goto*/ 0x06) + if_object_in_good_condition(0x6c, /*goto*/ 0x06) + if_object_in_good_condition(0x6d, /*goto*/ 0x06) + if_object_in_good_condition(0x6e, /*goto*/ 0x06) + if_object_in_good_condition(0x6f, /*goto*/ 0x06) + if_object_in_good_condition(0x70, /*goto*/ 0x06) + if_object_in_good_condition(0x71, /*goto*/ 0x06) + if_object_in_good_condition(0x72, /*goto*/ 0x06) + if_object_in_good_condition(0x73, /*goto*/ 0x06) + if_object_in_good_condition(0x74, /*goto*/ 0x06) + if_object_in_good_condition(0x75, /*goto*/ 0x06) + if_object_in_good_condition(0x76, /*goto*/ 0x06) + if_object_in_good_condition(0x77, /*goto*/ 0x06) + if_object_in_good_condition(0x78, /*goto*/ 0x06) + if_object_in_good_condition(0x79, /*goto*/ 0x06) + if_object_in_good_condition(0x7a, /*goto*/ 0x06) + if_object_in_good_condition(0x7b, /*goto*/ 0x06) + if_object_in_good_condition(0x7c, /*goto*/ 0x06) + if_object_in_good_condition(0x7d, /*goto*/ 0x06) + if_object_in_good_condition(0x7e, /*goto*/ 0x06) + if_object_in_good_condition(0x7f, /*goto*/ 0x06) + if_object_in_good_condition(0x80, /*goto*/ 0x06) + if_object_in_good_condition(0x81, /*goto*/ 0x06) + if_object_in_good_condition(0x82, /*goto*/ 0x06) + if_object_in_good_condition(0x83, /*goto*/ 0x06) + if_object_in_good_condition(0x84, /*goto*/ 0x06) + if_object_in_good_condition(0x85, /*goto*/ 0x06) + if_object_in_good_condition(0x86, /*goto*/ 0x06) + if_object_in_good_condition(0x87, /*goto*/ 0x06) + if_object_in_good_condition(0x88, /*goto*/ 0x06) + play_sound(MP3_07CB, -1) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x06) + goto_first(0x08) + + endlist +}; + +/** + * This function hides guards inside the villa on A and SA, then unhides them + * once you approach the villa. + */ +u8 func101c_toggle_villa_guards[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // A and SA + label(0x2d) + disable_chr(0x23) + disable_chr(0x24) + disable_chr(0x25) + disable_chr(0x26) + disable_chr(0x27) + disable_chr(0x28) + disable_chr(0x29) + disable_chr(0x2a) + disable_chr(0x2b) + disable_chr(0x2c) + disable_chr(0x2d) + disable_chr(0x2e) + disable_chr(0x2f) + disable_chr(0x30) + disable_chr(0x31) + disable_chr(0x32) + disable_chr(0x33) + disable_chr(0x34) + disable_chr(0x35) + disable_chr(0x36) + disable_chr(0x37) + disable_chr(0x38) + disable_chr(0x39) + disable_chr(0x3a) + disable_chr(0x3b) + disable_chr(0x3c) + disable_chr(0x3d) + disable_chr(0x3e) + disable_chr(0x3f) + disable_chr(0x40) + disable_chr(0x41) + disable_chr(0x42) + + // @bug: It is possible to cross room 0x002a in a single frame on coop if + // hugging the corner tightly, which means the guards will not be unhidden. + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x002a, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + enable_chr(0x23) + yield + enable_chr(0x24) + yield + enable_chr(0x25) + yield + enable_chr(0x26) + yield + enable_chr(0x27) + yield + enable_chr(0x28) + yield + enable_chr(0x29) + yield + enable_chr(0x2a) + yield + enable_chr(0x2b) + yield + enable_chr(0x2c) + yield + enable_chr(0x2d) + yield + enable_chr(0x2e) + yield + enable_chr(0x2f) + yield + enable_chr(0x30) + yield + enable_chr(0x31) + yield + enable_chr(0x32) + yield + enable_chr(0x33) + yield + enable_chr(0x34) + yield + enable_chr(0x35) + yield + enable_chr(0x36) + yield + enable_chr(0x37) + yield + enable_chr(0x38) + yield + enable_chr(0x39) + yield + enable_chr(0x3a) + yield + enable_chr(0x3b) + yield + enable_chr(0x3c) + yield + enable_chr(0x3d) + yield + enable_chr(0x3e) + yield + enable_chr(0x3f) + yield + enable_chr(0x40) + yield + enable_chr(0x41) + yield + enable_chr(0x42) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_dual_cmp150[] = { + // Probable @bug: This timer starts from the start of the intro cinema, + // rather than from when you take control of Jo. + yield + restart_timer + + // Wait 38.3 seconds or for CMP150 sniper to die + beginloop(0x04) + if_chr_dead(CHR_SNIPER7, /*goto*/ 0x2d) + if_timer_gt(2300, /*goto*/ 0x06) + endloop(0x04) + + label(0x2d) + pause_timer + play_sound(SFX_M0_MY_GUN, -1) // "My gun!" + + beginloop(0x08) + if_chr_death_animation_finished(0x06, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + unset_object_flag(OBJ_CMP150_1, OBJFLAG_UNCOLLECTABLE) + unset_object_flag(OBJ_CMP150_2, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_CMP150_1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_CMP150_1, OBJFLAG2_INVISIBLE) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0407_init_sniper[] = { + set_chr_maxdamage(CHR_SELF, 1) + stop_chr + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0410_carrington[] = { + yield + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_chr_maxdamage(CHR_SELF, 1) + chr_do_animation(ANIM_CUT_ELD_OUTRO_CARR, 1, 1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 2) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Unlock exterior doors on SA and PA. + */ +u8 func101e_unlock_doors[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + unlock_door(0x90, 0x80) + unlock_door(0x91, 0x80) + unlock_door(0x92, 0x80) + unlock_door(0x93, 0x80) + unlock_door(0x94, 0x80) + unlock_door(0x95, 0x80) + unlock_door(0x96, 0x80) + unlock_door(0x97, 0x80) + unlock_door(0x98, 0x80) + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_check_one_basement_guard_remaining[] = { + #define inc_var_if_chr_dead(chr) \ + if_chr_deadish(chr, /*goto*/ 0x2d) \ + goto_next(0x06) \ + label(0x2d) \ + add_morale(1) \ + label(0x06) + + beginloop(0x04) + set_morale(0) + + inc_var_if_chr_dead(CHR_BASEMENT1) + inc_var_if_chr_dead(CHR_BASEMENT2) + inc_var_if_chr_dead(CHR_BASEMENT3) + inc_var_if_chr_dead(CHR_BASEMENT4) + inc_var_if_chr_dead(CHR_BASEMENT5) + inc_var_if_chr_dead(CHR_BASEMENT6) + inc_var_if_chr_dead(CHR_BASEMENT7) + inc_var_if_chr_dead(CHR_BASEMENT8) + inc_var_if_chr_dead(CHR_BASEMENT9) + + if_morale_lt(8, /*goto*/ 0x2d) + set_stage_flag(STAGEFLAG_ONE_BASEMENT_GUARD_REMAINING) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2d) + endloop(0x04) + + endlist +}; + +/** + * Counterop only. + */ +u8 func1420_setup_portals[] = { + yield + set_room_flag(0x0050, ROOMFLAG_0800) + set_room_flag(0x0052, ROOMFLAG_0800) + set_room_flag(0x006c, ROOMFLAG_0800) + set_room_flag(0x004d, ROOMFLAG_0800) + set_room_flag(0x0065, ROOMFLAG_0800) + set_room_flag(0x0059, ROOMFLAG_0800) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1423_setup_environment[] = { + yield + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0049, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0050, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0050, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0051, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0053, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0053, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0054, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0056, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0056, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0057, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x005a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x005c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x005d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x005e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x005f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0060, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0061, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0061, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0062, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0062, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0063, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0064, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0065, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0066, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0068, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0069, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x006f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0070, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0070, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0071, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0071, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1021_toggle_last_basement_guard[] = { + set_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_INVINCIBLE) + + beginloop(0x04) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) + if_objective_complete(0, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + if_objective_complete(1, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_objective_complete(2, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + if_objective_complete(3, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + if_objective_complete(4, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + unset_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_setup_rtracker[] = { + yield + set_object_flag3(OBJ_CMP150_1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_CMP150_2, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_DEVASTATOR, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0411_cisoldier[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + chr_drop_weapon(CHR_SELF) + label(0x08) + yield + chr_do_animation(ANIM_0487, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CISOLDIER, 2) + yield + yield + yield + kill(CHR_CISOLDIER) + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * On PA, mark some guards so that AI buddies will not shoot at them. + */ +u8 func1024_set_chr_flags_on_pa[] = { + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) + set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x0a, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x23, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x2f, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x34, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x37, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(0x3e, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(CHR_BASEMENT6, CHRHFLAG_DONTSHOOTME) + set_chr_hiddenflag(CHR_BASEMENT8, CHRHFLAG_DONTSHOOTME) + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#if VERSION >= VERSION_NTSC_1_0 +u8 func1025_check_basement_entered_without_subdue[] = { + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + + beginloop(0x04) + if_objective_complete(4, /*goto*/ 0x0c) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0087, /*goto*/ 0x06) + label(0x0c) + endloop(0x04) + + label(0x06) + show_hudmsg(CHR_P1P2, L_ELD_049) // "Mission unsuccessful - enemy guard not captured." + set_stage_flag(STAGEFLAG_FORGOT_TO_KO_GUARD) + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; +#endif + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_give_items, 0x1003 }, + { func1004_check_negotiator, 0x1004 }, + { func1005_toggle_snipers, 0x1005 }, + { func1006_check_snipers_dead, 0x1006 }, + { func1007_cooling_switch, 0x1007 }, + { func1008_power_switch, 0x1008 }, + { func1009_windmill_switch, 0x1009 }, + { func100a_check_switches_destroyed, 0x100a }, + { func100b_invoke_hackers, 0x100b }, + { func100c_check_hackers_dead, 0x100c }, + { func100e_check_objectives_complete, 0x100e }, + { func100f_check_takers_dead, 0x100f }, + { func1010_set_pa_negotiator_flag, 0x1010 }, + { func1011_setup_snipers, 0x1011 }, + { func1013_check_guard_subdued, 0x1013 }, + { func1014_give_keycard, 0x1014 }, + { func1015_check_computers_destroyed, 0x1015 }, + { func1016_msg_generator, 0x1016 }, + { func1017_msg_gottobequick, 0x1017 }, + { func1018_msg_hidingdaniel, 0x1018 }, + { func1019_msg_hackershavetobestopped, 0x1019 }, + { func101b_toggle_basement_chrs, 0x101b }, + { func101c_toggle_villa_guards, 0x101c }, + { func101d_dual_cmp150, 0x101d }, + { func101e_unlock_doors, 0x101e }, + { func101f_check_one_basement_guard_remaining, 0x101f }, + { func1420_setup_portals, 0x1420 }, + { func1021_toggle_last_basement_guard, 0x1021 }, + { func1022_setup_rtracker, 0x1022 }, + { func1423_setup_environment, 0x1423 }, + { func1024_set_chr_flags_on_pa, 0x1024 }, +#if VERSION >= VERSION_NTSC_1_0 + { func1025_check_basement_entered_without_subdue, 0x1025 }, +#endif + { func1002_intro, 0x0c00 }, + { func1002_intro_from_menu, 0x0c01 }, + { func0c02_outro_from_menu, 0x0c02 }, + { func0401_init_taker, 0x0401 }, + { func0402_taker, 0x0402 }, + { func0403_negotiator, 0x0403 }, + { func0404_sniper, 0x0404 }, + { func0405_hacker, 0x0405 }, + { func0406_init_hacker, 0x0406 }, + { func0407_init_sniper, 0x0407 }, + { func0408_outro, 0x0408 }, + { func1002_intro, 0x0409 }, + { func040a_enable_sniper, 0x040a }, + { func040b_init_basement_guard, 0x040b }, + { func040c_init_type1_guard, 0x040c }, + { func040d_init_type2_guard, 0x040d }, + { func040e_start_path00, 0x040e }, + { func040f_start_path01, 0x040f }, + { func0410_carrington, 0x0410 }, + { func0411_cisoldier, 0x0411 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupimp.c b/src/ailists/setupimp.c new file mode 100644 index 000000000..5e9ba610a --- /dev/null +++ b/src/ailists/setupimp.c @@ -0,0 +1,4092 @@ +// +// Defense +// + +#include "stagesetup.h" + +// Characters +#define CHR_CARRINGTON 0x00 +#define CHR_HOSTAGE_DEVICE_F 0x01 // device room - female +#define CHR_HOSTAGE_FR1 0x02 +#define CHR_HOSTAGE_INFO_M 0x03 // info room - male +#define CHR_HOSTAGE_HOLO 0x04 // holo +#define CHR_HANGARGUY 0x05 // wears hostage clothes but isn't a hostage +#define CHR_HOSTAGE_DEVICE_M 0x06 // device room - male +#define CHR_HOSTAGE_FR2 0x07 +#define CHR_HOSTAGE_INFO_F 0x08 // info room - female +#define CHR_TAKER_FR1 0x1f +#define CHR_TAKER_FR2 0x20 +#define CHR_TAKER_HOLO1 0x21 +#define CHR_TAKER_HOLO2 0x22 +#define CHR_TAKER_HOLO3 0x23 +#define CHR_TAKER_DEVICE_M 0x24 +#define CHR_TAKER_DEVICE_F 0x25 +#define CHR_TAKER_INFO_F 0x26 +#define CHR_TAKER_INFO_M 0x27 +#define CHR_BLONDE1 0x28 +#define CHR_BLONDE2 0x29 +#define CHR_BLONDE3 0x2a +#define CHR_BLONDE4 0x2b +#define CHR_BLONDE5 0x2c +#define CHR_BLONDE6 0x2d +#define CHR_BLONDE7 0x30 +#define CHR_SKEDAR1 0x31 +#define CHR_SKEDAR2 0x32 +#define CHR_SKEDAR3 0x33 +#define CHR_SKEDAR4 0x34 +#define CHR_HOLOCLONE1 0x35 +#define CHR_HOLOCLONE2 0x36 +#define CHR_HOLOCLONE3 0x37 +#define CHR_JONATHAN 0x38 + +// Objects +#define OBJ_RCP120 0x05 +#define OBJ_AUTOGUN1 0x06 +#define OBJ_AUTOGUN2 0x07 +#define OBJ_AUTOGUN3 0x08 +#define OBJ_SAFEINFO 0x09 +#define OBJ_AUTOGUN_SWITCH1 0x0a +#define OBJ_AUTOGUN_SWITCH2 0x0b +#define OBJ_AUTOGUN_SWITCH3 0x0c +#define OBJ_SAFEDOOR 0x39 +#define OBJ_SKEDAR_SHUTTLE 0x3c +#define OBJ_RCP120_GLASS 0x3d +#define OBJ_FR_GLASS 0x3e +#define OBJ_DEVASTATOR 0x45 +#define OBJ_FR_PC 0x4e +#define OBJ_DATAUPLINK_BOND 0x4f +#define OBJ_DATAUPLINK_COOP 0x50 + +// Stage flags +#define STAGEFLAG_00000001 0x00000001 // never set +#define STAGEFLAG_AUTOGUN1_ACTIVE 0x00000100 +#define STAGEFLAG_AUTOGUN2_ACTIVE 0x00000200 +#define STAGEFLAG_AUTOGUN3_ACTIVE 0x00000400 +#define STAGEFLAG_ENOUGH_HOSTAGES_SAVED 0x00000800 +#define STAGEFLAG_TOO_MANY_HOSTAGES_KILLED 0x00001000 +#define STAGEFLAG_SAFEINFO_DESTROYED 0x00002000 +#define STAGEFLAG_BOMB_AIRBORNE 0x00004000 +#define STAGEFLAG_CARRINGTON_DEAD 0x00010000 +#define STAGEFLAG_HOLO_TAKERS_DEAD 0x00040000 +#define STAGEFLAG_DEVICE_TAKERS_DEAD 0x00080000 +#define STAGEFLAG_INFO_TAKERS_DEAD 0x00100000 +#define STAGEFLAG_AUTOGUN_SWITCH_DESTROYED 0x00200000 +#define STAGEFLAG_BOMB_EXPLODING_ON_GROUND 0x00800000 +#define STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF 0x01000000 +#define STAGEFLAG_INTRO_FINISHED 0x02000000 +#define STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS 0x04000000 +#define STAGEFLAG_TRIGGER_AUTODEFENSES_MSG 0x08000000 +#define STAGEFLAG_TRIGGER_COUNTINGONME_MSG 0x10000000 +#define STAGEFLAG_TRIGGER_SPAWNING 0x20000000 +#define STAGEFLAG_DROPPED_DEVASTATOR 0x40000000 +#define STAGEFLAG_FR_PC_DESTROYED 0x80000000 + +// AI Lists +#define AILIST_SPAWNER1 0x0401 +#define AILIST_CLONE1 0x0402 +#define AILIST_INIT_CLONE1 0x0403 +#define AILIST_SPAWNER2 0x0404 +#define AILIST_CLONE2 0x0405 +#define AILIST_INIT_CLONE2 0x0406 +#define AILIST_SPAWNER3 0x0407 +#define AILIST_CLONE3 0x0408 +#define AILIST_INIT_CLONE3 0x0409 +#define AILIST_SPAWNER4 0x040a +#define AILIST_CLONE4 0x040b +#define AILIST_INIT_CLONE4 0x040c +#define AILIST_SPAWNER5 0x040d +#define AILIST_CLONE5 0x040e +#define AILIST_INIT_CLONE5 0x040f +#define AILIST_SPAWNER6 0x0410 +#define AILIST_CLONE6 0x0411 +#define AILIST_INIT_CLONE6 0x0412 +#define AILIST_DEFEND_PAD 0x0413 +#define AILIST_FIRINGRANGE_HOSTAGE 0x0414 +#define AILIST_INIT_HOSTAGE_FR1 0x0415 +#define AILIST_INIT_HOSTAGE_FR2 0x0416 +#define AILIST_INIT_FIRINGRANGE_TAKER 0x0419 +#define AILIST_HOSTAGE_HOLO 0x041a +#define AILIST_INIT_HOSTAGE_HOLO 0x041b +#define AILIST_INIT_HOLOCLONE1 0x041c +#define AILIST_INIT_HOLOCLONE2 0x041d +#define AILIST_INIT_HOLOCLONE3 0x041e +#define AILIST_HOLOCLONE 0x041f +#define AILIST_TAKER_HOLO1 0x0420 +#define AILIST_TAKER_HOLO2 0x0421 +#define AILIST_TAKER_HOLO3 0x0422 +#define AILIST_INIT_SHOCK 0x0423 +#define AILIST_HOLOCLONE_ONSHOT 0x0424 +#define AILIST_HOSTAGE_THANK_AND_RUN 0x0425 +#define AILIST_INIT_SAVED_HOSTAGE 0x0426 +#define AILIST_DROP_DEVASTATOR 0x0427 +#define AILIST_INIT_DROP_DEVASTATOR 0x0428 +#define AILIST_SKEDAR4 0x0429 +#define AILIST_INIT_JONATHAN 0x042a +#define AILIST_DEVICEROOM_HOSTAGE 0x042b +#define AILIST_INIT_HOSTAGE_DEVICE_F 0x042c +#define AILIST_INIT_HOSTAGE_DEVICE_M 0x042d +#define AILIST_TAKER_DEVICE_M 0x042e +#define AILIST_INIT_TAKER_DEVICE_M 0x042f +#define AILIST_TAKER_DEVICE_F 0x0430 +#define AILIST_INIT_TAKER_DEVICE_F 0x0431 +#define AILIST_TAKER_ATTACK 0x0432 +#define AILIST_INFOROOM_HOSTAGE 0x0433 +#define AILIST_INIT_HOSTAGE_INFO_M 0x0434 +#define AILIST_INIT_HOSTAGE_INFO_F 0x0435 +#define AILIST_TAKER_INFO_M 0x0436 +#define AILIST_INIT_TAKER_INFO_M 0x0437 +#define AILIST_TAKER_INFO_F 0x0438 +#define AILIST_INIT_TAKER_INFO_F 0x0439 +#define AILIST_INIT_BLONDE 0x043b +#define AILIST_INIT_CISOLDIER 0x043c +#define AILIST_CARRINGTON 0x043e + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_IMP_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_IMP_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_IMP_002) + briefing(BRIEFINGTYPE_TEXT_A, L_IMP_003) + + beginobjective(0, L_IMP_005, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Reactivate automatic defenses" + complete_flags(STAGEFLAG_AUTOGUN1_ACTIVE) + complete_flags(STAGEFLAG_AUTOGUN2_ACTIVE) + complete_flags(STAGEFLAG_AUTOGUN3_ACTIVE) + fail_flags(STAGEFLAG_AUTOGUN_SWITCH_DESTROYED) + fail_flags(STAGEFLAG_00000001) + endobjective + + beginobjective(1, L_IMP_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Release hostages" + complete_flags(STAGEFLAG_ENOUGH_HOSTAGES_SAVED) + fail_flags(STAGEFLAG_TOO_MANY_HOSTAGES_KILLED) + endobjective + + beginobjective(2, L_IMP_007, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Retrieve experimental weapon" + require_object_collected(OBJ_RCP120) + fail_flags(STAGEFLAG_FR_PC_DESTROYED) + endobjective + + beginobjective(3, L_IMP_008, (DIFFBIT_PA | DIFFBIT_PD)) // "Destroy sensitive information" + complete_flags(STAGEFLAG_SAFEINFO_DESTROYED) + endobjective + + beginobjective(4, L_IMP_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Deactivate bomb" + complete_flags(STAGEFLAG_BOMB_AIRBORNE) + fail_flags(STAGEFLAG_BOMB_EXPLODING_ON_GROUND) + fail_flags(STAGEFLAG_CARRINGTON_DEAD) + endobjective + + tag(0x23, 2) + tag(0x24, 2) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_0156, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_0157, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x43, 2) + tag(0x44, 2) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_0158, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_0159, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_015B, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_015C, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x54, 1) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_015A, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x19, 1) + door(0x0100, MODEL_CIDOOR1_REF, PAD_IMP_015D, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x51, 1) + door(0x0100, MODEL_CH_SHUTTER1, PAD_IMP_0166, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_CH_SHUTTER1, PAD_IMP_0167, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0212, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0213, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0214, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0215, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0216, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0217, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0218, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_CI_SOFA, PAD_IMP_0219, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_019F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_019E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_019D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_019C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01C4, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01C5, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01C6, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01C7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01A9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01AA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01AB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01AC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01AD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01AE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01AF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_IMP_01D1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x46, 6) + tag(0x47, 6) + tag(0x48, 6) + tag(0x49, 6) + tag(0x41, 1) + lift(0x0100, MODEL_CI_LIFT, PAD_IMP_0193, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0193, 0x0194, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_015E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_015F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_0160, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_0161, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + tag(0x4a, 6) + tag(0x4b, 6) + tag(0x4c, 6) + tag(0x4d, 6) + tag(0x42, 1) + lift(0x0100, MODEL_CI_LIFT, PAD_IMP_0195, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0195, 0x0196, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_0164, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_0165, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_0162, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000001, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_IMP_0163, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-4, -5, 0) + lift_door(-4, -6, 0) + lift_door(-4, -7, 1) + lift_door(-4, -8, 1) + tag(0x00, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_IMP_021B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_IMP_021A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x4e, 1) + stdobject(0x0100, MODEL_GOODPC, PAD_IMP_021C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000) + tag(0x01, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_IMP_021F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_IMP_021D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_GOODPC, PAD_IMP_021E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x02, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_IMP_0220, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_IMP_0222, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_GOODPC, PAD_IMP_0221, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x02, PAD_IMP_00FA, BODY_CILABTECH, HEAD_CHRIST, AILIST_INIT_HOSTAGE_FR1, 0x00b7, -1, 1000, 6, 0, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_05, -1, 0, 2, 0, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FALCON2) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x07, PAD_IMP_0013, BODY_CILABTECH, HEAD_BEAU1, AILIST_INIT_HOSTAGE_FR2, 0x00b7, -1, 0, 0, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_0D, 0x00, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FALCON2) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x04, PAD_IMP_0103, BODY_CIFEMTECH, HEAD_SECRETARY, AILIST_INIT_HOSTAGE_HOLO, -1, -1, 1000, 6, 0, CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x01, PAD_IMP_010B, BODY_CIFEMTECH, HEAD_SECRETARY, AILIST_INIT_HOSTAGE_DEVICE_F, -1, -1, 1000, 6, 0, CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x06, PAD_IMP_00FD, BODY_CILABTECH, HEAD_RUSS, AILIST_INIT_HOSTAGE_DEVICE_M, -1, -1, 0, 0, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_0D, 0x01, 0, 0, 2, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x03, PAD_IMP_010C, BODY_CILABTECH, HEAD_MARK2, AILIST_INIT_HOSTAGE_INFO_M, -1, -1, 1000, 6, 0, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x08, PAD_IMP_00F7, BODY_CIFEMTECH, HEAD_SECRETARY, AILIST_INIT_HOSTAGE_INFO_F, -1, -1, 0, 0, 0, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_0D, 0x02, 0, 0, 2, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x05, PAD_IMP_00FB, BODY_CILABTECH, HEAD_BRIAN, GAILIST_IDLE, 0x00fb, -1, 1000, 6, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_05, -1, 0, 2, 0, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FALCON2) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x00, PAD_IMP_0142, BODY_CARREVENINGSUIT, HEAD_CARRINGTON, GAILIST_IDLE, 0x0142, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x0c, PAD_IMP_0133, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER1, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_ONLYONPA, 0x0d, PAD_IMP_0134, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER2, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x0e, PAD_IMP_0135, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER2, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x10, PAD_IMP_0137, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER3, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x12, PAD_IMP_0139, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER5, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x13, PAD_IMP_003A, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER4, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x15, PAD_IMP_013C, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x013c, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x16, PAD_IMP_013D, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x013d, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x17, PAD_IMP_013E, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x013e, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x18, PAD_IMP_013F, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x013f, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x1b, PAD_IMP_0143, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x0143, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x1c, PAD_IMP_0144, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x0144, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x1d, PAD_IMP_0145, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x00b1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x1e, PAD_IMP_0146, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x0146, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x19, PAD_IMP_0140, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x0140, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x1a, PAD_IMP_0141, BODY_CISOLDIER, HEAD_RANDOM, GAILIST_IDLE, 0x0141, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + chr(0, 0x1f, PAD_IMP_014B, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_SHOCK, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x20, PAD_IMP_014C, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_SHOCK, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x21, PAD_IMP_014D, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_SHOCK, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x22, PAD_IMP_014E, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_SHOCK, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x23, PAD_IMP_014F, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_SHOCK, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x24, PAD_IMP_0150, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_TAKER_DEVICE_M, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x25, PAD_IMP_0151, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_TAKER_DEVICE_F, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x26, PAD_IMP_0152, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_TAKER_INFO_F, -1, -1, 200, 100, CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x27, PAD_IMP_0153, BODY_DDSHOCK, HEAD_RANDOM, AILIST_INIT_TAKER_INFO_M, -1, -1, 200, 100, CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x14, PAD_IMP_0053, BODY_DDSHOCK, HEAD_RANDOM, AILIST_SPAWNER6, -1, -1, 200, 100, CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_00000200, 0x28, PAD_IMP_0148, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE_0009, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x29, PAD_IMP_0149, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE_0009, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2a, PAD_IMP_014A, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE_0009, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2b, PAD_IMP_0154, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE_0009, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2c, PAD_IMP_0155, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE_0009, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2d, PAD_IMP_0147, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE_0009, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x30, PAD_IMP_00FF, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x31, PAD_IMP_0100, BODY_SKEDAR, HEAD_RANDOM, GAILIST_INVINCIBLE_AND_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x32, PAD_IMP_0101, BODY_SKEDAR, HEAD_RANDOM, GAILIST_INVINCIBLE_AND_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x33, PAD_IMP_0102, BODY_SKEDAR, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_FIXEDHEIGHT, 0x34, PAD_IMP_003A, BODY_SKEDAR, HEAD_RANDOM, GAILIST_STOP_AND_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_BLUESIGHT, 0x38, PAD_IMP_0051, BODY_CISOLDIER, HEAD_JONATHAN, AILIST_INIT_JONATHAN, PAD_IMP_0051, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_BLUESIGHT, 0x38, PAD_IMP_00BA, BODY_CISOLDIER, HEAD_JONATHAN, AILIST_INIT_JONATHAN, PAD_IMP_00BA, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRDY357, 0x0038, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + tag(0x06, 1) + autogun(0x00a6, MODEL_CI_ROOFGUN, PAD_IMP_0235, OBJFLAG_00000004, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0075, 0x00005555, 0xffffaaab, 0x00000aaa, 0x00320000) + tag(0x07, 1) + autogun(0x00a6, MODEL_CI_ROOFGUN, PAD_IMP_0234, OBJFLAG_00000004, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x007c, 0x00005555, 0xffffaaab, 0x00000aaa, 0x00320000) + tag(0x08, 1) + autogun(0x00a6, MODEL_CI_ROOFGUN, PAD_IMP_0233, OBJFLAG_00000004, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0097, 0x00005555, 0xffffaaab, 0x00000aaa, 0x00320000) + tag(0x0a, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_IMP_0236, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x0b, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_IMP_0237, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x0c, 1) + multimonitor(0x0099, MODEL_CIHUB, PAD_IMP_0238, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 0, 0, 0) + tag(0x0d, 1) + stdobject(0x0100, MODEL_DROPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x0e, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x0f, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x10, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x11, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x12, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x13, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x14, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x15, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x16, 1) + stdobject(0x0300, MODEL_LASERCUT, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x17, 1) + stdobject(0x0100, MODEL_LASERCUT, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x18, 1) + stdobject(0x0100, MODEL_LASERCUT, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x52, 1) + stdobject(0x0019, MODEL_KNOCKKNOCK, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x53, 1) + stdobject(0x0019, MODEL_KNOCKKNOCK, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x05, 1) + weapon(0x0180, MODEL_CHRRCP120, PAD_IMP_011A, OBJFLAG_00000008 | OBJFLAG_UNCOLLECTABLE, 0, OBJFLAG3_PLAYERUNDROPPABLE | OBJFLAG3_ONSHELF, WEAPON_RCP120) + tag(0x09, 1) + stdobject(0x0480, MODEL_SENSITIVEINFO, PAD_IMP_010F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + rename_object(-1, WEAPON_BRIEFCASE, L_IMP_010, L_IMP_011, L_IMP_012, L_IMP_013, L_IMP_014) // "Obtain sensitive info." + tag(0x4f, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_IMP_057, L_IMP_058, L_IMP_059, L_IMP_060, L_IMP_061) // "Obtain Data Uplink." + tag(0x50, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_IMP_057, L_IMP_058, L_IMP_059, L_IMP_060, L_IMP_061) // "Obtain Data Uplink." + door(0x0100, MODEL_INSTFRONTDOOR, PAD_IMP_018F, OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_INSTFRONTDOOR, PAD_IMP_0190, OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0168, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0169, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_016A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_016B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_016C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_016D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_016E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_016F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0170, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0171, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0172, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0173, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0174, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0175, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0176, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0177, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0178, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0179, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_017B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_017C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_017D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_017E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_017F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0180, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + door(0x0100, MODEL_CH_SHUTTER1, PAD_IMP_0181, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000400) + door(0x0100, MODEL_CH_SHUTTER1, PAD_IMP_0182, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000222, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000384, 0x00000000, 0x00000000, 0x00000400) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0183, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0x00000001, 0x00000300) + door(0x0100, MODEL_DOOR2_G5, PAD_IMP_0184, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x0001aaaa, 0x0001aaaa, 0x00000222, DOORFLAG_WINDOWED | DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000258, 0x012c0320, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01B7, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01B8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01B9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01BA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01BB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01BC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01BD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01BE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01BF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01C3, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x39, 1) + stdobject(0x0100, MODEL_AIRBASE_SAFEDOOR, PAD_IMP_025B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000002 | OBJFLAG2_00200000, 0, 2000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0252, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0253, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0254, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0255, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0256, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0257, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0258, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_0259, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_IMP_025A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01D6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01E1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01E2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01E5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01E6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01E8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01E9, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01EA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01EB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01EC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01ED, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01EE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01EF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01F7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01FA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01FB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01FC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01FD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_01FE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_0200, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_0201, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_0202, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_IMP_0204, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3c, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_INTERACTABLE, 12000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01C8, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01C9, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01CA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01CB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01CC, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01CD, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x3d, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01CE, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01CF, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x3e, 1) + glass(0x0100, MODEL_DD_WINDOW, PAD_IMP_01D0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_DD_GRATE, PAD_IMP_0185, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DEVICESECRETDOOR, PAD_IMP_0186, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_GRATE, PAD_IMP_0187, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_CARRINGTONSECRETDOOR, PAD_IMP_0188, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, DOORFLAG_AUTOMATIC, DOORTYPE_SWINGING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000b00) + tag(0x3f, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_IMP_0288, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x40, 1) +#if VERSION >= VERSION_JPN_FINAL + shield(0x0180, MODEL_CHRSHIELD, PAD_IMP_0092, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PD, 0, 1000) +#else + shield(0x0180, MODEL_CHRSHIELD, PAD_IMP_0092, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) +#endif + tag(0x45, 1) + weapon(0x0100, MODEL_CHRDEVASTATOR, -1, OBJFLAG_20000000, 0, 0, WEAPON_DEVASTATOR) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_FROCK) + intro_weapon(WEAPON_AR34, -1) + ammo(AMMOTYPE_RIFLE, 200) + ammo(AMMOTYPE_PISTOL, 300) + ammo(AMMOTYPE_SMG, 400) + intro_weapon(WEAPON_COMBATBOOST, -1) + ammo(AMMOTYPE_BOOST, 2) + intro_weapon(WEAPON_LASER, -1) + intro_weapon(WEAPON_LASER, -1) + spawn(PAD_IMP_0120) + endintro +}; + +s32 path00[] = { + PAD_IMP_0113, + -1, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) + give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) + + label(0x2e) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_DEVICE_F, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_INFO_M, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_HOLO, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HANGARGUY, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_DEVICE_M, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_INFO_F, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x09, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0a, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_UNEXPLODABLE) + set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_UNEXPLODABLE) + set_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_UNEXPLODABLE) + set_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +#define spawner_logic(initfunc, clonefunc) \ + set_self_chrflag(CHRCFLAG_CLONEABLE) \ + set_self_chrflag(CHRCFLAG_HIDDEN) \ + set_self_chrflag(CHRCFLAG_00040000) \ + \ + beginloop(0x0f) \ + if_stage_flag_eq(STAGEFLAG_TRIGGER_SPAWNING, TRUE, /*goto*/ 0x04) \ + endloop(0x0f) \ + \ + beginloop(0x04) \ + if_never_been_onscreen(/*goto*/ 0x4f) \ + if_can_see_target(/*goto*/ 0x0a) \ + reloop(0x04) \ + \ + label(0x0a) \ + set_ailist(CHR_SELF, clonefunc) \ + \ + label(0x4f) \ + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) \ + reloop(0x04) \ + \ + label(0x4f) \ + try_spawn_clone2(CHR_SELF, initfunc, 0, /*goto*/ 0x2e) \ + set_ailist(CHR_SELF, clonefunc) \ + label(0x2e) \ + yield \ + endloop(0x04) + +#define initclone_logic(templatechr, clonefunc) \ + set_chr_dodge_rating(2, 0) \ + set_accuracy(20) \ + set_reaction_speed(70) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(90) \ + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) \ + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) \ + label(0x04) \ + try_inherit_properties(templatechr, /*goto*/ 0x08) \ + label(0x08) \ + set_chr_team(CHR_SELF, TEAM_ENEMY) \ + rebuild_teams \ + rebuild_squadrons \ + set_ailist(CHR_SELF, clonefunc) + +// Spawn clones in autogun hall dead end room +u8 func0401_spawner1[] = { + spawner_logic(AILIST_INIT_CLONE1, AILIST_CLONE1) + endlist +}; + +u8 func0403_init_clone1[] = { + initclone_logic(0x0b, AILIST_CLONE1) + endlist +}; + +u8 func0402_clone1[] = { +#if VERSION >= VERSION_NTSC_1_0 + unset_self_chrflag(CHRCFLAG_INVINCIBLE) +#endif + run_to_pad(PAD_IMP_00C2) + set_returnlist(CHR_SELF, AILIST_CLONE1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +// Spawn clones in vehicle maintenance area - assigned to two spawners +u8 func0404_spawner2[] = { + spawner_logic(AILIST_INIT_CLONE2, AILIST_CLONE2) + endlist +}; + +u8 func0406_init_clone2[] = { + initclone_logic(0x0d, AILIST_CLONE2) + endlist +}; + +u8 func0405_clone2[] = { + run_to_pad(PAD_IMP_00B1) + set_returnlist(CHR_SELF, AILIST_CLONE2) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +// Spawn clones in room with pit near autogun switches +u8 func0407_spawner3[] = { + spawner_logic(AILIST_INIT_CLONE3, AILIST_CLONE3) + endlist +}; + +u8 func0409_init_clone3[] = { + initclone_logic(0x0f, AILIST_CLONE3) + endlist +}; + +u8 func0408_clone3[] = { + run_to_pad(PAD_IMP_00AF) + set_returnlist(CHR_SELF, AILIST_CLONE3) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Assigned to CI soldiers, Jon and hangar guy + */ +u8 func0413_defend_pad[] = { + set_shotlist(AILIST_DEFEND_PAD) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x08) + + // Distance to pad >= 200 + label(0x03) + jog_to_pad(PAD_PRESET) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x08) + endloop(0x04) + + // At pad + label(0x08) + stop_chr + + beginloop(0x0b) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + goto_first(0x03) + + // Detected enemy + label(0x0a) + set_shotlist(AILIST_DEFEND_PAD) + set_returnlist(CHR_SELF, AILIST_DEFEND_PAD) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func100b_setup_autoguns[] = { + yield + + // Make autoguns shoot at everyone except good people + set_autogun_target_team(OBJ_AUTOGUN1, 0xff & ~TEAM_ALLY) + set_autogun_target_team(OBJ_AUTOGUN2, 0xff & ~TEAM_ALLY) + set_autogun_target_team(OBJ_AUTOGUN3, 0xff & ~TEAM_ALLY) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) + + // SA and PA only + restart_timer + + beginloop(0x71) + if_timer_gt(120, /*goto*/ 0x2e) + endloop(0x71) + + label(0x2e) + set_object_flag(OBJ_AUTOGUN1, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_AUTOGUN2, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_AUTOGUN3, OBJFLAG_DEACTIVATED) + + label(0x2f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_check_hostages_killed[] = { + set_chr_chrflag(CHR_HOSTAGE_DEVICE_F, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_HOSTAGE_INFO_M, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_HOSTAGE_HOLO, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_HOSTAGE_DEVICE_M, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_HOSTAGE_INFO_F, CHRCFLAG_KILLCOUNTABLE) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0b) + + // PA + beginloop(0x0c) + if_kill_count_gt(2, /*goto*/ 0x08) + endloop(0x0c) + + // Agent + beginloop(0x0a) + if_kill_count_gt(4, /*goto*/ 0x08) + endloop(0x0a) + + // SA + beginloop(0x0b) + if_kill_count_gt(3, /*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + if_stage_flag_eq(STAGEFLAG_ENOUGH_HOSTAGES_SAVED, TRUE, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_TOO_MANY_HOSTAGES_KILLED) + show_hudmsg(CHR_BOND, L_IMP_016) // "Too many hostages killed." + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_check_safeinfo_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_SAFEINFO, /*goto*/ 0x2e) + goto_next(0x08) + + label(0x2e) + endloop(0x04) + + label(0x08) + show_hudmsg(CHR_BOND, L_IMP_018) // "Sensitive information has been destroyed." + set_stage_flag(STAGEFLAG_SAFEINFO_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define autogun_switch_logic(switch, autogun, stageflag) \ + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) \ + \ + beginloop(0x04) \ + chr_toggle_p1p2(CHR_SELF) \ + if_object_in_good_condition(switch, /*goto*/ 0x2e) \ + goto_next(0x0b) \ + \ + label(0x2e) \ + if_object_in_good_condition(autogun, /*goto*/ 0x2e) \ + goto_next(0x0b) \ + \ + label(0x2e) \ + if_chr_activated_object(CHR_P1P2, switch, /*goto*/ 0x08) \ + endloop(0x04) \ + \ + /* Switch activated */ \ + label(0x08) \ + play_sound(SFX_043A, CHANNEL_7) \ + show_hudmsg(CHR_P1P2, 0x220f) /* "Automatic gun activated." */ \ + label(0x0e) \ + unset_object_flag(autogun, OBJFLAG_DEACTIVATED) \ + set_stage_flag(stageflag) \ + \ + beginloop(0x0f) \ + if_object_in_good_condition(autogun, /*goto*/ 0x2e) \ + goto_next(0x0b) \ + \ + label(0x2e) \ + endloop(0x0f) \ + \ + /* Autogun or switch destroyed */ \ + label(0x0b) \ + if_difficulty_lt(DIFF_SA, /*goto*/ 0x11) \ + show_hudmsg(CHR_BOND, 0x2222) /* "Critical mission object has been destroyed." */ \ + set_stage_flag(STAGEFLAG_AUTOGUN_SWITCH_DESTROYED) + +u8 func1007_autogun_switch1[] = { + autogun_switch_logic(OBJ_AUTOGUN_SWITCH1, OBJ_AUTOGUN1, STAGEFLAG_AUTOGUN1_ACTIVE) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x11) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_autogun_switch2[] = { + autogun_switch_logic(OBJ_AUTOGUN_SWITCH2, OBJ_AUTOGUN2, STAGEFLAG_AUTOGUN2_ACTIVE) + label(0x11) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_autogun_switch3[] = { + autogun_switch_logic(OBJ_AUTOGUN_SWITCH3, OBJ_AUTOGUN3, STAGEFLAG_AUTOGUN3_ACTIVE) + label(0x11) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c01_outro[] = { + camera_movement(ANIM_CUT_IMP_OUTRO_CAM_01) + play_cutscene_track(MUSIC_DEFENSE_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_OUTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + #define show_object_with_animation(object, animation) \ + enable_object(object) \ + set_object_flag2(object, OBJFLAG2_04000000) \ + set_object_flag3(object, OBJFLAG3_00000010) \ + object_do_animation(animation, object, 0x04, 0xffff) + + show_object_with_animation(0x0e, ANIM_CUT_IMP_OUTRO_CRATE1_01) + show_object_with_animation(0x0f, ANIM_CUT_IMP_OUTRO_CRATE2_01) + show_object_with_animation(0x10, ANIM_CUT_IMP_OUTRO_CRATE3_01) + show_object_with_animation(0x11, ANIM_CUT_IMP_OUTRO_CRATE4_01) + show_object_with_animation(0x12, ANIM_CUT_IMP_OUTRO_CRATE5_01) + show_object_with_animation(0x13, ANIM_CUT_IMP_OUTRO_CRATE6_01) + show_object_with_animation(0x14, ANIM_CUT_IMP_OUTRO_CRATE7_01) + + enable_object(0x0d) + unset_object_flag(0x0d, OBJFLAG_DEACTIVATED) + set_object_flag2(0x0d, OBJFLAG2_04000000) + set_object_flag3(0x0d, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_OUTRO_DROPSHIP_01, 0x0d, 0x01, 0xffff) + + show_nonessential_chrs(FALSE) + open_door(0x51) + restart_timer + yield + set_object_flag(0x51, OBJFLAG_DOOR_KEEPOPEN) + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_AR34, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0xb8) \ + if_timer_gt(time, /*goto*/ 0x08) \ + endloop(loopid) \ + label(0x08) + + wait_until(86, 0x73) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(114, 0x74) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(140, 0x75) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(168, 0x76) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(186, 0x77) + play_sound(SFX_0161, CHANNEL_10) + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0xb8) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0xb8) + label(0x2e) + endloop(0x0a) + + label(0xb8) + mute_channel(CHANNEL_10) + disable_object(0x0d) + camera_movement(ANIM_CUT_IMP_OUTRO_CAM_02) + unset_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_HIDDEN) + + set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SKEDAR1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_OUTRO_SKEDAR1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR1, 4) + + set_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SKEDAR2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_OUTRO_SKEDAR2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR2, 4) + + wait_until(16, 0x78) + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until(56, 0x79) + play_sound(SFX_SKEDAR_ROAR_052B, CHANNEL_10) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0xb8) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0xb8) + label(0x2e) + endloop(0x0b) + + label(0xb8) + mute_channel(CHANNEL_10) + camera_movement(ANIM_CUT_IMP_OUTRO_CAM_03) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_OUTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + show_object_with_animation(0x0e, ANIM_CUT_IMP_OUTRO_CRATE1_02) + show_object_with_animation(0x0f, ANIM_CUT_IMP_OUTRO_CRATE2_02) + show_object_with_animation(0x10, ANIM_CUT_IMP_OUTRO_CRATE3_02) + show_object_with_animation(0x11, ANIM_CUT_IMP_OUTRO_CRATE4_02) + show_object_with_animation(0x12, ANIM_CUT_IMP_OUTRO_CRATE5_02) + show_object_with_animation(0x13, ANIM_CUT_IMP_OUTRO_CRATE6_02) + show_object_with_animation(0x14, ANIM_CUT_IMP_OUTRO_CRATE7_02) + show_object_with_animation(0x0d, ANIM_CUT_IMP_OUTRO_DROPSHIP_02) + + enable_object(0x16) + set_object_flag2(0x16, OBJFLAG2_04000000) + set_object_flag3(0x16, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_OUTRO_LASER1, 0x16, 0x02, 0xffff) + + wait_until(372, 0x7a) + play_sound(SFX_0506, CHANNEL_10) + + wait_until(382, 0x7b) + play_sound(SFX_0048, CHANNEL_10) + + wait_until(390, 0x7c) + play_sound(SFX_0506, CHANNEL_10) + + wait_until(400, 0x7d) + play_sound(SFX_0049, CHANNEL_10) + + wait_until(432, 0x7e) + play_sound(SFX_0506, CHANNEL_10) + + wait_until(442, 0x7f) + play_sound(SFX_00D0, CHANNEL_10) + + wait_until(454, 0x80) + play_sound(SFX_0506, CHANNEL_10) + + wait_until(464, 0x81) + play_sound(SFX_0078, CHANNEL_10) + + wait_until(466, 0x82) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(484, 0x83) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(502, 0x84) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(516, 0x85) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(528, 0x86) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(570, 0x71) + speak(CHR_BOND, L_IMP_049, MP3_047D, CHANNEL_10, COLOR_09_BLUE) // "Get clear! I'll hold them off... You can come back..." + + wait_until(847, 0x87) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(852, 0x88) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(865, 0x72) + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, FALSE) + + wait_until(870, 0x89) + + label(0x8a) + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + if_controller_button_pressed(/*goto*/ 0xb8) + if_timer_gt(960, /*goto*/ 0x08) + goto_first(0x8a) + + label(0x08) + set_chr_shooting_in_cutscene(CHR_BOND, FALSE) + speak(CHR_BOND, L_IMP_050, MP3_047E, CHANNEL_10, COLOR_09_BLUE) // "At least, I hope you can." + + wait_until(1018, 0x8c) + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, FALSE) + + wait_until(1065, 0x94) + play_sound(SFX_SKEDAR_ROAR_052B, CHANNEL_7) + + label(0x0c) + yield + if_camera_animating(/*goto*/ 0x2e) + goto_next(0xb8) + label(0x2e) + if_controller_button_pressed(/*goto*/ 0xb8) + label(0x2e) + goto_first(0x0c) + + label(0xb8) + mute_channel(CHANNEL_10) + camera_movement(ANIM_CUT_IMP_OUTRO_CAM_04) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_OUTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SKEDAR1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_OUTRO_SKEDAR1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR1, 4) + + show_object_with_animation(0x0e, ANIM_CUT_IMP_OUTRO_CRATE1_03) + show_object_with_animation(0x0f, ANIM_CUT_IMP_OUTRO_CRATE2_03) + show_object_with_animation(0x10, ANIM_CUT_IMP_OUTRO_CRATE3_03) + show_object_with_animation(0x11, ANIM_CUT_IMP_OUTRO_CRATE4_03) + show_object_with_animation(0x12, ANIM_CUT_IMP_OUTRO_CRATE5_03) + show_object_with_animation(0x13, ANIM_CUT_IMP_OUTRO_CRATE6_03) + show_object_with_animation(0x14, ANIM_CUT_IMP_OUTRO_CRATE7_03) + + wait_until(1090, 0x95) + play_sound(SFX_SKEDAR_ROAR_0529, CHANNEL_10) + + wait_until(1100, 0x96) + play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) + + wait_until(1264, 0x97) + play_sound(SFX_00E3, CHANNEL_10) + + wait_until(1280, 0x98) + play_sound(SFX_00E4, CHANNEL_10) + + wait_until(1315, 0x99) + play_sound(MP3_07BA, CHANNEL_10) + play_sound(SFX_00EE, CHANNEL_10) + + wait_until(1330, 0x9a) + play_sound(SFX_00DF, CHANNEL_10) + + wait_until(1350, 0x9b) + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, TRUE) + yield + set_chr_shooting_in_cutscene(CHR_BOND, FALSE) + play_sound(MP3_07BA, CHANNEL_10) + play_sound(SFX_00E4, CHANNEL_10) + + beginloop(0x0d) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0xb8) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0xb8) + label(0x2e) + endloop(0x0d) + + label(0xb8) + mute_channel(CHANNEL_10) + stop_cutscene_track + stop_ambient_track + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_intro[] = { + play_cutscene_track(MUSIC_DEFENSE_INTRO) + camera_movement(ANIM_CUT_IMP_INTRO_CAM_01) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_ailist(CHR_CARRINGTON, GAILIST_IDLE) + set_ailist(0x19, GAILIST_IDLE) + set_ailist(0x1a, GAILIST_IDLE) + set_chr_chrflag(0x16, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_CARRINGTON, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_CARR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 4) + set_chr_chrflag(0x19, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x19, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x19, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x19, 4) + set_chr_chrflag(0x1a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x1a, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x1a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x1a, 4) + enable_object(0x0d) + set_object_flag2(0x0d, OBJFLAG2_04000000) + set_object_flag3(0x0d, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_INTRO_DROPSHIP, 0x0d, 0x04, 0xffff) + restart_timer + set_cutscene_weapon(0x1a, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(0x1a, WEAPON_AR34, WEAPON_NONE) + + wait_until(4, 0x71) + speak(CHR_BOND, L_IMP_041, MP3_0475, CHANNEL_10, COLOR_06_WHITE) // "All ready, Joanna? We can't keep the Maian delegat..." + + wait_until(72, 0x72) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(104, 0x73) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(450, 0x74) + speak(CHR_BOND, L_IMP_042, MP3_0476, CHANNEL_10, COLOR_09_BLUE) // "Am I ready? What do you mean? I was ready half an ..." + + wait_until(688, 0x76) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(754, 0x77) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(800, 0x75) + speak(CHR_BOND, L_IMP_043, MP3_0477, CHANNEL_10, COLOR_06_WHITE) // "But you know how it is, Joanna... I had to make su..." + + wait_until(822, 0x78) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(850, 0x79) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(866, 0x7a) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(892, 0x7b) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(926, 0x7c) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(945, 0x7d) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(976, 0x7e) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(990, 0x7f) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1030, 0x80) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(1048, 0x81) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(1102, 0x83) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(1110, 0x84) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(1158, 0x85) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(1160, 0x82) + speak(CHR_BOND, L_IMP_044, MP3_0478, CHANNEL_10, COLOR_09_BLUE) // "They should keep you away from mirrors. Nervous?" + + wait_until(1170, 0x86) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(1224, 0x87) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(1258, 0x88) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(1440, 0x89) + speak(CHR_BOND, L_IMP_045, MP3_0479, CHANNEL_10, COLOR_06_WHITE) // "Very. I've waited for this moment for so many year..." + + wait_until(1442, 0x8a) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(1450, 0x8b) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(1594, 0x8c) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1676, 0x8d) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(1741, 0x8e) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(2252, 0x8f) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(2296, 0x90) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(2326, 0x91) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(2378, 0x92) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(2383, 0x93) + play_sound(SFX_00B5, CHANNEL_10) + + wait_until(2410, 0x94) + speak(CHR_BOND, L_IMP_046, MP3_047A, CHANNEL_10, COLOR_06_WHITE) // "Where did that come from?" + + wait_until(2416, 0x95) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(2446, 0x96) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(2510, 0x97) + play_sound(SFX_00AD, CHANNEL_10) + + wait_until(2566, 0x98) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(2582, 0x99) + play_sound(SFX_00B2, CHANNEL_10) + + wait_until(2628, 0x9b) + speak(CHR_BOND, L_IMP_047, MP3_047B, CHANNEL_10, COLOR_09_BLUE) // "It was up on ground level..." + + wait_until(2804, 0x9c) + play_sound(SFX_00B5, CHANNEL_10) + + wait_until(2910, 0x9e) + play_sound(SFX_0165, CHANNEL_10) + set_cutscene_weapon(0x1a, WEAPON_NONE, WEAPON_NONE) + set_cutscene_weapon(CHR_BOND, WEAPON_AR34, WEAPON_NONE) + + wait_until(2940, 0x9f) + play_sound(SFX_M2_HEY, CHANNEL_10) + + wait_until(2965, 0xa0) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(2970, 0x9d) + speak(CHR_BOND, L_IMP_048, MP3_047C, CHANNEL_10, COLOR_09_BLUE) // "Looks like someone doesn't know when to quit. We'v..." + + wait_until(2984, 0xa1) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3000, 0xa2) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(3106, 0xa3) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3125, 0xa4) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(3142, 0xae) + play_sound(SFX_0167, CHANNEL_10) + unset_object_flag2(0x0d, OBJFLAG2_04000000) + + wait_until(3144, 0xa5) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(3169, 0xa6) + play_sound(SFX_0167, CHANNEL_10) + + wait_until(3180, 0xaf) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3204, 0xb0) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(3228, 0xa7) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(3246, 0xa8) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3263, 0xa9) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(3295, 0xaa) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(3317, 0xab) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3342, 0xac) + play_sound(SFX_0168, CHANNEL_10) + + wait_until(3355, 0xb1) + play_sound(SFX_0166, CHANNEL_10) + + wait_until(3365, 0xad) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3472, 0xb2) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(3498, 0xb3) + play_sound(SFX_0165, CHANNEL_10) + + wait_until(3520, 0xb4) + play_sound(SFX_0166, CHANNEL_10) + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0xb8) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0xb8) + label(0x2e) + endloop(0x0a) + + label(0xb8) + mute_channel(CHANNEL_10) + camera_movement(ANIM_CUT_IMP_INTRO_CAM_02) + cmd0175(60) + unset_object_flag2(0x0d, OBJFLAG2_04000000) + if_controller_button_pressed(/*goto*/ 0xcc) + unset_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_SKEDAR4, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR4, 4) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + enable_object(0x52) + set_object_flag2(0x52, OBJFLAG2_04000000) + set_object_flag3(0x52, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_INTRO_DOOR1, 0x52, 0x04, 0xffff) + enable_object(0x53) + set_object_flag2(0x53, OBJFLAG2_04000000) + set_object_flag3(0x53, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_INTRO_DOOR2, 0x53, 0x04, 0xffff) + restart_timer + + #define wait_until2(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0xcc) \ + if_timer_gt(time, /*goto*/ 0x08) \ + endloop(loopid) \ + label(0x08) + + wait_until2(8, 0x62) + play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) + + wait_until2(26, 0x65) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until2(38, 0x63) + play_sound(SFX_00E3, CHANNEL_10) + + wait_until2(43, 0x64) + play_sound(SFX_00E4, CHANNEL_10) + + wait_until2(63, 0x66) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until2(160, 0x67) + play_sound(SFX_0161, CHANNEL_10) + + wait_until2(202, 0x68) + play_sound(SFX_0162, CHANNEL_10) + + wait_until2(238, 0x69) + play_sound(SFX_0163, CHANNEL_10) + + wait_until2(255, 0x6a) + play_sound(SFX_0164, CHANNEL_10) + + wait_until2(259, 0x6b) + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until2(441, 0x6c) + play_sound(SFX_0163, CHANNEL_10) + + wait_until2(454, 0x6d) + play_sound(SFX_0164, CHANNEL_10) + + wait_until2(522, 0x6e) + play_sound(SFX_05C7, CHANNEL_10) + + wait_until2(546, 0x6f) + play_sound(SFX_05C6, CHANNEL_10) + + wait_until2(610, 0x70) + play_sound(SFX_05C5, CHANNEL_10) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0xcc) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0xcc) + label(0x2e) + endloop(0x0b) + + label(0xcc) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_10) + set_cutscene_weapon(CHR_BOND, WEAPON_AR34, WEAPON_NONE) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_CARRINGTON, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_CARR, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 2) + unset_chr_chrflag(0x19, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(0x19, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER1, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x19, 2) + unset_chr_chrflag(0x1a, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(0x1a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x1a, 2) + unset_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_SKEDAR4, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_IMP_INTRO_SKEDAR, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR4, 2) + unset_object_flag2(0x0d, OBJFLAG2_04000000) + set_object_flag(0x0d, OBJFLAG_DEACTIVATED) + set_object_flag3(0x0d, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_OUTRO_DROPSHIP_01, 0x0d, 0x01, 0xffff) + enable_object(0x52) + set_object_flag2(0x52, OBJFLAG2_04000000) + set_object_flag3(0x52, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_INTRO_DOOR1, 0x52, 0x04, 0xfffe) + enable_object(0x53) + set_object_flag2(0x53, OBJFLAG2_04000000) + set_object_flag3(0x53, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_IMP_INTRO_DOOR2, 0x53, 0x04, 0xfffe) + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + stop_cutscene_track + stop_ambient_track + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + remove_chr(0x19) + remove_chr(0x1a) + set_ailist(0x19, GAILIST_IDLE) + set_ailist(0x1a, GAILIST_IDLE) + unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) + enter_firstperson + yield + set_ailist(CHR_CARRINGTON, AILIST_CARRINGTON) + set_ailist(CHR_SKEDAR4, AILIST_SKEDAR4) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_hide_blondes_and_skedar[] = { + label(0x04) + set_chr_chrflag(CHR_BLONDE7, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SKEDAR3, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_SKEDAR3, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BLONDE1, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BLONDE2, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BLONDE3, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BLONDE4, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BLONDE5, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BLONDE6, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BLONDE1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BLONDE2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BLONDE3, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BLONDE4, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BLONDE5, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BLONDE6, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_check_carrington_dead[] = { + beginloop(0x04) + if_chr_dead(CHR_CARRINGTON, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + show_hudmsg(CHR_BOND, L_IMP_019) // "Carrington has been killed." + set_stage_flag(STAGEFLAG_CARRINGTON_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_init_hostage_fr1[] = { + set_morale(5) + set_chr_maxdamage(CHR_SELF, 1) + set_accuracy(0) + set_ailist(CHR_SELF, AILIST_FIRINGRANGE_HOSTAGE) + endlist +}; + +u8 func0416_init_hostage_fr2[] = { + set_morale(7) + set_chr_maxdamage(CHR_SELF, 1) + set_accuracy(0) + set_ailist(CHR_SELF, AILIST_FIRINGRANGE_HOSTAGE) + endlist +}; + +u8 func0414_firingrange_hostage[] = { + set_shotlist(AILIST_FIRINGRANGE_HOSTAGE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x04) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + goto_next(0x12) + + label(0x03) + jog_to_pad(PAD_PRESET) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + goto_next(0x12) + endloop(0x04) + + label(0x08) + stop_chr + + beginloop(0x0b) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) + goto_next(0x12) + endloop(0x0b) + + label(0x08) + goto_first(0x03) + + label(0x0a) + set_returnlist(CHR_SELF, AILIST_FIRINGRANGE_HOSTAGE) + set_shotlist(AILIST_FIRINGRANGE_HOSTAGE) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Enemy not detected + label(0x12) + set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) + endlist +}; + +u8 func100e_setup_firingrange[] = { + set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_INVINCIBLE) + + // Wait until guns complete or failed, or skip this check if Agent + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_objective_complete(0, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_stage_flag_eq(STAGEFLAG_AUTOGUN_SWITCH_DESTROYED, TRUE, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_00000001, TRUE, /*goto*/ 0x2e) +#endif + reloop(0x04) + + // Wait until player in foyer area + label(0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x0006, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_P1P2, 0x00, 0x0005, /*goto*/ 0x2e) +#endif + endloop(0x04) + + // Configure FR takers and hostages + label(0x2e) + set_ailist(CHR_TAKER_FR1, AILIST_INIT_FIRINGRANGE_TAKER) + set_ailist(CHR_TAKER_FR2, AILIST_INIT_FIRINGRANGE_TAKER) + set_chr_flag_bankx(CHR_HOSTAGE_FR1, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_flag_bankx(CHR_HOSTAGE_FR2, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + restart_timer + + // Wait until player in firing range entrance or door is opening + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0007, /*goto*/ 0x08) + if_door_state(0x23, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2f) + endloop(0x0a) + + // Wait for player to enter room, or 10 seconds + label(0x2f) + restart_timer + + beginloop(0x71) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0007, /*goto*/ 0x08) + if_timer_gt(600, /*goto*/ 0x08) + endloop(0x71) + + // Unset invincible on hostages and takers + label(0x08) + destroy_object(OBJ_FR_GLASS) + unset_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0419_init_firingrange_taker[] = { + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func041b_init_hostage_holo[] = { + set_morale(3) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_HOSTAGE_HOLO) + endlist +}; + +u8 func041a_hostage_holo[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_00040000) + set_shotlist(AILIST_HOSTAGE_HOLO) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x04) + + // Dying + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive - wait until holo room door opened + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_door_state(0x43, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + if_door_state(0x44, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + if_objective_complete(0, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS) + + label(0x2e) + assign_sound(MP3_030E, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + restart_timer + + // Wait until player in sight, or 2 seconds + beginloop(0x0a) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x08) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x08) + if_timer_gt(120, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + assign_sound(MP3_030F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) + label(0x08) + label(0x08) + try_spawn_chr_at_pad(BODY_CIFEMTECH, HEAD_SECRETARY, PAD_IMP_0104, AILIST_INIT_HOLOCLONE1, SPAWNFLAG_00000010 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2e) + label(0x2e) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + try_spawn_chr_at_pad(BODY_CIFEMTECH, HEAD_SECRETARY, PAD_IMP_0105, AILIST_INIT_HOLOCLONE2, SPAWNFLAG_00000010 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2e) + label(0x2e) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + try_spawn_chr_at_pad(BODY_CIFEMTECH, HEAD_SECRETARY, PAD_IMP_0106, AILIST_INIT_HOLOCLONE3, SPAWNFLAG_00000010 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2e) + label(0x2e) + set_ailist(CHR_TAKER_HOLO1, AILIST_TAKER_HOLO1) + set_ailist(CHR_TAKER_HOLO2, AILIST_TAKER_HOLO2) + set_ailist(CHR_TAKER_HOLO3, AILIST_TAKER_HOLO3) + jog_to_pad(PAD_IMP_0107) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + + label(0x12) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_HOLO_TAKERS_DEAD, TRUE, /*goto*/ 0x08) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x10) + + label(0x2e) + goto_first(0x12) + + label(0x08) + set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) + endlist +}; + +u8 func041c_init_holoclone1[] = { + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + play_sound(SFX_MENU_OPENDIALOG, CHANNEL_9) + set_shotlist(AILIST_HOLOCLONE_ONSHOT) + set_chr_maxdamage(CHR_SELF, 1) + set_chr_id(CHR_HOLOCLONE1) + jog_to_pad(PAD_IMP_0108) + set_ailist(CHR_SELF, AILIST_HOLOCLONE) + endlist +}; + +u8 func041d_init_holoclone2[] = { + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + play_sound(SFX_MENU_OPENDIALOG, CHANNEL_5) + set_shotlist(AILIST_HOLOCLONE_ONSHOT) + set_chr_maxdamage(CHR_SELF, 1) + set_chr_id(CHR_HOLOCLONE2) + jog_to_pad(PAD_IMP_0109) + set_ailist(CHR_SELF, AILIST_HOLOCLONE) + endlist +}; + +u8 func041e_init_holoclone3[] = { + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + play_sound(SFX_MENU_OPENDIALOG, CHANNEL_6) + set_shotlist(AILIST_HOLOCLONE_ONSHOT) + set_chr_maxdamage(CHR_SELF, 1) + set_chr_id(CHR_HOLOCLONE3) + jog_to_pad(PAD_IMP_010A) + set_ailist(CHR_SELF, AILIST_HOLOCLONE) + endlist +}; + +u8 func041f_holoclone_onshot[] = { + play_sound(SFX_MENU_SWIPE, CHANNEL_6) + drop_gun_and_fade_out + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041f_holoclone[] = { + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + + label(0x12) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x10) + + label(0x2e) + goto_first(0x12) + + endlist +}; + +#define holo_taker_logic(holoclone) \ + restart_timer \ + chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) \ + \ + beginloop(0xba) \ + set_target_chr(CHR_BOND) \ + if_can_see_target(/*goto*/ 0xbb) \ + set_target_chr(CHR_COOP) \ + if_can_see_target(/*goto*/ 0xbb) \ + if_timer_gt(60, /*goto*/ 0xbb) \ + endloop(0xba) \ + \ + label(0xbb) \ + set_self_chrflag(CHRCFLAG_00000040) \ + set_accuracy(50) \ + set_target_chr(holoclone) \ + label(0x04) \ + yield \ + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0xb9) \ + label(0xb9) \ + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) \ + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) \ + \ + beginloop(0x0a) \ + if_chr_stopped(/*goto*/ 0x08) \ + endloop(0x0a) \ + \ + label(0x08) \ + set_shotlist(GAILIST_UNALERTED) \ + set_returnlist(CHR_SELF, GAILIST_UNALERTED) \ + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + +u8 func0420_taker_holo1[] = { + set_self_chrflag(CHRCFLAG_00040000) + holo_taker_logic(CHR_HOLOCLONE1) + endlist +}; + +u8 func0421_taker_holo2[] = { + set_self_chrflag(CHRCFLAG_00040000) + assign_sound(SFX_M0_WHAT_THE, CHANNEL_6) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) +#else + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) +#endif + holo_taker_logic(CHR_HOLOCLONE2) + endlist +}; + +u8 func0422_taker_holo3[] = { + set_self_chrflag(CHRCFLAG_00040000) + holo_taker_logic(CHR_HOLOCLONE3) + endlist +}; + +u8 func0423_init_shock[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(20) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(90) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0426_init_saved_hostage[] = { + set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + set_chr_team(CHR_SELF, TEAM_NONCOMBAT) + add_health_or_armor(80) + set_chr_maxdamage(CHR_SELF, 1) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_HOSTAGE_THANK_AND_RUN) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0425_hostage_thank_and_run[] = { + set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x03) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2e) + set_chrpreset(CHR_BOND) + goto_next(0x08) + + label(0x2e) + set_chrpreset(CHR_COOP) + + label(0x08) + restart_timer + label(0x0a) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + if_sound_finished(CHANNEL_6, /*goto*/ 0x08) + if_timer_gt(200, /*goto*/ 0x2f) + goto_first(0x0b) + + label(0x08) + play_cistaff_quip(CIQUIP_THANKS, CHANNEL_6) + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + label(0x2f) + restart_timer + + beginloop(0x71) + if_timer_gt(120, /*goto*/ 0x2e) + endloop(0x71) + + label(0x2e) + run_to_pad(PAD_IMP_00B7) + + beginloop(0x11) + if_chr_stopped(/*goto*/ 0x10) + endloop(0x11) + + // Unreachable + set_target_chr(CHR_PRESET) + + beginloop(0x10) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2e) + set_target_chr(CHR_ANTI) + if_can_see_target(/*goto*/ 0x2e) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2e) + if_distance_to_target_gt(500, /*goto*/ 0x08) + label(0x2e) + endloop(0x10) + + label(0x08) + unset_self_chrflag(CHRCFLAG_KILLCOUNTABLE) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0428_init_drop_devastator[] = { + unset_self_chrflag(CHRCFLAG_KILLCOUNTABLE) + set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) + set_chr_team(CHR_SELF, TEAM_NONCOMBAT) + set_chr_maxdamage(CHR_SELF, 40) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_DROP_DEVASTATOR) + endlist +}; + +u8 func0427_drop_devastator[] = { + set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) + if_stage_flag_eq(STAGEFLAG_DROPPED_DEVASTATOR, TRUE, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_DROPPED_DEVASTATOR) + goto_next(0x08) + + // Other hostage already dropped Devastator + label(0x2e) + set_ailist(CHR_SELF, AILIST_HOSTAGE_THANK_AND_RUN) + + label(0x08) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x03) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2e) + set_chrpreset(CHR_BOND) + goto_next(0x08) + + label(0x2e) + set_chrpreset(CHR_COOP) + + label(0x08) + restart_timer + label(0x0a) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + give_object_to_chr(OBJ_DEVASTATOR, CHR_SELF) + yield + drop_concealed_items(CHR_SELF) + play_cistaff_quip(CIQUIP_THANKS, CHANNEL_6) + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + restart_timer + + beginloop(0x71) + if_timer_gt(120, /*goto*/ 0x2e) + endloop(0x71) + + label(0x2e) + run_to_pad(PAD_IMP_00B7) + + beginloop(0x11) + if_chr_stopped(/*goto*/ 0x10) + endloop(0x11) + + // Unreachable + set_target_chr(CHR_PRESET) + + beginloop(0x10) + if_can_see_target(/*goto*/ 0x2e) + if_distance_to_target_gt(500, /*goto*/ 0x08) + label(0x2e) + endloop(0x10) + + label(0x08) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_check_holo_takers_dead[] = { + beginloop(0x03) + if_chr_deadish(CHR_TAKER_HOLO1, /*goto*/ 0x2e) + reloop(0x03) + + label(0x2e) + if_chr_deadish(CHR_TAKER_HOLO2, /*goto*/ 0x2e) + reloop(0x03) + + label(0x2e) + if_chr_deadish(CHR_TAKER_HOLO3, /*goto*/ 0x2e) + endloop(0x03) + + label(0x2e) + set_stage_flag(STAGEFLAG_HOLO_TAKERS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_check_device_takers_dead[] = { + beginloop(0x03) + if_chr_deadish(CHR_TAKER_DEVICE_M, /*goto*/ 0x2e) + reloop(0x03) + + label(0x2e) + if_chr_deadish(CHR_TAKER_DEVICE_F, /*goto*/ 0x2e) + endloop(0x03) + + label(0x2e) + set_stage_flag(STAGEFLAG_DEVICE_TAKERS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_check_info_takers_dead[] = { + beginloop(0x03) + if_chr_deadish(CHR_TAKER_INFO_F, /*goto*/ 0x2e) + reloop(0x03) + + label(0x2e) + if_chr_deadish(CHR_TAKER_INFO_M, /*goto*/ 0x2e) + endloop(0x03) + + label(0x2e) + set_stage_flag(STAGEFLAG_INFO_TAKERS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042c_init_hostage_device_f[] = { + set_morale(1) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_DEVICEROOM_HOSTAGE) + endlist +}; + +u8 func042d_init_hostage_device_m[] = { + set_morale(6) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_DEVICEROOM_HOSTAGE) + endlist +}; + +u8 func042b_deviceroom_hostage[] = { + set_shotlist(AILIST_DEVICEROOM_HOSTAGE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x12) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x12) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2e) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2e) + stop_chr + goto_next(0x10) + + label(0x2e) + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_DEVICE_TAKERS_DEAD, TRUE, /*goto*/ 0x08) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x10) + + label(0x2e) + goto_first(0x12) + + label(0x08) + set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) + endlist +}; + +u8 func042f_init_taker_device_m[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_TAKER_DEVICE_M) + endlist +}; + +u8 func042e_taker_device_m[] = { + set_shotlist(AILIST_TAKER_DEVICE_M) + if_chr_dead(CHR_SELF, /*goto*/ 0x2e) + if_chr_dead(CHR_SELF, /*goto*/ 0x2e) + if_chr_dead(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x08) + + // Dying + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x08) + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x08) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + if_objective_complete(0, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS) + + label(0x2e) + increase_squadron_alertness(100) + assign_sound(SFX_M0_WHAT_THE, CHANNEL_6) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) +#else + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) +#endif + restart_timer + chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) + + beginloop(0xba) + if_timer_gt(60, /*goto*/ 0xbb) + endloop(0xba) + + label(0xbb) + set_self_chrflag(CHRCFLAG_00000040) + set_accuracy(50) + set_target_chr(CHR_HOSTAGE_DEVICE_M) + set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) + endlist +}; + +u8 func0431_init_taker_device_f[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_TAKER_DEVICE_F) + endlist +}; + +u8 func0430_taker_device_f[] = { + set_shotlist(AILIST_TAKER_DEVICE_F) + if_chr_dead(CHR_SELF, /*goto*/ 0x2e) + if_chr_dead(CHR_SELF, /*goto*/ 0x2e) + if_chr_dead(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x08) + + // Dying + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x08) + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x08) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + increase_squadron_alertness(100) + set_self_flag_bankx(CHRFLAG1_CAN_RELOAD, BANK_1) + restart_timer + chr_do_animation(ANIM_RELOAD_0209, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0xbc) + if_self_flag_bankx_eq(CHRFLAG1_CAN_RELOAD, FALSE, BANK_1, /*goto*/ 0x08) + if_timer_lt(120, /*goto*/ 0x08) + assign_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) + unset_self_flag_bankx(CHRFLAG1_CAN_RELOAD, BANK_1) + label(0x08) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0xbc) + + label(0x2e) + set_self_chrflag(CHRCFLAG_00000040) + set_accuracy(50) + set_target_chr(CHR_HOSTAGE_DEVICE_F) + set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) + endlist +}; + +u8 func0432_taker_attack[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_shotlist(AILIST_TAKER_ATTACK) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x08) + + // Dying + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x08) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x04) + + // Injured + label(0x2e) + restart_timer + + beginloop(0x71) + if_chr_stopped(/*goto*/ 0x04) + if_timer_gt(180, /*goto*/ 0x04) + endloop(0x71) +#else + set_shotlist(GAILIST_ALERTED) +#endif + + // Healthy + label(0x04) + yield + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0xb9) + label(0xb9) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x08) + endloop(0x0a) + + label(0x08) +#if VERSION >= VERSION_NTSC_1_0 + label(0x0f) +#endif + set_shotlist(GAILIST_UNALERTED) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func0434_init_hostage_info_m[] = { + set_morale(2) + add_health_or_armor(10) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_INFOROOM_HOSTAGE) + endlist +}; + +u8 func0435_init_hostage_info_f[] = { + set_morale(8) + add_health_or_armor(10) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_INFOROOM_HOSTAGE) + endlist +}; + +u8 func0433_inforoom_hostage[] = { + set_shotlist(AILIST_INFOROOM_HOSTAGE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x04) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x04) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x08) + endloop(0x04) + + label(0x08) + if_objective_complete(0, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS) + + // This flag is assigned at random to one of the two hostages + label(0x2e) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x0e) + + // Flag not set - run and cower + run_to_pad(PAD_IMP_010D) + + beginloop(0x0a) + if_stage_flag_eq(STAGEFLAG_INFO_TAKERS_DEAD, TRUE, /*goto*/ 0x0d) + if_chr_stopped(/*goto*/ 0x12) + endloop(0x0a) + + label(0x12) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_INFO_TAKERS_DEAD, TRUE, /*goto*/ 0x0d) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x10) + + label(0x2e) + goto_first(0x12) + + // Flag was set - fight hostage taker + label(0x0e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2e) + goto_next(0x0d) + + label(0x2e) + unset_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + set_shotlist(AILIST_INFOROOM_HOSTAGE) + set_returnlist(CHR_SELF, AILIST_INFOROOM_HOSTAGE) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + label(0x0d) + if_kill_count_gt(1, /*goto*/ 0x2e) + set_ailist(CHR_SELF, AILIST_INIT_DROP_DEVASTATOR) + + label(0x2e) + set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) + endlist +}; + +u8 func1012_info_room[] = { + beginloop(0x04) + if_door_state(0x19, DOORSTATE_OPEN, /*goto*/ 0x2e) + endloop(0x04) + + // One hostage is randomly given chrflag0_00000004, which allows that + // hostage to fight the taker. + label(0x2e) + call_rng + if_rand_gt(128, /*goto*/ 0x0a) + + set_chr_flag_bankx(CHR_HOSTAGE_INFO_M, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_flag_bankx(CHR_HOSTAGE_INFO_F, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_flag_bankx(CHR_HOSTAGE_INFO_M, CHRFLAG0_GP1, BANK_0) + set_chr_maxdamage(CHR_TAKER_INFO_M, 10) + goto_next(0x2e) + + label(0x0a) + set_chr_flag_bankx(CHR_HOSTAGE_INFO_M, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_flag_bankx(CHR_HOSTAGE_INFO_F, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_flag_bankx(CHR_HOSTAGE_INFO_F, CHRFLAG0_GP1, BANK_0) + set_chr_maxdamage(CHR_TAKER_INFO_F, 10) + + label(0x2e) + restart_timer + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + set_chr_flag_bankx(CHR_TAKER_INFO_F, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_chr_flag_bankx(CHR_TAKER_INFO_M, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0437_init_taker_info_m[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_TAKER_INFO_M) + endlist +}; + +u8 func0436_taker_info_m[] = { + set_shotlist(AILIST_TAKER_INFO_M) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x08) + + // Dying + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x08) + + beginloop(0x0a) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + set_self_chrflag(CHRCFLAG_00000040) + set_accuracy(50) + set_target_chr(CHR_HOSTAGE_INFO_M) + set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) + endlist +}; + +u8 func0439_init_taker_info_f[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_TAKER_INFO_F) + endlist +}; + +u8 func0438_taker_info_f[] = { + set_shotlist(AILIST_TAKER_INFO_F) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x08) + + // Dying + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x08) + + beginloop(0x0a) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + set_self_chrflag(CHRCFLAG_00000040) + set_accuracy(20) + set_target_chr(CHR_HOSTAGE_INFO_F) + set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) + endlist +}; + +u8 func1013_check_hostages_saved[] = { + yield + yield + + beginloop(0x0a) + if_chr_deadish(CHR_HOSTAGE_FR1, /*goto*/ 0x2f) + goto_next(0x2e) + + // FR1 hostage dead + label(0x2f) + if_chr_deadish(CHR_HOSTAGE_FR2, /*goto*/ 0x2f) + + // FR1 hostage alive + label(0x2e) + if_chr_deadish(CHR_TAKER_FR1, /*goto*/ 0x2e) + endloop(0x0a) + + // FR1 hostage alive and FR1 taker dead + label(0x2e) + if_chr_deadish(CHR_TAKER_FR2, /*goto*/ 0x2e) + goto_first(0x0a) + + // Both FR hostages dead + label(0x2f) + + // Both FR takers dead + label(0x2e) + if_stage_flag_eq(STAGEFLAG_DEVICE_TAKERS_DEAD, TRUE, /*goto*/ 0x2e) + if_chr_deadish(CHR_HOSTAGE_DEVICE_F, /*goto*/ 0x2f) + goto_first(0x0a) + + label(0x2f) + if_chr_deadish(CHR_HOSTAGE_DEVICE_M, /*goto*/ 0x2e) + goto_first(0x0a) + + // FR and device room done + label(0x2e) + if_stage_flag_eq(STAGEFLAG_INFO_TAKERS_DEAD, TRUE, /*goto*/ 0x2e) + if_chr_deadish(CHR_HOSTAGE_INFO_M, /*goto*/ 0x2f) + goto_first(0x0a) + + label(0x2f) + if_chr_deadish(CHR_HOSTAGE_INFO_F, /*goto*/ 0x2e) + goto_first(0x0a) + + // FR, device and info rooms done + label(0x2e) + if_stage_flag_eq(STAGEFLAG_HOLO_TAKERS_DEAD, TRUE, /*goto*/ 0x2e) + if_chr_deadish(CHR_HOSTAGE_HOLO, /*goto*/ 0x2e) + goto_first(0x0a) + + // All rooms done + label(0x2e) + if_stage_flag_eq(STAGEFLAG_TOO_MANY_HOSTAGES_KILLED, TRUE, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_IMP_017) // "Hostages have been saved." + set_stage_flag(STAGEFLAG_ENOUGH_HOSTAGES_SAVED) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_carrington_messages[] = { + restart_timer + + beginloop(0x03) + if_chr_dead(CHR_CARRINGTON, /*goto*/ 0xd9) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) + endloop(0x03) + + #define carrington_sanity_checks \ + if_chr_dead(CHR_CARRINGTON, /*goto*/ 0xd9) \ + if_chr_dead(CHR_BOND, /*goto*/ 0x05) \ + goto_next(0x06) \ + \ + label(0x05) \ + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xd9) \ + label(0x06) + + label(0x2e) + yield + label(0x08) + restart_timer + + beginloop(0x0a) + carrington_sanity_checks + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) + if_timer_gt(180, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + restart_timer + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + speak(CHR_BOND, L_IMP_020, SFX_8193, CHANNEL_6, COLOR_06_WHITE) // "Joanna - we're under attack." + + beginloop(0x0b) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0x0b) + + label(0x08) + speak(CHR_BOND, L_IMP_021, SFX_8194, CHANNEL_6, COLOR_06_WHITE) // "Get the guns back on line - hurry." + + beginloop(0x0c) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x0d) + endloop(0x0c) + + beginloop(0x0d) + set_stage_flag(STAGEFLAG_TRIGGER_AUTODEFENSES_MSG) + carrington_sanity_checks + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) + if_objective_complete(0, /*goto*/ 0x08) + endloop(0x0d) + + label(0x08) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) + unlock_door(0x23, 0x04) + unlock_door(0x24, 0x04) + restart_timer + + beginloop(0xbd) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0xda) + endloop(0xbd) + + label(0xda) + restart_timer + speak(CHR_BOND, L_IMP_022, SFX_8195, CHANNEL_6, COLOR_06_WHITE) // "The Skedar have taken hostages." + + beginloop(0x0e) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0x0e) + + label(0x08) + restart_timer + speak(CHR_BOND, L_IMP_023, SFX_8196, CHANNEL_6, COLOR_06_WHITE) // "Get up to the offices and save them." + + beginloop(0x0f) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x10) + endloop(0x0f) + + label(0x10) + set_stage_flag(STAGEFLAG_TRIGGER_COUNTINGONME_MSG) + yield + carrington_sanity_checks + if_objective_complete(1, /*goto*/ 0x08) + goto_first(0x10) + + label(0x08) + restart_timer + + beginloop(0xbe) + carrington_sanity_checks + if_timer_gt(300, /*goto*/ 0x08) + reloop(0xbe) + + label(0x08) + if_sound_finished(CHANNEL_6, /*goto*/ 0x08) + endloop(0xbe) + + label(0x08) + restart_timer + speak(CHR_BOND, L_IMP_024, SFX_8197, CHANNEL_6, COLOR_06_WHITE) // "They're using a new form of shield technology." + + beginloop(0x11) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0x11) + + label(0x08) + restart_timer + speak(CHR_BOND, L_IMP_025, SFX_8198, CHANNEL_6, COLOR_06_WHITE) // "Foster was working on a new weapon which may be us..." + + beginloop(0x12) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0xbf) + endloop(0x12) + + beginloop(0xbf) + carrington_sanity_checks + if_objective_complete(2, /*goto*/ 0x08) + endloop(0xbf) + + label(0x08) + if_difficulty_lt(DIFF_PA, /*goto*/ 0xdb) + restart_timer + + beginloop(0xc0) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0xc0) + + label(0x08) +#if VERSION >= VERSION_JPN_FINAL + unset_object_flag(OBJ_SAFEINFO, OBJFLAG_INVINCIBLE) +#endif + restart_timer + speak(CHR_BOND, L_IMP_026, SFX_8199, CHANNEL_6, COLOR_06_WHITE) // "Damn it. My office... If they get access..." + + beginloop(0xc1) + carrington_sanity_checks + if_timer_gt(240, /*goto*/ 0x08) + endloop(0xc1) + + label(0x08) + restart_timer + speak(CHR_BOND, L_IMP_027, SFX_819A, CHANNEL_6, COLOR_06_WHITE) // "Get there first, Jo, and destroy the files." + + beginloop(0xc2) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0xc3) + endloop(0xc2) + + beginloop(0xc3) + carrington_sanity_checks + if_objective_complete(3, /*goto*/ 0x08) + endloop(0xc3) + + label(0x08) + label(0xdb) + + // Wait until no one in skedar shuttle area + beginloop(0x71) + if_chr_in_room(CHR_BOND, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x0055, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_BOND, 0x00, 0x0046, /*goto*/ 0x2e) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xe5) +#endif + if_chr_in_room(CHR_COOP, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_COOP, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_COOP, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_COOP, 0x00, 0x0055, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_COOP, 0x00, 0x0046, /*goto*/ 0x2e) + label(0xe5) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0xe5) +#endif + if_chr_in_room(CHR_ANTI, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_ANTI, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_ANTI, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_ANTI, 0x00, 0x0055, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_ANTI, 0x00, 0x0046, /*goto*/ 0x2e) + label(0xe5) +#endif + goto_next(0x08) + + label(0x2e) + endloop(0x71) + + label(0x08) + restart_timer + + beginloop(0xc4) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0xc4) + + label(0x08) + restart_timer + speak(CHR_BOND, L_IMP_028, SFX_819B, CHANNEL_6, COLOR_06_WHITE) // "Things are desperate. They've planted a bomb." + + beginloop(0xc5) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0xc5) + + label(0x08) + restart_timer + speak(CHR_BOND, L_IMP_029, SFX_819C, CHANNEL_6, COLOR_06_WHITE) // "Find it and get it out of the building." + + beginloop(0xc6) + carrington_sanity_checks + if_timer_gt(180, /*goto*/ 0x08) + endloop(0xc6) + + label(0x08) + play_x_track(XREASON_DEFAULT, 10, 120) + set_countdown_timer(120) + show_countdown_timer + start_countdown_timer + + beginloop(0xc7) + if_stage_flag_eq(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF, TRUE, /*goto*/ 0x2e) + if_countdown_timer_lt(1, /*goto*/ 0x08) + endloop(0xc7) + + label(0x08) + set_stage_flag(STAGEFLAG_BOMB_EXPLODING_ON_GROUND) +#if VERSION < VERSION_NTSC_1_0 + explosions_around_chr(CHR_BOND) +#endif + hide_countdown_timer + label(0x2e) + restart_timer + + beginloop(0xc8) + if_timer_gt(300, /*goto*/ 0x2e) + endloop(0xc8) + + label(0x2e) + carrington_sanity_checks + restart_timer + speak(CHR_BOND, L_IMP_032, SFX_819D, CHANNEL_6, COLOR_06_WHITE) // "Well done, Joanna. We're nearly clear..." + + beginloop(0xc9) + if_timer_gt(180, /*goto*/ 0x08) + endloop(0xc9) + + label(0x08) + carrington_sanity_checks + speak(CHR_BOND, L_IMP_033, SFX_819E, CHANNEL_6, COLOR_06_WHITE) // "The last dropship is waiting for you. Hurry." + + beginloop(0xca) + if_timer_gt(180, /*goto*/ 0xcb) + endloop(0xca) + + beginloop(0xcb) + chr_toggle_p1p2(CHR_SELF) +#if VERSION >= VERSION_NTSC_1_0 + if_all_objectives_complete(/*goto*/ 0x2e) + reloop(0xcb) + + label(0x2e) +#endif + if_chr_in_room(CHR_P1P2, 0x00, 0x0054, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x0053, /*goto*/ 0x2e) + endloop(0xcb) + + label(0x2e) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2e) + goto_next(0x08) + + label(0x2e) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) + goto_next(0x08) + + label(0x2e) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x08) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, 0x0418) + + label(0xd9) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_firingrange_pc[] = { + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_FR_PC, /*goto*/ 0x08) + if_object_in_good_condition(OBJ_FR_PC, /*goto*/ 0x2e) + goto_next(0x2f) + + label(0x2e) + reloop(0x0a) + + label(0x2f) + show_hudmsg(CHR_BOND, L_IMP_034) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_FR_PC_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x08) + play_sound(SFX_8116, -1) + if_objective_complete(1, /*goto*/ 0x08) + show_hudmsg(CHR_P1P2, L_IMP_030) // "Access denied - authorization failure." + restart_timer + + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x2e) + endloop(0x0b) + + label(0x2e) + endloop(0x0a) + + label(0x08) + show_hudmsg(CHR_P1P2, L_IMP_031) // "Emergency overrides have been engaged." + unset_object_flag(OBJ_RCP120, OBJFLAG_UNCOLLECTABLE) + unset_object_flag(OBJ_RCP120_GLASS, OBJFLAG_INVINCIBLE) + destroy_object(OBJ_RCP120_GLASS) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define topspawner_logic(initfunc, clonefunc) \ + set_self_chrflag(CHRCFLAG_CLONEABLE) \ + set_self_chrflag(CHRCFLAG_HIDDEN) \ + set_self_chrflag(CHRCFLAG_00040000) \ + \ + beginloop(0x04) \ + if_objective_complete(1, /*goto*/ 0x2e) \ + reloop(0x04) \ + \ + label(0x2e) \ + if_never_been_onscreen(/*goto*/ 0x4f) \ + if_can_see_target(/*goto*/ 0x0a) \ + reloop(0x04) \ + \ + label(0x0a) \ + set_ailist(CHR_SELF, clonefunc) \ + \ + label(0x4f) \ + unset_self_chrflag(CHRCFLAG_HIDDEN) \ + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) \ + goto_first(0x04) \ + \ + label(0x4f) \ + try_spawn_clone2(CHR_SELF, initfunc, 0, /*goto*/ 0x2e) \ + set_ailist(CHR_SELF, clonefunc) \ + \ + label(0x2e) \ + yield \ + endloop(0x04) + +#define inittopclone_logic(templatechr, clonefunc) \ + set_chr_dodge_rating(2, 0) \ + set_accuracy(20) \ + set_reaction_speed(70) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(90) \ + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) \ + label(0x04) \ + try_inherit_properties(templatechr, /*goto*/ 0x08) \ + label(0x08) \ + set_chr_team(CHR_SELF, TEAM_ENEMY) \ + rebuild_teams \ + rebuild_squadrons \ + set_ailist(CHR_SELF, clonefunc) + +// Spawner at top of ramp at start +u8 func040a_spawner4[] = { + topspawner_logic(AILIST_INIT_CLONE4, AILIST_CLONE4) + endlist +}; + +u8 func040c_init_clone4[] = { + inittopclone_logic(0x11, AILIST_CLONE4) + endlist +}; + +u8 func040b_clone4[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) + try_run_to_target(/*goto*/ 0x2e) + label(0x2e) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +// Spawner at helipad +u8 func040d_spawner5[] = { + topspawner_logic(AILIST_INIT_CLONE5, AILIST_CLONE5) + endlist +}; + +u8 func040f_init_clone5[] = { + inittopclone_logic(0x12, AILIST_CLONE5) + endlist +}; + +u8 func040e_clone5[] = { + call_rng + if_rand_gt(128, /*goto*/ 0x08) + run_to_pad(PAD_IMP_005B) + goto_next(0x2e) + + label(0x08) + run_to_pad(PAD_IMP_0069) + + label(0x2e) + set_returnlist(CHR_SELF, AILIST_CLONE5) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * When the autoguns are completed, the game removes a single shock guard from + * the tunnels area. + * + * Looks like the intention is to remove the bottom spawners once the autogun + * objective is done, then remove the top spawners once the hostages are done, + * but due to changed chr IDs and a probable incorrect goto, this function + * fails pretty bad at achieving this. + */ +u8 func1016_remove_spawners[] = { + beginloop(0x0a) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_objective_complete(0, /*goto*/ 0x2e) + endloop(0x0a) + + // Unreachable + label(0x08) + remove_chr(0x0c) + remove_chr(0x0e) + remove_chr(0x10) + + beginloop(0x0b) + if_objective_complete(1, /*goto*/ 0x2e) + endloop(0x0b) + + // Agent, or autoguns complete + label(0x2e) + remove_chr(0x0b) // invalid chr ID + remove_chr(0x0d) // black guard + remove_chr(0x0f) // invalid chr ID + + beginloop(0x0c) + if_objective_complete(2, /*goto*/ 0x2e) + endloop(0x0c) + + label(0x2e) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +// Spawner outside Jo's office +u8 func0410_spawner6[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_objective_complete(2, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x000c, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_never_been_onscreen(/*goto*/ 0x4f) + if_can_see_target(/*goto*/ 0x0a) + reloop(0x04) + + label(0x0a) + set_ailist(CHR_SELF, AILIST_CLONE6) + + label(0x4f) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + label(0x4f) + try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE6, 0, /*goto*/ 0x2e) + set_ailist(CHR_SELF, AILIST_CLONE6) + + label(0x2e) + yield + endloop(0x04) + + endlist +}; + +u8 func0412_init_clone6[] = { + inittopclone_logic(0x13, AILIST_CLONE6) + endlist +}; + +u8 func0411_clone6[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) + try_run_to_target(/*goto*/ 0x2e) + label(0x2e) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func1022_skedar_shuttle[] = { + beginloop(0x12) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + if_objective_complete(3, /*goto*/ 0x08) + reloop(0x12) + + label(0x2e) + if_objective_complete(2, /*goto*/ 0x08) + endloop(0x12) + + label(0x08) + + beginloop(0x71) + if_chr_in_room(CHR_BOND, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x0055, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_BOND, 0x00, 0x0046, /*goto*/ 0x2e) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xe5) +#endif + if_chr_in_room(CHR_COOP, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_COOP, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_COOP, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_COOP, 0x00, 0x0055, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_COOP, 0x00, 0x0046, /*goto*/ 0x2e) + label(0xe5) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0xe5) +#endif + if_chr_in_room(CHR_ANTI, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_ANTI, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_ANTI, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_ANTI, 0x00, 0x0055, /*goto*/ 0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_in_room(CHR_ANTI, 0x00, 0x0046, /*goto*/ 0x2e) + label(0xe5) +#endif + goto_next(0x08) + + label(0x2e) + endloop(0x71) + + label(0x08) + enable_object(OBJ_SKEDAR_SHUTTLE) + set_object_flag2(OBJ_SKEDAR_SHUTTLE, OBJFLAG2_04000000) + set_object_flag3(OBJ_SKEDAR_SHUTTLE, OBJFLAG3_00000010) + object_do_animation(ANIM_045A, OBJ_SKEDAR_SHUTTLE, 0x04, 0xffff) + object_set_modelpart_visible(OBJ_SKEDAR_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + set_object_flag(OBJ_SKEDAR_SHUTTLE, OBJFLAG_00000100) + + unset_chr_chrflag(CHR_BLONDE1, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE2, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE3, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE4, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE5, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE6, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BLONDE2, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BLONDE3, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BLONDE4, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BLONDE5, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BLONDE6, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_BLONDE1, AILIST_INIT_BLONDE) + set_ailist(CHR_BLONDE2, AILIST_INIT_BLONDE) + set_ailist(CHR_BLONDE3, AILIST_INIT_BLONDE) + set_ailist(CHR_BLONDE4, AILIST_INIT_BLONDE) + set_ailist(CHR_BLONDE5, AILIST_INIT_BLONDE) + set_ailist(CHR_BLONDE6, AILIST_INIT_BLONDE) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_BOMB_EXPLODING_ON_GROUND, TRUE, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF, TRUE, /*goto*/ 0x0a) + object_do_animation(ANIM_045A, OBJ_SKEDAR_SHUTTLE, 0x04, 0xffff) + endloop(0x04) + + // Bomb exploding while on ground + label(0x2e) + hide_countdown_timer + stop_countdown_timer + destroy_object(OBJ_SKEDAR_SHUTTLE) + explosions_around_chr(CHR_BOND) + restart_timer + + beginloop(0x72) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x72) + + label(0x2e) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2f) + explosions_around_chr(CHR_COOP) + + goto_next(0x41) + label(0x2f) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x41) + explosions_around_chr(CHR_ANTI) + + label(0x41) + restart_timer + + beginloop(0x73) + if_timer_gt(90, /*goto*/ 0x2e) + endloop(0x73) + + label(0x2e) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Bomb deactivated + label(0x0a) + hide_countdown_timer + stop_countdown_timer + object_do_animation(ANIM_045B, OBJ_SKEDAR_SHUTTLE, 0x08, 0xffff) + assign_sound(SFX_810A, CHANNEL_3) + play_sound_from_object(CHANNEL_3, OBJ_SKEDAR_SHUTTLE, 1, 1800, 3000) + restart_timer + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x0b) + + label(0x2e) + assign_sound(SFX_810B, CHANNEL_4) + play_sound_from_object(CHANNEL_4, OBJ_SKEDAR_SHUTTLE, 1, 1800, 3000) + + beginloop(0x0d) + if_timer_gt(200, /*goto*/ 0x08) + endloop(0x0d) + + label(0x08) + set_stage_flag(STAGEFLAG_BOMB_AIRBORNE) + restart_timer + + beginloop(0x0c) + if_timer_gt(240, /*goto*/ 0x2e) + endloop(0x0c) + + label(0x2e) + set_object_health(OBJ_SKEDAR_SHUTTLE, 0) + mute_channel(CHANNEL_3) + mute_channel(CHANNEL_4) + destroy_object(OBJ_SKEDAR_SHUTTLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func043a_unused[] = { + set_chr_maxdamage(CHR_SELF, 1) + + beginloop(0x12) + if_objective_complete(3, /*goto*/ 0x08) + endloop(0x12) + + label(0x08) + + beginloop(0x04) + endloop(0x04) + + endlist +}; + +u8 unregistered_function1[] = { + // All of these objects have been removed... + // Wait for all 4 objects destroyed + beginloop(0x04) + if_object_in_good_condition(0x1f, /*goto*/ 0x08) + goto_next(0x2e) + label(0x08) + reloop(0x04) + + label(0x2e) + if_object_in_good_condition(0x20, /*goto*/ 0x08) + goto_next(0x2e) + label(0x08) + reloop(0x04) + + label(0x2e) + if_object_in_good_condition(0x21, /*goto*/ 0x08) + goto_next(0x2e) + label(0x08) + reloop(0x04) + + label(0x2e) + if_object_in_good_condition(0x22, /*goto*/ 0x08) + goto_next(0x2e) + label(0x08) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x71) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x71) + + label(0x2e) + set_stage_flag(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func043b_init_blonde[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(20) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(90) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func043c_init_cisolder[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(20) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(90) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_DEFEND_PAD) + endlist +}; + +u8 func043d_unused[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(30) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(90) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func043e_carrington[] = { + set_shotlist(AILIST_CARRINGTON) + jog_to_pad(PAD_IMP_0142) + + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + stop_chr + + beginloop(0x0a) + endloop(0x0a) + + endlist +}; + +u8 func0429_skedar4[] = { + stop_chr + set_accuracy(40) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(160) + set_recovery_speed(0) + set_shield(0) + jog_to_pad(PAD_IMP_000C) + set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) + endlist +}; + +u8 func1018_hurt_carrington[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x0a) + if_timer_gt(600, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + damage_chr(CHR_CARRINGTON, WEAPON_SUPERDRAGON) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1019_setup_safeinfo[] = { + label(0x08) +#if VERSION < VERSION_JPN_FINAL + unset_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_SAFEINFO, OBJFLAG_INVINCIBLE) +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101b_msg_autodefenses[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) + + beginloop(0x04) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + if_stage_flag_eq(STAGEFLAG_TRIGGER_AUTODEFENSES_MSG, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + yield + yield + speak(CHR_BOND, L_IMP_035, MP3_03D8, CHANNEL_6, COLOR_09_BLUE) // "The autodefenses will really help me out." + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_msg_fosterworkingon[] = { + beginloop(0x04) + if_objective_complete(1, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x0a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + reloop(0x04) + + label(0x2f) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0009, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + speak(CHR_P1P2, L_IMP_036, MP3_03D9, CHANNEL_6, COLOR_09_BLUE) // "So this is what Foster was working on." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_msg_countingonme[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_COUNTINGONME_MSG, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x0a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + goto_first(0x04) + + label(0x2f) + if_timer_gt(180, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + speak(CHR_BOND, L_IMP_037, MP3_03DA, CHANNEL_6, COLOR_09_BLUE) // "I'll have to go carefully... The hostages are coun..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This message is not played because no condition breaks out of the loop. + */ +u8 func101e_msg_wontknow[] = { + beginloop(0x04) + endloop(0x04) + + label(0x2e) + speak(CHR_BOND, L_IMP_038, MP3_03DB, CHANNEL_6, COLOR_09_BLUE) // "Well, at least I won't know if I'm doing anything ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_configure_cisoldiers[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_ailist(CHR_JONATHAN, AILIST_INIT_JONATHAN) + set_ailist(0x15, AILIST_INIT_CISOLDIER) + set_ailist(0x16, AILIST_INIT_CISOLDIER) + set_ailist(0x17, AILIST_INIT_CISOLDIER) + set_ailist(0x18, AILIST_INIT_CISOLDIER) + set_ailist(0x19, AILIST_INIT_CISOLDIER) + set_ailist(0x1a, AILIST_INIT_CISOLDIER) + set_ailist(0x1b, AILIST_INIT_CISOLDIER) + set_ailist(0x1c, AILIST_INIT_CISOLDIER) + set_ailist(0x1d, AILIST_INIT_CISOLDIER) + set_ailist(0x1e, AILIST_INIT_CISOLDIER) + set_ailist(CHR_HANGARGUY, AILIST_INIT_CISOLDIER) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_trigger_spawning[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + // Wait 15 seconds + label(0x2e) + restart_timer + + beginloop(0x0a) + if_timer_gt(900, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + set_stage_flag(STAGEFLAG_TRIGGER_SPAWNING) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042a_init_jonathan[] = { + set_accuracy(100) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(VERSION >= VERSION_NTSC_1_0 ? 1200 : 800) + set_recovery_speed(100) + set_ailist(CHR_SELF, AILIST_DEFEND_PAD) + endlist +}; + +u8 func1021_setup_jonathan[] = { + yield + if_savefile_flag_is_set(GAMEFILEFLAG_DEFENSE_JON, /*goto*/ 0x08) + remove_chr(CHR_JONATHAN) + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1023_check_skeder_shuttle_destroyed[] = { + beginloop(0x12) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + if_objective_complete(3, /*goto*/ 0x08) + reloop(0x12) + + label(0x2e) + if_objective_complete(2, /*goto*/ 0x08) + endloop(0x12) + + beginloop(0x04) + if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x08) + goto_next(0x2e) + + label(0x08) + goto_first(0x04) + + // Shuttle destroyed + label(0x2e) + restart_timer + + beginloop(0x0a) + if_timer_gt(30, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) +#if VERSION >= VERSION_NTSC_1_0 + if_stage_flag_eq(STAGEFLAG_BOMB_AIRBORNE, TRUE, /*goto*/ 0x0f) +#else + if_stage_flag_eq(STAGEFLAG_BOMB_AIRBORNE, TRUE, /*goto*/ 0x2e) +#endif + show_hudmsg(CHR_BOND, L_IMP_039) // "The bomb has been detonated..." + set_stage_flag(STAGEFLAG_BOMB_EXPLODING_ON_GROUND) + explosions_around_chr(CHR_BOND) + restart_timer + + beginloop(0x72) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x72) + + label(0x2e) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2f) + explosions_around_chr(CHR_COOP) + goto_next(0x41) + + label(0x2f) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x41) + explosions_around_chr(CHR_ANTI) + + label(0x41) + restart_timer + + beginloop(0x73) + if_timer_gt(90, /*goto*/ 0x2e) + endloop(0x73) + + label(0x2e) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + +#if VERSION >= VERSION_NTSC_1_0 + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) +#endif + endlist +}; + +u8 func1024_setup_lifts[] = { + activate_lift(1, 0x41) + activate_lift(2, 0x42) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1025_lift_door_sounds[] = { + beginloop(0xe4) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x46, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x47, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x4a, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x4b, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x4c, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x4d, /*goto*/ 0x2e) + reloop(0xe4) + + label(0x2e) + play_sound(SFX_DOOR_81B0, -1) + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x08) + endloop(0x0a) + + label(0x08) + endloop(0xe4) + + endlist +}; + +u8 func100e_setup_firingrange_doors[] = { + // Wait until firing range doors opened + beginloop(0xe4) + if_door_state(0x23, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + if_door_state(0x23, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + endloop(0xe4) + + // Unset some flags on them + label(0x2e) + unset_object_flag2(0x23, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x24, OBJFLAG2_AICANNOTUSE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1027_uplink[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2f) + goto_next(0x0f) + + label(0x2f) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_activated_object(CHR_TARGET, OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2e) + reloop(0x04) + + // Activated + label(0x08) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2e) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_TARGET, L_IMP_051) // "You need the Data Uplink." + reloop(0x04) + + // Activated with uplink + label(0x2e) + show_hudmsg(CHR_TARGET, L_IMP_052) // "Connection has been made." + restart_timer + + beginloop(0x0a) + if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2f) + goto_next(0x0f) + + label(0x2f) + if_timer_gt(60, /*goto*/ 0x08) + if_chr_in_room(CHR_TARGET, 0x00, 0x0045, /*goto*/ 0x2e) + goto_next(0x0b) + + label(0x2e) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2e) + goto_next(0x0b) + + label(0x2e) + endloop(0x0a) + + // 1 second since uplink + label(0x08) + show_hudmsg(CHR_TARGET, L_IMP_053) // "Bypassing security systems." + restart_timer + assign_sound(SFX_01BF, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_SKEDAR_SHUTTLE, TRUE) + + beginloop(0x13) + if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2f) + goto_next(0x0f) + + label(0x2f) + if_timer_gt(400, /*goto*/ 0x08) + if_chr_in_room(CHR_TARGET, 0x00, 0x0045, /*goto*/ 0x2e) + goto_next(0x0b) + + label(0x2e) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2e) + goto_next(0x0b) + + label(0x2e) + endloop(0x13) + + // 7.66 seconds since uplink + label(0x08) + mute_channel(CHANNEL_5) + assign_sound(SFX_01C1, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_SKEDAR_SHUTTLE, TRUE) + show_hudmsg(CHR_TARGET, L_IMP_054) // "Virus has been downloaded successfully." + yield + show_hudmsg(CHR_TARGET, L_IMP_055) // "Ship's engines have been activated." + set_stage_flag(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF) + + beginloop(0x14) + if_timer_gt(90, /*goto*/ 0x08) + endloop(0x14) + + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + reloop(0x04) + + // Connection broken + label(0x0b) + show_hudmsg(CHR_TARGET, L_IMP_056) // "Connection to ship has been broken." + mute_channel(CHANNEL_5) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, OBJ_SKEDAR_SHUTTLE, TRUE) + restart_timer + + beginloop(0x15) + if_timer_gt(120, /*goto*/ 0x08) + endloop(0x15) + + label(0x08) + mute_channel(CHANNEL_6) + endloop(0x04) + + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1028_shuttle_immunity[] = { + beginloop(0xe4) + if_stage_flag_eq(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF, TRUE, /*goto*/ 0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0045, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x0046, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x0047, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x004d, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x004e, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x0055, /*goto*/ 0x2e) + reloop(0xe4) + + label(0x2e) + unset_object_flag(OBJ_SKEDAR_SHUTTLE, OBJFLAG_INVINCIBLE) + endloop(0xe4) + + label(0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1029_setup_rtracker[] = { + yield + set_object_flag3(OBJ_DEVASTATOR, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102a_setup_environment[] = { + yield + configure_environment(0x0045, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0055, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0056, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102b_safedoor_immunity[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x10) + set_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) + + beginloop(0x04) + if_objective_complete(2, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_object_in_good_condition(OBJ_SAFEDOOR, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2e) + if_chr_in_room(CHR_BOND, 0x00, 0x000c, /*goto*/ 0x2e) + goto_next(0x0b) + + label(0x2e) + if_chr_weapon_equipped(CHR_BOND, WEAPON_LASER, /*goto*/ 0x0f) + + // Jo not in office room or laser not equipped + label(0x0b) + if_chr_in_room(CHR_COOP, 0x00, 0x000c, /*goto*/ 0x2e) + goto_next(0x0e) + + label(0x2e) + if_chr_weapon_equipped(CHR_COOP, WEAPON_LASER, /*goto*/ 0x0f) + + // No one in office room with laser equipped + label(0x0e) + set_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) + reloop(0x04) + + label(0x0f) + unset_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) + endloop(0x04) + + // A and SA + label(0x10) + set_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This keeps the hostage doors locked until the player attempts to open them. + * The "This door is locked" messae is omitted, then the door is unlocked and + * opened via scripting. This prevents guards from opening the doors and + * triggering the hostage rooms before the player is there. + */ +u8 func102c_door_flags[] = { + yield + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x0f) + lock_door(0x23, 0x40) + lock_door(0x24, 0x40) + set_object_flag2(0x23, OBJFLAG2_SKIPDOORLOCKEDMSG) + set_object_flag2(0x24, OBJFLAG2_SKIPDOORLOCKEDMSG) + lock_door(0x43, 0x40) + lock_door(0x44, 0x40) + set_object_flag2(0x43, OBJFLAG2_SKIPDOORLOCKEDMSG) + set_object_flag2(0x44, OBJFLAG2_SKIPDOORLOCKEDMSG) + lock_door(0x54, 0x40) + set_object_flag2(0x54, OBJFLAG2_SKIPDOORLOCKEDMSG) + lock_door(0x19, 0x40) + set_object_flag2(0x19, OBJFLAG2_SKIPDOORLOCKEDMSG) + + beginloop(0xe4) + if_chr_activated_object(CHR_BOND, 0x23, /*goto*/ 0x0a) + if_chr_activated_object(CHR_BOND, 0x23, /*goto*/ 0x0a) + if_chr_activated_object(CHR_BOND, 0x43, /*goto*/ 0x0b) + if_chr_activated_object(CHR_BOND, 0x44, /*goto*/ 0x0b) + if_chr_activated_object(CHR_BOND, 0x54, /*goto*/ 0x0c) + if_chr_activated_object(CHR_BOND, 0x19, /*goto*/ 0x0d) + reloop(0xe4) + + label(0x0a) + unlock_door(0x23, 0x40) + unlock_door(0x24, 0x40) + open_door(0x23) + reloop(0xe4) + + label(0x0b) + unlock_door(0x43, 0x40) + unlock_door(0x44, 0x40) + open_door(0x43) + reloop(0xe4) + + label(0x0c) + unlock_door(0x54, 0x40) + open_door(0x54) + reloop(0xe4) + + label(0x0d) + unlock_door(0x19, 0x40) + open_door(0x19) + endloop(0xe4) + + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function2[] = { + beginloop(0x03) + restart_timer + + // Wait 10 seconds + beginloop(0x0a) + if_timer_gt(600, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + chr_do_animation(ANIM_CUT_IMP_INTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x34, 4) + endloop(0x03) + + endlist +}; + +#if VERSION >= VERSION_NTSC_1_0 +u8 unregistered_function3[] = { + beginloop(0x03) + if_chr_knockedout(CHR_TAKER_INFO_F, /*goto*/ 0x11) + if_chr_knockedout(CHR_TAKER_INFO_M, /*goto*/ 0x12) + reloop(0x03) + + label(0x11) + damage_chr(CHR_TAKER_INFO_F, WEAPON_SUPERDRAGON) + reloop(0x03) + + label(0x12) + damage_chr(CHR_TAKER_INFO_M, WEAPON_SUPERDRAGON) + endloop(0x03) + + endlist +}; +#endif + +#if VERSION >= VERSION_NTSC_1_0 +u8 func102d_firingrange_taker_invincibility[] = { + beginloop(0x03) + if_chr_deadish(CHR_TAKER_FR1, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x0007, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x0008, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x0009, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x000a, /*goto*/ 0x2e) + unset_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_INVINCIBLE) + + label(0x2e) + if_chr_deadish(CHR_TAKER_FR2, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x0007, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x0008, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x0009, /*goto*/ 0x2e) + if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x000a, /*goto*/ 0x2e) + unset_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_INVINCIBLE) + + label(0x2e) + endloop(0x03) + + endlist +}; +#endif + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_hide_blondes_and_skedar, 0x1003 }, + { func1004_check_hostages_killed, 0x1004 }, + { func1005_check_safeinfo_destroyed, 0x1005 }, + { func1007_autogun_switch1, 0x1007 }, + { func1008_autogun_switch2, 0x1008 }, + { func1009_autogun_switch3, 0x1009 }, + { func100b_setup_autoguns, 0x100b }, + { func100c_check_carrington_dead, 0x100c }, + { func100e_setup_firingrange, 0x100e }, + { func100f_check_holo_takers_dead, 0x100f }, + { func1010_check_device_takers_dead, 0x1010 }, + { func1011_check_info_takers_dead, 0x1011 }, + { func1012_info_room, 0x1012 }, + { func1013_check_hostages_saved, 0x1013 }, + { func1014_carrington_messages, 0x1014 }, + { func1015_firingrange_pc, 0x1015 }, + { func1016_remove_spawners, 0x1016 }, + { func1018_hurt_carrington, 0x1018 }, + { func1019_setup_safeinfo, 0x1019 }, + { func101b_msg_autodefenses, 0x101b }, + { func101c_msg_fosterworkingon, 0x101c }, + { func101d_msg_countingonme, 0x101d }, + { func101e_msg_wontknow, 0x101e }, + { func101f_configure_cisoldiers, 0x101f }, + { func1020_trigger_spawning, 0x1020 }, + { func1021_setup_jonathan, 0x1021 }, + { func1022_skedar_shuttle, 0x1022 }, + { func1023_check_skeder_shuttle_destroyed, 0x1023 }, + { func1024_setup_lifts, 0x1024 }, + { func1025_lift_door_sounds, 0x1025 }, + { func100e_setup_firingrange_doors, 0x1026 }, + { func1027_uplink, 0x1027 }, + { func1028_shuttle_immunity, 0x1028 }, + { func1029_setup_rtracker, 0x1029 }, + { func102a_setup_environment, 0x102a }, + { func102b_safedoor_immunity, 0x102b }, + { func102c_door_flags, 0x102c }, +#if VERSION >= VERSION_NTSC_1_0 + { func102d_firingrange_taker_invincibility, 0x102d }, +#endif + { func1002_intro, 0x0c00 }, + { func0c01_outro, 0x0c01 }, + { func1002_intro, 0x0417 }, + { func0c01_outro, 0x0418 }, + { func0414_firingrange_hostage, 0x0414 }, + { func0415_init_hostage_fr1, 0x0415 }, + { func0416_init_hostage_fr2, 0x0416 }, + { func0401_spawner1, 0x0401 }, + { func0404_spawner2, 0x0404 }, + { func0407_spawner3, 0x0407 }, + { func040a_spawner4, 0x040a }, + { func040d_spawner5, 0x040d }, + { func0410_spawner6, 0x0410 }, + { func0402_clone1, 0x0402 }, + { func0403_init_clone1, 0x0403 }, + { func0405_clone2, 0x0405 }, + { func0406_init_clone2, 0x0406 }, + { func0408_clone3, 0x0408 }, + { func0409_init_clone3, 0x0409 }, + { func040b_clone4, 0x040b }, + { func040c_init_clone4, 0x040c }, + { func040e_clone5, 0x040e }, + { func040f_init_clone5, 0x040f }, + { func0411_clone6, 0x0411 }, + { func0412_init_clone6, 0x0412 }, + { func0413_defend_pad, 0x0413 }, + { func0419_init_firingrange_taker, 0x0419 }, + { func041a_hostage_holo, 0x041a }, + { func041b_init_hostage_holo, 0x041b }, + { func041c_init_holoclone1, 0x041c }, + { func041d_init_holoclone2, 0x041d }, + { func041e_init_holoclone3, 0x041e }, + { func041f_holoclone, 0x041f }, + { func0420_taker_holo1, 0x0420 }, + { func0421_taker_holo2, 0x0421 }, + { func0422_taker_holo3, 0x0422 }, + { func0423_init_shock, 0x0423 }, + { func0425_hostage_thank_and_run, 0x0425 }, + { func0426_init_saved_hostage, 0x0426 }, + { func0427_drop_devastator, 0x0427 }, + { func0428_init_drop_devastator, 0x0428 }, + { func0429_skedar4, 0x0429 }, + { func042a_init_jonathan, 0x042a }, + { func041f_holoclone_onshot, 0x0424 }, + { func042b_deviceroom_hostage, 0x042b }, + { func042c_init_hostage_device_f, 0x042c }, + { func042d_init_hostage_device_m, 0x042d }, + { func042e_taker_device_m, 0x042e }, + { func042f_init_taker_device_m, 0x042f }, + { func0430_taker_device_f, 0x0430 }, + { func0431_init_taker_device_f, 0x0431 }, + { func0432_taker_attack, 0x0432 }, + { func0433_inforoom_hostage, 0x0433 }, + { func0434_init_hostage_info_m, 0x0434 }, + { func0435_init_hostage_info_f, 0x0435 }, + { func0436_taker_info_m, 0x0436 }, + { func0437_init_taker_info_m, 0x0437 }, + { func0438_taker_info_f, 0x0438 }, + { func0439_init_taker_info_f, 0x0439 }, + { func043a_unused, 0x043a }, + { func043b_init_blonde, 0x043b }, + { func043c_init_cisolder, 0x043c }, + { func043d_unused, 0x043d }, + { func043e_carrington, 0x043e }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, PATHFLAG_FLYING }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupjun.c b/src/ailists/setupjun.c new file mode 100644 index 000000000..74fc0662c --- /dev/null +++ b/src/ailists/setupjun.c @@ -0,0 +1,40 @@ +// +// Temple (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + intro_weapon(WEAPON_NONE, -1) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setuplam.c b/src/ailists/setuplam.c new file mode 100644 index 000000000..d5624157a --- /dev/null +++ b/src/ailists/setuplam.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x50 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setuplee.c b/src/ailists/setuplee.c new file mode 100644 index 000000000..b032fbb48 --- /dev/null +++ b/src/ailists/setuplee.c @@ -0,0 +1,3953 @@ +// +// Attack Ship +// + +#include "stagesetup.h" + +// Characters +#define CHR_ELVIS 0x00 +#define CHR_KNIFEABLE_SKEDAR 0x01 +#define CHR_SUSPENDEDANIM1 0x0d +#define CHR_SUSPENDEDANIM2 0x0e +#define CHR_SUSPENDEDANIM3 0x0f +#define CHR_SUSPENDEDANIM4 0x10 +#define CHR_BRIDGE1 0x25 +#define CHR_BRIDGE2 0x26 +#define CHR_BRIDGE3 0x2d +#define CHR_MAIAN1 0x2e +#define CHR_MAIAN2 0x2f +#define CHR_MAIAN3 0x30 +#define CHR_BRIDGESPAWNER1 0x31 +#define CHR_BRIDGESPAWNER2 0x32 +#define CHR_CASS 0x33 +#define CHR_INTRO_SKEDAR 0x34 +#define CHR_SHY_SKEDAR 0x35 // hides behind the lift at the start + +// Objects +#define OBJ_HANGARDOOR1 0x00 +#define OBJ_HANGARDOOR2 0x01 +#define OBJ_HANGARDOOR3 0x02 +#define OBJ_HANGARDOOR4 0x03 +#define OBJ_SHIELDCONSOLE1 0x04 +#define OBJ_SHIELDCONSOLE2 0x05 +#define OBJ_SHIELDCONSOLE3 0x06 +#define OBJ_HANGARDOORCONSOLE 0x09 +#define OBJ_HANGARLIFT_ELVIS 0x0c +#define OBJ_HANGARLIFT_JO 0x0e +#define OBJ_AR34 0x18 +#define OBJ_ENGINE1 0x19 +#define OBJ_ENGINE2 0x1a +#define OBJ_PREBRIDGELIFT 0x22 +#define OBJ_BRIDGELIFT 0x23 +#define OBJ_HANGAR_SHUTTLE 0x2c +#define OBJ_MAULER1 0x43 +#define OBJ_MAULER2 0x44 +#define OBJ_OUTRO_SHUTTLE 0x45 +#define OBJ_NECKLACE 0x4a + +// Stage flags +#define STAGEFLAG_ENTERED_BRIDGELIFT 0x00000001 +#define STAGEFLAG_SAID_LOOKOUT 0x00000002 +#define STAGEFLAG_SHIELDS_DISABLED 0x00000100 +#define STAGEFLAG_HANGAR_DOORS_OPEN 0x00000200 +#define STAGEFLAG_NAVIGATION_ROOM_DONE 0x00000400 +#define STAGEFLAG_ELVIS_DEAD 0x00000800 +#define STAGEFLAG_ENTERED_SLAYER_AREA 0x00001000 +#define STAGEFLAG_TRIGGER_HANGAR_MAIANS 0x00002000 +#define STAGEFLAG_HANGAR_ALARM_ACTIVATED 0x00004000 +#define STAGEFLAG_HANGAR_KILLS_DONE 0x00008000 +#define STAGEFLAG_ENGINES_DESTROYED 0x00010000 +#define STAGEFLAG_ENTERED_BRIDGE 0x00020000 +#define STAGEFLAG_ELVIS_COMING_TO_BRIDGE 0x00040000 +#define STAGEFLAG_TRIGGER_BRIDGE_SPAWNING 0x00080000 +#define STAGEFLAG_BRIDGE_CAPTURED 0x00100000 +#define STAGEFLAG_SAID_GETSHIELDSDOWN 0x00200000 +#define STAGEFLAG_INTRO_FINISHED 0x00400000 +#define STAGEFLAG_CASS_AT_PAD 0x00800000 +#define STAGEFLAG_SHY_SKEDAR_READY 0x01000000 +#define STAGEFLAG_02000000 0x02000000 +#define STAGEFLAG_SAID_GO_ON_AHEAD 0x04000000 +#define STAGEFLAG_HANGAR_DOOR_CONSOLE_DESTROYED 0x08000000 +#define STAGEFLAG_MET_ELVIS 0x10000000 +#define STAGEFLAG_AMMO_WASTED 0x20000000 +#define STAGEFLAG_CASS_SCREAMING 0x40000000 +#define STAGEFLAG_BRIDGE_DOORS_UNLOCKED 0x80000000 + +// AI Lists +#define AILIST_INIT_KNIFEABLE_SKEDAR 0x0407 +#define AILIST_KNIFEABLE_SKEDAR 0x0408 +#define AILIST_ELVIS_FOLLOW 0x0409 +#define AILIST_ELVIS_GO_TO_HANGAR_LIFT 0x040a +#define AILIST_INIT_CASS 0x040b +#define AILIST_ELVIS_RUN_FROM_ENGINEROOM 0x040c +#define AILIST_ELVIS_WAIT_FOR_HANGAR_ENTRY 0x040d +#define AILIST_ELVIS_GIVE_AR34 0x040e +#define AILIST_INIT_SKEDAR 0x040f +#define AILIST_WAKE_SUSPENDEDANIM_SKEDAR 0x0410 +#define AILIST_HANGARSPAWNER 0x0412 +#define AILIST_INIT_HANGARCLONE 0x0413 +#define AILIST_HANGARCLONE 0x0414 +#define AILIST_INIT_BRIDGECLONE 0x0416 +#define AILIST_INIT_BRIDGESPAWNER_REVEAL 0x0417 +#define AILIST_INIT_HANGAR_MAIAN 0x0418 +#define AILIST_HANGAR_MAIAN 0x0419 +#define AILIST_BRIDGECLONE 0x041a +#define AILIST_ELVIS_AT_BRIDGE 0x041b +#define AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT 0x041c +#define AILIST_INIT_ELVIS_OUTSIDE_PREBRIDGELIFT 0x041d +#define AILIST_INIT_BRIDGE1AND2 0x041e +#define AILIST_CLOAK_AND_REMOVE 0x041f +#define AILIST_INIT_BRIDGE3 0x0420 +#define AILIST_BRIDGE_SKEDAR 0x0421 +#define AILIST_CASS 0x0422 +#define AILIST_SHY_SKEDAR 0x0423 +#define AILIST_SHY_SKEDAR_WAIT 0x0424 +#define AILIST_INIT_SHY_SKEDAR 0x0425 +#define AILIST_OUTRO 0x0426 +#define AILIST_SET_CLOAKED 0x0427 +#define AILIST_SET_UNCLOAKED 0x0428 + +enum labelnum { + LABEL_60 = (VERSION >= VERSION_NTSC_1_0 ? 0x60 : 0x5f), + LABEL_61, + LABEL_62, + LABEL_63, + LABEL_64, + LABEL_65, + LABEL_66, + LABEL_67, + LABEL_68, + LABEL_69, + LABEL_6A, + LABEL_6B, +#if VERSION >= VERSION_NTSC_1_0 + LABEL_6C, +#endif + LABEL_6D, + LABEL_6E, + LABEL_6F, + LABEL_70, + LABEL_71, + LABEL_72, + LABEL_73, + LABEL_74, + LABEL_75, + LABEL_76, + LABEL_77, + LABEL_78, + LABEL_79, + LABEL_7A, + LABEL_7B, + LABEL_7C, + LABEL_7D, + LABEL_7E, + LABEL_7F, + LABEL_80, + LABEL_81, + LABEL_82, + LABEL_83, + LABEL_84, + LABEL_85, + LABEL_86, + LABEL_87, + LABEL_88, + LABEL_89, + LABEL_8A, + LABEL_8B, + LABEL_8C, + LABEL_8D, + LABEL_8E, + LABEL_8F, + LABEL_90, + LABEL_91, + LABEL_92, + LABEL_93, + LABEL_94, + LABEL_95, + LABEL_96, + LABEL_97, + LABEL_98, + LABEL_99, + LABEL_9A, + LABEL_9B, + LABEL_9C, + LABEL_9D, + LABEL_9E, + LABEL_9F, + LABEL_A0, + LABEL_A1, + LABEL_A2, + LABEL_A3, + LABEL_A4, + LABEL_A5, + LABEL_A6, + LABEL_A7, + LABEL_A8, + LABEL_A9, + LABEL_AA, + LABEL_AB, + LABEL_AC, + LABEL_AD, + LABEL_AE, + LABEL_AF, + LABEL_B0, + LABEL_B1, + LABEL_B2, + LABEL_B3, + LABEL_B4, + LABEL_B5, + LABEL_B6, + LABEL_B7, + LABEL_B8, + LABEL_B9, + LABEL_BA, + LABEL_BB, + LABEL_BC, + LABEL_BD, + LABEL_BE, + LABEL_BF, + LABEL_C0, + LABEL_C1, + LABEL_C2, + LABEL_C3, + LABEL_C4, + LABEL_C5, + LABEL_C6, + LABEL_C7, + LABEL_C8, + LABEL_C9, + LABEL_CA, + LABEL_CB, + LABEL_CC, + LABEL_CD, + LABEL_CE, + LABEL_CF, + LABEL_D0, + LABEL_D1 +}; + +#if VERSION < VERSION_NTSC_1_0 +#define LABEL_6C LABEL_6D +#endif + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_LEE_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_LEE_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_LEE_002) + briefing(BRIEFINGTYPE_TEXT_A, L_LEE_003) + + beginobjective(0, L_LEE_005, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Disable shield system" + complete_flags(STAGEFLAG_SHIELDS_DISABLED) + fail_flags(STAGEFLAG_AMMO_WASTED) + endobjective + + beginobjective(1, L_LEE_006, (DIFFBIT_PA | DIFFBIT_PD)) // "Open hangar doors" + complete_flags(STAGEFLAG_HANGAR_DOORS_OPEN) + fail_flags(STAGEFLAG_HANGAR_DOOR_CONSOLE_DESTROYED) + endobjective + + beginobjective(2, L_LEE_007, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Access navigational systems" + complete_flags(STAGEFLAG_NAVIGATION_ROOM_DONE) + fail_flags(STAGEFLAG_ELVIS_DEAD) + endobjective + + beginobjective(3, L_LEE_008, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Sabotage engine systems" + complete_flags(STAGEFLAG_ENGINES_DESTROYED) + endobjective + + beginobjective(4, L_LEE_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Gain control of bridge" + complete_flags(STAGEFLAG_BRIDGE_CAPTURED) + endobjective + + tag(0x2f, 5) + tag(0x30, 5) + tag(0x25, 2) + tag(0x23, 1) + lift(0x0100, MODEL_SK_LIFT, PAD_LEE_018C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x018c, 0x018d, -1, -1, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x000a0000, 0x1f000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0180, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0181, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + chr(SPAWNFLAG_00000200, 0x01, PAD_LEE_01CF, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_KNIFEABLE_SKEDAR, -1, -1, 1000, 8, 0, CHRFLAG1_ADJUSTPUNCHSPEED, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x35, PAD_LEE_00E8, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SHY_SKEDAR, -1, -1, 1000, 6, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ADJUSTPUNCHSPEED, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0035, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x05, PAD_LEE_01CD, BODY_SKEDAR, HEAD_RANDOM, 0x0401, -1, -1, 100, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 4, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x06, PAD_LEE_01CE, BODY_SKEDAR, HEAD_RANDOM, 0x0402, -1, -1, 100, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 4, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x07, PAD_LEE_00B1, BODY_SKEDAR, HEAD_RANDOM, AILIST_HANGARSPAWNER, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x08, PAD_LEE_00AE, BODY_SKEDAR, HEAD_RANDOM, AILIST_HANGARSPAWNER, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x09, PAD_LEE_01D0, BODY_SKEDAR, HEAD_RANDOM, AILIST_HANGARSPAWNER, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x0a, PAD_LEE_010D, BODY_SKEDAR, HEAD_RANDOM, AILIST_HANGARSPAWNER, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_BLUESIGHT, 0x2e, PAD_LEE_01D8, BODY_ELVIS1, HEAD_MAIAN_S, AILIST_INIT_HANGAR_MAIAN, 0x00b4, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x002e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CALLISTO) + chr(SPAWNFLAG_BLUESIGHT, 0x2f, PAD_LEE_01D9, BODY_ELVIS1, HEAD_MAIAN_S, AILIST_INIT_HANGAR_MAIAN, 0x00b4, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x002f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CALLISTO) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_BLUESIGHT, 0x30, PAD_LEE_01F5, BODY_ELVIS1, HEAD_MAIAN_S, GAILIST_IDLE, 0x00b4, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x00, PAD_LEE_00FE, BODY_ELVISWAISTCOAT, HEAD_ELVIS, AILIST_ELVIS_WAIT_FOR_HANGAR_ENTRY, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_PUNCHHARDER, TEAM_NONCOMBAT, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANPISTOL, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_PHOENIX) + weapon(0x0100, MODEL_CHRMAIANPISTOL, 0x0000, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_PHOENIX) + link_guns(-1, -2) + weapon(0x0100, MODEL_CHRPCGUN, PAD_LEE_001D, 0, 0, 0, WEAPON_AR34) + tag(0x18, -1) + chr(SPAWNFLAG_ONLYONPA, 0x02, PAD_LEE_00D6, BODY_SKEDAR, HEAD_RANDOM, GAILIST_IDLE_0009, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_ONLYONPA, 0x37, PAD_LEE_00D0, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0037, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x0b, PAD_LEE_0020, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x0c, PAD_LEE_001F, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x0d, PAD_LEE_004B, BODY_SKEDAR, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x0e, PAD_LEE_004C, BODY_SKEDAR, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x0f, PAD_LEE_004D, BODY_SKEDAR, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x10, PAD_LEE_004E, BODY_SKEDAR, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_NONCOMBAT, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x11, PAD_LEE_0028, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x12, PAD_LEE_0044, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x13, PAD_LEE_0039, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x14, PAD_LEE_0035, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x15, PAD_LEE_0036, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x16, PAD_LEE_0052, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x17, PAD_LEE_0051, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x18, PAD_LEE_0053, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x19, PAD_LEE_0054, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x1a, PAD_LEE_01DB, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x1b, PAD_LEE_005E, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x1c, PAD_LEE_0059, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x1d, PAD_LEE_0056, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x1e, PAD_LEE_005F, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x1f, PAD_LEE_0055, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x20, PAD_LEE_0060, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x21, PAD_LEE_0068, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x22, PAD_LEE_0069, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x25, PAD_LEE_0089, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_BRIDGE1AND2, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x26, PAD_LEE_0088, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_BRIDGE1AND2, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x2d, PAD_LEE_00A4, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_BRIDGE3, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAULER) + weapon(0x0100, MODEL_CHRMAULER, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + link_guns(-1, -2) + tag(0x43, -3) + tag(0x44, -3) + chr(0, 0x31, PAD_LEE_0095, BODY_SKEDAR, HEAD_RANDOM, 0x0415, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x32, PAD_LEE_0096, BODY_SKEDAR, HEAD_RANDOM, 0x0415, -1, -1, 1000, 200, CHRFLAG0_GP1 | CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x33, PAD_LEE_00DB, BODY_CASSANDRA, HEAD_CASSANDRA, AILIST_INIT_CASS, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x34, PAD_LEE_00E3, BODY_SKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR, CHRFLAG1_ADJUSTPUNCHSPEED, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x27, PAD_LEE_0002, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x28, PAD_LEE_0006, BODY_SKEDAR, HEAD_RANDOM, 0x0403, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x29, PAD_LEE_0008, BODY_SKEDAR, HEAD_RANDOM, 0x0406, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2a, PAD_LEE_0005, BODY_SKEDAR, HEAD_RANDOM, 0x0404, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2b, PAD_LEE_000D, BODY_SKEDAR, HEAD_RANDOM, 0x0405, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_00000200, 0x2c, PAD_LEE_006B, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_SKEDAR, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + tag(0x4a, 1) + key(0x0100, MODEL_CHRCHAIN, 0x0033, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, 0, 0, 8) + rename_object(-1, WEAPON_NECKLACE, L_LEE_050, L_LEE_051, L_LEE_052, L_LEE_053, L_LEE_054) // "Obtain De Vries' necklace." + tag(0x3f, 2) + tag(0x40, 2) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_016A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00320000, 0x0001aaaa, 0x00008000, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_016B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00320000, 0x0001aaaa, 0x00008000, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_016C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_016D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_016E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_016F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0174, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0175, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0176, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0177, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + tag(0x41, 2) + tag(0x42, 2) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0178, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0179, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_017A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_017B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_017C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_017D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0189, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0188, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0186, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0187, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + tag(0x48, 2) + tag(0x49, 2) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0185, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0184, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + tag(0x46, 2) + tag(0x47, 2) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_018A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_018B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000040, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0114, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0115, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0116, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0117, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0118, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0119, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_011A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_011B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_011C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_011D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_011E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_011F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0120, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0121, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0122, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0123, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0124, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0125, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0126, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0127, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0128, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_0129, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_012A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_012B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_012C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_012D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_012E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_012F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR1, PAD_LEE_0134, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR2, PAD_LEE_0135, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR3, PAD_LEE_0136, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000bd1f, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR4, PAD_LEE_0137, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000bd1f, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffd, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR1, PAD_LEE_0138, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR2, PAD_LEE_0139, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR3, PAD_LEE_013A, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000bd1f, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR4, PAD_LEE_013B, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000bd1f, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffd, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR1, PAD_LEE_013C, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR2, PAD_LEE_013D, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR3, PAD_LEE_013E, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000bd1f, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR4, PAD_LEE_013F, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000bd1f, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffd, 0x00000000) + tag(0x0f, 2) + tag(0x10, 2) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_LEE_0144, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_LEE_0145, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x11, 2) + tag(0x12, 2) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_LEE_0146, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_LEE_0147, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + tag(0x13, 2) + tag(0x14, 2) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_LEE_0148, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_LEE_0149, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x15, 2) + tag(0x16, 2) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_LEE_014A, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_LEE_014B, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_HANGARDOOR_BOT, PAD_LEE_014D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001e00) + door(0x0100, MODEL_SK_HANGARDOOR_TOP, PAD_LEE_014C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_HANGARDOOR_BOT, PAD_LEE_014E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001e00) + door(0x0100, MODEL_SK_HANGARDOOR_TOP, PAD_LEE_014F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_HANGARDOOR_BOT, PAD_LEE_0150, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001e00) + door(0x0100, MODEL_SK_HANGARDOOR_TOP, PAD_LEE_0151, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_HANGARDOOR_BOT, PAD_LEE_0152, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001e00) + door(0x0100, MODEL_SK_HANGARDOOR_TOP, PAD_LEE_0153, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + tag(0x24, 1) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0154, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0155, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + tag(0x17, 1) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0156, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000003c0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0157, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000003c0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0158, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000004, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0159, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000004, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_015A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000004, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_015B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x00010000, 0x00010000, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000004, 0x000000f0, 0x00000000, 0xffffffff, 0x00000000) + tag(0x31, 6) + tag(0x32, 6) + tag(0x33, 8) + tag(0x34, 8) + tag(0x2a, 1) + lift(0x0100, MODEL_SK_LIFT, PAD_LEE_0194, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0194, 0x0195, -1, -1, 0x00000001, 0x00000005, 0x00000000, 0x00000000, 0x00030000, 0x00050000, 0x1f000000) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_015C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00320000, 0x0001aaaa, 0x00008000, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR1, PAD_LEE_015D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x00320000, 0x0001aaaa, 0x00008000, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + door(0x0100, MODEL_SK_HANGARDOOR_BOT, PAD_LEE_015E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_SK_HANGARDOOR_TOP, PAD_LEE_015F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -7, 1) + lift_door(-2, -8, 1) + tag(0x35, 6) + tag(0x36, 6) + tag(0x37, 8) + tag(0x38, 8) + tag(0x2b, 1) + lift(0x0100, MODEL_SK_LIFT, PAD_LEE_0196, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0196, 0x0197, -1, -1, 0x00000001, 0x00000005, 0x00000000, 0x00000000, 0x00030000, 0x00050000, 0x1f000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0160, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x000a0000, 0x00005555, 0x00001999, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0161, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x000a0000, 0x00005555, 0x00001999, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + door(0x0100, MODEL_SK_HANGARDOOR_BOT, PAD_LEE_0162, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_SK_HANGARDOOR_TOP, PAD_LEE_0163, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -7, 1) + lift_door(-2, -8, 1) + tag(0x39, 5) + tag(0x3a, 5) + tag(0x29, 2) + tag(0x0e, 1) + lift(0x0100, MODEL_SK_LIFT, PAD_LEE_0193, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0193, 0x0192, -1, -1, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00008000, 0x00050000, 0x1f000000) + door(0x0100, MODEL_SK_HANGARDOORB_BOT, PAD_LEE_0166, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_SK_HANGARDOORB_TOP, PAD_LEE_0167, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 1) + lift_door(-2, -4, 1) + tag(0x3b, 5) + tag(0x3c, 5) + tag(0x28, 2) + tag(0x0c, 1) + lift(0x0100, MODEL_SK_LIFT, PAD_LEE_0190, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0190, 0x0191, -1, -1, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x00050000, 0x1f000000) + door(0x0100, MODEL_SK_HANGARDOORB_BOT, PAD_LEE_0164, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000500) + door(0x0100, MODEL_SK_HANGARDOORB_TOP, PAD_LEE_0165, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x000a0000, 0x000a0000, 0x00008000, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + tag(0x3d, 5) + tag(0x3e, 5) + tag(0x26, 2) + tag(0x22, 1) + lift(0x0100, MODEL_SK_LIFT, PAD_LEE_018E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x018e, 0x018f, -1, -1, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00028000, 0x1f000000) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0182, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_DOOR2, PAD_LEE_0183, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00005555, 0x00005555, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + fan(0x0100, MODEL_SK_SHIP_HOLO1, PAD_LEE_0110, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000222, 0x00000002, 0x01000000) + fan(0x0100, MODEL_SK_SHIP_HOLO2, PAD_LEE_0112, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000222, 0x00000002, 0x01000000) + fan(0x0100, MODEL_SK_SHIP_HOLO2, PAD_LEE_0113, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000222, 0x00000002, 0x01000000) + tag(0x00, 4) + tag(0x01, 4) + tag(0x02, 4) + tag(0x03, 4) + door(0x0100, MODEL_SK_SHIP_HULLDOOR1, PAD_LEE_0140, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR2, PAD_LEE_0141, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00780000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_HULL, 0x00000000, 0x0000ea60, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_SHIP_HULLDOOR3, PAD_LEE_0142, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0x00000001, 0x00001d00) + door(0x0100, MODEL_SK_SHIP_HULLDOOR4, PAD_LEE_0143, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x0000bd1f, 0x00050000, 0x00002aaa, 0x00000ccc, 0, DOORTYPE_SLIDING, 0x00000000, 0x000000f0, 0x00000000, 0xfffffffd, 0x00001d00) + tag(0x09, 1) + multimonitor(0x00cc, MODEL_SK_CONSOLE2, PAD_LEE_01F1, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 21, 20, 20, 0) + multimonitor(0x00cc, MODEL_SK_CONSOLE2, PAD_LEE_01F2, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000, 21, 20, 20, 0) + weapon(0x0100, MODEL_CHRSKROCKET, PAD_LEE_01D2, 0, 0, 0, WEAPON_SLAYER) + tag(0x04, 3) + tag(0x05, 3) + tag(0x06, 3) + multimonitor(0x00cc, MODEL_SK_CONSOLE2, PAD_LEE_01F0, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000, 21, 20, 20, 0) + multimonitor(0x00cc, MODEL_SK_CONSOLE2, PAD_LEE_01EF, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000, 21, 20, 20, 0) + multimonitor(0x00cc, MODEL_SK_CONSOLE2, PAD_LEE_01EE, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000, 21, 20, 20, 0) + tinted_glass(0x0100, MODEL_SK_WINDOW1, PAD_LEE_01CA, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00c801f4) + tinted_glass(0x0100, MODEL_SK_WINDOW1, PAD_LEE_01CB, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00c801f4) + tag(0x19, 2) + tag(0x1a, 2) + stdobject(0x0100, MODEL_ENGINEPART, PAD_LEE_01EA, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_ENGINEPART, PAD_LEE_01E9, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_00200000, 0, 1000) + tag(0x1b, 6) + tag(0x1c, 6) + tag(0x1d, 6) + tag(0x1e, 6) + tag(0x1f, 6) + tag(0x20, 6) + glass(0x0100, MODEL_DD_WINDOW, PAD_LEE_019D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 3000) + glass(0x0100, MODEL_DD_WINDOW, PAD_LEE_019E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 3000) + glass(0x0100, MODEL_DD_WINDOW, PAD_LEE_019F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 3000) + glass(0x0100, MODEL_DD_WINDOW, PAD_LEE_01A0, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 3000) + glass(0x0100, MODEL_DD_WINDOW, PAD_LEE_01A1, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 3000) + glass(0x0100, MODEL_DD_WINDOW, PAD_LEE_01A2, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 3000) + tag(0x21, 1) + stdobject(0x0002, MODEL_SK_SHUTTLE, PAD_LEE_01DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_80000000, 0, 1000) + tag(0x2c, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x45, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x2d, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_LEE_01F3, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x2e, 1) + shield(0x0100, MODEL_CHRSHIELD, 0x0030, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1) + endprops +}; + +s32 intro[] = { +#if VERSION >= VERSION_JPN_FINAL + ammo(AMMOTYPE_PISTOL, 10) + intro_weapon(WEAPON_FALCON2, -1) + ammo(AMMOTYPE_PISTOL, 20) + ammo(AMMOTYPE_KNIFE, 1) + ammo(AMMOTYPE_ROCKET, 2) + ammo(AMMOTYPE_RIFLE, 400) +#else + intro_weapon(WEAPON_COMBATKNIFE, -1) + ammo(AMMOTYPE_KNIFE, 1) + ammo(AMMOTYPE_ROCKET, 2) + ammo(AMMOTYPE_RIFLE, 400) + ammo(AMMOTYPE_PISTOL, 10) +#endif + outfit(OUTFIT_FROCK_RIPPED) + spawn(PAD_LEE_00D9) + endintro +}; + +s32 path00[] = { + PAD_LEE_01D5, + PAD_LEE_01D4, + -1, +}; + +s32 path01[] = { + PAD_LEE_01D7, + PAD_LEE_01D6, + -1, +}; + +s32 path02[] = { + PAD_LEE_0006, + PAD_LEE_0000, + -1, +}; + +s32 path03[] = { + PAD_LEE_0005, + PAD_LEE_000D, + -1, +}; + +s32 path04[] = { + PAD_LEE_01DE, + PAD_LEE_000C, + -1, +}; + +s32 path05[] = { + PAD_LEE_0008, + PAD_LEE_005C, + -1, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) +#endif + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1019_check_shields_lowered[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_SHIELDCONSOLE1, /*goto*/ 0x06) + if_object_in_good_condition(OBJ_SHIELDCONSOLE2, /*goto*/ 0x06) + if_object_in_good_condition(OBJ_SHIELDCONSOLE3, /*goto*/ 0x06) + show_hudmsg(CHR_BOND, L_LEE_010) // "Ship's shields have been lowered." + set_stage_flag(STAGEFLAG_SHIELDS_DISABLED) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) + restart_timer + + beginloop(0x08) + if_chr_in_room(CHR_BOND, 0x00, 0x0002, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + speak(CHR_BOND, L_LEE_017, SFX_81A1, CHANNEL_6, COLOR_04_ORANGE) // "You've got to open the hangar doors so we can dock..." + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + endloop(0x04) + + label(0x09) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_check_hangar_doors_opened[] = { + yield + set_object_flag(OBJ_HANGARDOOR1, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(OBJ_HANGARDOOR2, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(OBJ_HANGARDOOR3, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(OBJ_HANGARDOOR4, OBJFLAG_CANNOT_ACTIVATE) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, OBJ_HANGARDOORCONSOLE, /*goto*/ 0x06) + if_object_in_good_condition(OBJ_HANGARDOORCONSOLE, /*goto*/ 0x2d) + + // Console destroyed + show_hudmsg(CHR_BOND, L_LEE_048) // "Critical mission object destroyed." + set_stage_flag(STAGEFLAG_HANGAR_DOOR_CONSOLE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Console healthy + label(0x2d) + reloop(0x04) + + // A and SA + label(0x2c) + if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x03) + reloop(0x04) + + // Console activated + label(0x06) + if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_LEE_047) // "Hangar doors locked - shields still active." + restart_timer + + beginloop(LABEL_65) + if_timer_gt(120, /*goto*/ 0x06) + endloop(LABEL_65) + + label(0x06) + endloop(0x04) + + // PA - console activated after shields disabled + label(0x2c) + show_hudmsg(CHR_P1P2, L_LEE_011) // "Hangar doors have been opened." + set_stage_flag(STAGEFLAG_HANGAR_DOORS_OPEN) + + // A and SA once shields disabled, or follow through from above + label(0x03) + open_door(OBJ_HANGARDOOR1) + open_door(OBJ_HANGARDOOR2) + open_door(OBJ_HANGARDOOR3) + open_door(OBJ_HANGARDOOR4) + set_object_flag(OBJ_HANGARDOOR1, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_HANGARDOOR2, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_HANGARDOOR3, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_HANGARDOOR4, OBJFLAG_DOOR_KEEPOPEN) + restart_timer + + beginloop(0x09) + if_timer_gt(600, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_HANGAR_MAIANS) + + label(0x08) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_elvis_wait_for_hangar_entry[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_accuracy(100) + set_reaction_speed(100) + add_health_or_armor(200) + set_alertness(100) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + + beginloop(0x04) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_HANGAR_DOORS_OPEN, TRUE, /*goto*/ 0x06) + reloop(0x04) + + label(0x2c) + if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + + beginloop(LABEL_65) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2c) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2c) + set_target_chr(CHR_ANTI) + if_can_see_target(/*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + endloop(LABEL_65) + + label(0x06) + unset_self_chrflag(CHRCFLAG_HIDDEN) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + yield + yield + yield + yield + set_ailist(CHR_SELF, AILIST_ELVIS_GIVE_AR34) + endlist +}; + +u8 func040e_elvis_give_ar34[] = { + set_shotlist(AILIST_ELVIS_GIVE_AR34) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + stop_chr + + // Wait until player in sight + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + set_chrpreset(CHR_P1P2) + if_can_see_target(/*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + + beginloop(0x08) + if_can_see_target(/*goto*/ 0x2c) + endloop(0x08) + + // Run towards player + label(0x0a) + restart_timer + try_run_to_target(/*goto*/ 0x09) + + beginloop(0x09) + set_target_chr(CHR_PRESET) + if_timer_gt(60, /*goto*/ 0x2c) + if_distance_to_target_lt(200, /*goto*/ 0x06) + reloop(0x09) + + label(0x06) + if_can_see_target(/*goto*/ 0x06) + endloop(0x09) + + label(0x2c) + goto_first(0x0a) + + // Talk + label(0x06) + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + set_stage_flag(STAGEFLAG_MET_ELVIS) + speak(CHR_P1P2, L_LEE_019, MP3_02E1, CHANNEL_6, COLOR_04_ORANGE) // "Good to see you, Joanna." + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0c) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + speak(CHR_P1P2, L_LEE_020, MP3_02E2, CHANNEL_6, COLOR_04_ORANGE) // "Take this - you should find it useful..." + give_object_to_chr(OBJ_AR34, CHR_PRESET) + show_hudmsg(CHR_PRESET, L_LEE_021) // "Received AR34 assault rifle." + restart_timer + + beginloop(0x0d) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + set_stage_flag(STAGEFLAG_HANGAR_ALARM_ACTIVATED) + activate_alarm + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + label(0x0f) + yield + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) + endlist +}; + +/** + * Follow player. + * If entered nav room, do that objective. + * If arrived at prebridge lift, assign another function. + */ +u8 func0409_elvis_follow[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_00000040) +#endif + set_shotlist(AILIST_ELVIS_FOLLOW) + set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Dying + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Injured + label(0x2c) +#if VERSION >= VERSION_NTSC_1_0 + restart_timer + say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(LABEL_C1) + if_timer_gt(180, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(LABEL_C1) + + // Healthy + label(0x06) +#else + say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(LABEL_C1) + if_chr_stopped(/*goto*/ 0x06) + endloop(LABEL_C1) + + label(0x06) +#endif + + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + + label(0x03) + set_target_chr(CHR_PRESET) + restart_timer + if_distance_to_target_gt(500, /*goto*/ 0x06) + try_jog_to_target(/*goto*/ 0x04) + + // Distance < 200 or distance > 500 + label(0x06) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_NAVIGATION_ROOM_DONE, TRUE, /*goto*/ 0x2c) + if_chr_in_room(CHR_ELVIS, 0x00, 0x003e, /*goto*/ LABEL_B5) + label(0x2c) + if_stage_flag_eq(STAGEFLAG_SAID_GO_ON_AHEAD, TRUE, /*goto*/ 0x2c) + if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ LABEL_C4) + label(0x2c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2c) + endloop(0x04) + + // Running for 1 second - do distance checks again + label(0x2c) + goto_first(0x03) + + // At player + label(0x06) + stop_chr + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_NAVIGATION_ROOM_DONE, TRUE, /*goto*/ 0x2c) + if_chr_in_room(CHR_ELVIS, 0x00, 0x003e, /*goto*/ LABEL_B5) + label(0x2c) + if_stage_flag_eq(STAGEFLAG_SAID_GO_ON_AHEAD, TRUE, /*goto*/ 0x2c) + if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ LABEL_C4) + label(0x2c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_gt(300, /*goto*/ 0x06) + endloop(0x09) + + // Player moved away - do distance checks and start following + label(0x06) + goto_first(0x03) + + // Enemy detected + label(0x08) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x2c) + if_chrpresets_target_is_different(/*goto*/ 0x06) + label(0x2c) + goto_first(0x03) + + label(0x06) + call_rng + if_rand_lt(85, /*goto*/ LABEL_65) + if_rand_lt(170, /*goto*/ LABEL_66) + say_quip(CHR_BOND, 0x26, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2c) + label(LABEL_65) + say_quip(CHR_BOND, 0x27, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2c) + label(LABEL_66) + say_quip(CHR_BOND, 0x28, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + label(0x2c) + set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW) + set_shotlist(AILIST_ELVIS_FOLLOW) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // Elvis in nav room + label(LABEL_B5) + jog_to_pad(PAD_LEE_0034) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x2c) + endloop(0x0f) + + label(0x2c) + restart_timer + chr_do_animation(ANIM_OPERATE_0221, 0, -1, 0, 16, CHR_SELF, 2) + + beginloop(0x10) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x10) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + show_hudmsg(CHR_BOND, L_LEE_013) // "Navigational information has been retrieved." + speak(CHR_PRESET, L_LEE_031, MP3_02E4, CHANNEL_6, COLOR_04_ORANGE) // "Time to head upwards..." + restart_timer + set_stage_flag(STAGEFLAG_NAVIGATION_ROOM_DONE) + + beginloop(LABEL_79) + if_timer_gt(90, /*goto*/ 0x06) + endloop(LABEL_79) + + label(0x06) + mute_channel(CHANNEL_6) + goto_first(0x03) + + // Elvis outside prebridgelift + label(LABEL_C4) + set_ailist(CHR_SELF, AILIST_INIT_ELVIS_OUTSIDE_PREBRIDGELIFT) + endlist +}; + +u8 func041d_init_elvis_outside_prebridgelift[] = { + set_shotlist(AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) + add_health_or_armor(600) + set_ailist(CHR_SELF, AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) + endlist +}; + +u8 func041c_elvis_outside_prebridgelift[] = { + set_shotlist(AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Dying + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + stop_chr + set_target_chr(CHR_PRESET) + set_stage_flag(STAGEFLAG_SAID_GO_ON_AHEAD) + if_stage_flag_eq(STAGEFLAG_ENTERED_BRIDGELIFT, TRUE, /*goto*/ 0x2c) + speak(CHR_PRESET, L_LEE_026, MP3_04DC, CHANNEL_6, COLOR_04_ORANGE) // "You go on ahead, Jo. I'll secure the perimeter. We..." + label(0x2c) + run_to_pad(PAD_LEE_0063) + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x0b) + endloop(0x09) + + label(0x0b) + stop_chr + + beginloop(0x0c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + endloop(0x0c) + + label(0x08) + set_shotlist(AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) + set_returnlist(CHR_SELF, AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func040a_elvis_go_to_hangar_lift[] = { + set_shotlist(AILIST_ELVIS_GO_TO_HANGAR_LIFT) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Dying + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + + label(0x03) + set_target_chr(CHR_BOND) + restart_timer + if_morale_lt(50, /*goto*/ 0x06) + goto_next(LABEL_C3) + + label(0x06) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + if_timer_gt(60, /*goto*/ 0x2c) + if_distance_to_target_lt(200, /*goto*/ 0x06) + endloop(0x04) + + label(0x2c) + goto_first(0x03) + + // At player + label(0x06) + speak(CHR_BOND, L_LEE_022, MP3_02E4, CHANNEL_6, COLOR_04_ORANGE) // "Time to head upwards. I'll take this lift; you tak..." + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + set_morale(50) + + beginloop(0x0c) + if_timer_gt(180, /*goto*/ LABEL_C3) + endloop(0x0c) + + // Done talk + label(LABEL_C3) + restart_timer + run_to_pad(PAD_LEE_00B2) + + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + stop_chr + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041b_elvis_at_bridge[] = { + stop_chr + set_shotlist(AILIST_ELVIS_AT_BRIDGE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Dying + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + label(0x06) + if_morale_lt(100, /*goto*/ 0x06) + goto_next(0x2c) + + label(0x06) + set_morale(100) + label(0x2c) + + beginloop(LABEL_65) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(LABEL_65) + + label(0x2c) + run_to_pad(PAD_LEE_008A) + restart_timer + + beginloop(0x09) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_stopped(/*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_SAID_LOOKOUT, TRUE, /*goto*/ 0x06) + if_timer_gt(180, /*goto*/ 0x2c) + label(0x06) + reloop(0x09) + + label(0x2c) + speak(CHR_TARGET, L_LEE_024, MP3_02E3, CHANNEL_6, COLOR_04_ORANGE) // "Look out, Joanna! I think we've made them angry..." + set_stage_flag(STAGEFLAG_SAID_LOOKOUT) + endloop(0x09) + + // Reached pad + label(0x0b) + stop_chr + + beginloop(0x0c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + endloop(0x0c) + + label(0x08) + set_shotlist(AILIST_ELVIS_AT_BRIDGE) + set_returnlist(CHR_SELF, AILIST_ELVIS_AT_BRIDGE) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func1005_check_elvis_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + show_hudmsg(CHR_BOND, L_LEE_012) // "Elvis has been killed." + set_stage_flag(STAGEFLAG_ELVIS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040f_init_skedar[] = { + if_chr_deadish(CHR_SELF, /*goto*/ 0x0d) + + // Alive + set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(190) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) + + // Dying or dead + label(0x0d) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0410_wake_suspendedanim_skedar[] = { + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(190) + set_recovery_speed(0) + set_shield(0) + set_target_chr(CHR_BOND) + try_walk_to_target(/*goto*/ 0x2c) + + label(0x2c) + set_shotlist(GAILIST_RELATED_TO_SPAWNING) + set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) + endlist +}; + +u8 func1006_wake_slayer_skedar[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0033, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + // 1 + label(0x06) + unlock_door(0x0f, 0x02) + unlock_door(0x10, 0x02) + open_door(0x0f) + set_chr_team(CHR_SUSPENDEDANIM1, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SUSPENDEDANIM1, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + // 2 + label(0x06) + unlock_door(0x13, 0x02) + unlock_door(0x14, 0x02) + open_door(0x13) + + if_chr_deadish(CHR_SUSPENDEDANIM3, /*goto*/ 0x2c) + set_ailist(CHR_SUSPENDEDANIM3, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) + + set_chr_team(CHR_SUSPENDEDANIM3, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + + // Wait until player coming back from Slayer area + label(0x2c) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_ENTERED_SLAYER_AREA, TRUE, /*goto*/ 0x2c) + reloop(0x0a) + + label(0x2c) + if_chr_in_room(CHR_P1P2, 0x00, 0x0033, /*goto*/ 0x2c) + endloop(0x0a) + + // 3 + label(0x2c) + unlock_door(0x11, 0x02) + unlock_door(0x12, 0x02) + unlock_door(0x15, 0x02) + unlock_door(0x16, 0x02) + open_door(0x11) + open_door(0x15) + set_ailist(CHR_SUSPENDEDANIM2, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) + set_chr_team(CHR_SUSPENDEDANIM2, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + + // 4 + set_ailist(CHR_SUSPENDEDANIM4, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) + set_chr_team(CHR_SUSPENDEDANIM4, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_check_entered_slayer_area[] = { + beginloop(0x08) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x003a, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x003b, /*goto*/ 0x2c) + reloop(0x08) + + label(0x2c) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + if_chr_in_room(CHR_COOP, 0x00, 0x003a, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x003b, /*goto*/ 0x06) + endloop(0x08) + + label(0x2d) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x0d) + label(0x06) + set_stage_flag(STAGEFLAG_ENTERED_SLAYER_AREA) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_hangar_lifts[] = { + set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) + + // Wait until kills done + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_HANGAR_KILLS_DONE, TRUE, /*goto*/ 0x2c) + endloop(0x08) + + // Activate Jo's lift so it starts going to bottom + label(0x2c) + unset_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + + // Wait until lift stopped at bottom + beginloop(LABEL_65) + if_lift_stationary(OBJ_HANGARLIFT_JO, /*goto*/ LABEL_66) + endloop(LABEL_65) + + // Deactivate lift and open door + label(LABEL_66) + set_object_flag(0x39, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x3a, OBJFLAG_DOOR_KEEPOPEN) + unset_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) + open_door(0x39) + open_door(0x3a) + yield + set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) + + beginloop(LABEL_67) + chr_toggle_p1p2(CHR_SELF) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0018, /*goto*/ 0x2c) + if_door_state(0x39, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x2d) + if_door_state(0x3a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x2d) + endloop(LABEL_67) + + // Door closing automatically - reopen it + label(0x2d) + goto_first(LABEL_66) + + // Jo has entered the lift, or Jo dead in co-op + label(0x2c) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) + if_chr_in_room(CHR_COOP, 0x00, 0x0018, /*goto*/ 0x2c) + goto_first(LABEL_67) + + // Jo or Velvet is in the lift - activate it + // Note the lift naturally waits 5 seconds at each stop, + // hence the 5 second wait if entered as soon as the door opens. + label(0x2c) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + unset_object_flag(0x39, OBJFLAG_DOOR_KEEPOPEN) + unset_object_flag(0x3a, OBJFLAG_DOOR_KEEPOPEN) + unset_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) + + // Wait until Y coordinate >= 400 + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ 0x2c) + if_chr_y(CHR_P1P2, 400, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x0a) + + label(0x2c) + endloop(0x09) + + // Wait until lift stopped at top + beginloop(0x0a) + if_lift_stationary(OBJ_HANGARLIFT_JO, /*goto*/ 0x2c) + endloop(0x0a) + + label(0x2c) + set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) + unset_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) + set_ailist(CHR_ELVIS, GAILIST_STOP_AND_IDLE) + yield + +#if VERSION >= VERSION_NTSC_1_0 + if_chr_y(CHR_ELVIS, 400, OPERATOR_LESS_THAN, /*goto*/ 0x06) + goto_next(0x2c) + + // Warp Elvis to his lift + label(0x06) + + beginloop(0x5c) + chr_move_to_pad(CHR_ELVIS, PAD_LEE_00AD, 0x00, /*goto*/ 0x2c) + chr_move_to_pad(CHR_ELVIS, PAD_LEE_01E6, 0x00, /*goto*/ 0x2c) + chr_move_to_pad(CHR_ELVIS, PAD_LEE_01E7, 0x00, /*goto*/ 0x2c) + endloop(0x5c) + + // Activate his lift and wait 2 seconds + label(0x2c) + unset_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) +#else + chr_move_to_pad(CHR_ELVIS, PAD_LEE_00AD, 0x00, /*goto*/ 0x2c) + label(0x2c) +#endif + + restart_timer + + beginloop(0x0b) + if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? 120 : 60, /*goto*/ 0x0c) + endloop(0x0b) + + // Wait for lift to stop at top + beginloop(0x0c) + if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x2c) + endloop(0x0c) + + label(0x2c) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) + set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW) + label(0x2c) + + // Check Elvis actually rode the lift up, and if not then go into a loop + // attempting to warp him. +#if VERSION >= VERSION_NTSC_1_0 + beginloop(LABEL_64) + set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) + unset_object_flag(0x3b, OBJFLAG_CANNOT_ACTIVATE) + unset_object_flag(0x3c, OBJFLAG_CANNOT_ACTIVATE) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + if_chr_y(CHR_ELVIS, 400, OPERATOR_LESS_THAN, /*goto*/ 0x06) + goto_next(LABEL_68) + + // Handle case where Elvis is still in the hangar for some reason + label(0x06) + set_ailist(CHR_ELVIS, AILIST_SET_CLOAKED) + + beginloop(LABEL_6D) + chr_move_to_pad(CHR_ELVIS, PAD_LEE_0012, 0x01, /*goto*/ 0x2c) + endloop(LABEL_6D) + + label(0x2c) + set_ailist(CHR_ELVIS, AILIST_SET_UNCLOAKED) + endloop(LABEL_64) +#else + label(LABEL_64) + set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) + unset_object_flag(0x3b, OBJFLAG_CANNOT_ACTIVATE) + unset_object_flag(0x3c, OBJFLAG_CANNOT_ACTIVATE) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) +#endif + + // Elvis is at top now + // For buddy or counterop who might still be in the hangar, + // wait for lift to be called from hangar + beginloop(LABEL_68) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x3b, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x3c, /*goto*/ 0x2c) + if_chr_activated_object(CHR_ANTI, 0x3b, /*goto*/ 0x2c) + if_chr_activated_object(CHR_ANTI, 0x3c, /*goto*/ 0x2c) + endloop(LABEL_68) + + // Bring Elvis's lift down + label(0x2c) + play_sound(SFX_81A6, -1) + unset_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + + // Wait for it to arrive at bottom + beginloop(LABEL_69) + if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x2c) + endloop(LABEL_69) + + // Wait for lift to be moving again (upwards) + label(0x2c) + + beginloop(LABEL_6A) + if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x06) + goto_next(0x2c) + + label(0x06) + endloop(LABEL_6A) + + label(0x2c) + yield + yield + yield + yield + + // Wait for lift stopped at top + beginloop(LABEL_6B) + if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x2c) + endloop(LABEL_6B) + + // Go back to waiting for lift to be called from hangar + label(0x2c) + goto_first(LABEL_64) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0407_init_knifeable_skedar[] = { + add_health_or_armor(160) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_self_chrflag(CHRCFLAG_00040000) + set_ailist(CHR_SELF, AILIST_KNIFEABLE_SKEDAR) + endlist +}; + +u8 func0408_knifeable_skedar[] = { + set_shotlist(AILIST_KNIFEABLE_SKEDAR) + if_just_injured(CHR_SELF, /*goto*/ 0x0c) + label(0x08) + yield + label(0x2c) + restart_timer + set_target_chr(CHR_CASS) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_CASS_AT_PAD, TRUE, /*goto*/ 0x06) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + set_target_chr(CHR_CASS) + if_just_injured(CHR_SELF, /*goto*/ 0x0c) + endloop(0x04) + + // Cass at pad - wait 2 seconds + label(0x06) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x09) + + // Move to spot where Cass dies + label(0x2c) + set_target_chr(CHR_P1P2) + jog_to_pad(PAD_LEE_00DD) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_stopped(/*goto*/ 0x06) + if_target_in_sight(/*goto*/ 0x0c) + if_just_injured(CHR_SELF, /*goto*/ 0x0c) + endloop(0x0a) + + // Face away from player and wait 10 seconds + label(0x06) + restart_timer + set_target_chr(CHR_CASS) + try_face_entity(ATTACKFLAG_AIMATPAD, 0x00ef, /*goto*/ 0x0b) + + beginloop(0x0b) + chr_toggle_p1p2(CHR_SELF) + if_timer_gt(600, /*goto*/ 0x06) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x0c) + if_just_injured(CHR_SELF, /*goto*/ 0x0c) + set_target_chr(CHR_CASS) + endloop(0x0b) + + // Go to holding cell + label(0x06) + set_view_distance(100) + jog_to_pad(PAD_LEE_00D9) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_just_injured(CHR_SELF, /*goto*/ 0x0c) + if_chr_stopped(/*goto*/ 0x0d) + label(0x06) + if_target_in_sight(/*goto*/ 0x0c) + label(0x2c) + endloop(0x0a) + + // Saw player or got injured + label(0x0c) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + // Arrived at cell - wait 20 seconds + label(0x0d) + restart_timer + + beginloop(0x0e) + if_timer_gt(1200, /*goto*/ 0x2c) + endloop(0x0e) + + // Go back to Cass spot + label(0x2c) + jog_to_pad(PAD_LEE_00DD) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x2c) + endloop(0x0f) + + // Become idle + label(0x2c) + stop_chr + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Door is the second door. The one to the main room. + */ +u8 func1009_keep_door_open_in_intro[] = { + beginloop(LABEL_C2) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x06) + if_door_state(0x17, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x2c) + reloop(LABEL_C2) + + // Door closed + label(0x2c) + open_door(0x17) + endloop(LABEL_C2) + + // Intro finished + label(0x06) + yield + yield + + beginloop(0x04) + if_door_state(0x17, DOORSTATE_CLOSING, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_chr_flag_bankx(CHR_KNIFEABLE_SKEDAR, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_path(pathid) \ + set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) \ + set_reaction_speed(75) \ + set_chr_maxdamage(CHR_SELF, 10) \ + add_health_or_armor(190) \ + set_recovery_speed(0) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) + +u8 func0401_start_path00[] = { + init_path(0) + endlist +}; + +u8 func0402_start_path01[] = { + init_path(1) + endlist +}; + +u8 func0403_start_path02[] = { + init_path(2) + endlist +}; + +u8 func0404_start_path03[] = { + init_path(3) + endlist +}; + +u8 func0405_start_path04[] = { + init_path(4) + endlist +}; + +u8 func0406_start_path05[] = { + init_path(5) + endlist +}; + +u8 func0412_hangarspawner[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + set_morale(0) + + beginloop(LABEL_C2) + if_stage_flag_eq(STAGEFLAG_HANGAR_ALARM_ACTIVATED, TRUE, /*goto*/ 0x04) + endloop(LABEL_C2) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_HANGAR_KILLS_DONE, FALSE, /*goto*/ 0x2c) + yield + yield + yield + yield + yield + goto_next(0x08) + + // Still killing + label(0x2c) + if_never_been_onscreen(/*goto*/ 0x4d) + if_can_see_target(/*goto*/ 0x08) + reloop(0x04) + + // Seen player, or kills done + label(0x08) + unset_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, AILIST_HANGARCLONE) + + // chrflag3_00000008 was unset + label(0x4d) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4d) + reloop(0x04) + + // Clone dead + label(0x4d) + try_spawn_clone2(CHR_SELF, AILIST_INIT_HANGARCLONE, 0, /*goto*/ 0x2c) + set_ailist(CHR_SELF, AILIST_HANGARCLONE) + label(0x2c) + add_morale(1) + yield + endloop(0x04) + + endlist +}; + +u8 func0413_init_hangarclone[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x07, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_HANGARCLONE) + endlist +}; + +u8 func0414_hangarclone[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) + run_to_pad(PAD_LEE_00B4) + set_returnlist(CHR_SELF, AILIST_HANGARCLONE) + + beginloop(0x03) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2c) + endloop(0x03) + + label(0x2c) + set_shotlist(AILIST_HANGARCLONE) + set_returnlist(CHR_SELF, AILIST_HANGARCLONE) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func0419_hangar_maian[] = { + set_shotlist(AILIST_HANGAR_MAIAN) + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + + // @bug: Shoddy programming here. The jump to label 0x06 is likely supposed + // to go to the label 0x06 just prior to "AT PAD", but that is not the next + // label from here. Also, GOPOSFLAG_RUN will always be used because GOPOSFLAG_JOG + // lacks a goto_next 0x04. + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) + + // Distance to pad >= 200 + label(0x03) + restart_timer + if_chr_distance_to_pad_gt(CHR_SELF, 500, PAD_PRESET, /*goto*/ 0x06) + go_to_target_pad(GOPOSFLAG_JOG) + + // Intended: Distance to pad > 500 + // Actual: Always executes + label(0x06) + go_to_target_pad(GOPOSFLAG_RUN) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + goto_first(0x03) + + // Distance to pad < 200 + label(0x06) + stop_chr + + // Wait at pad for enemy + beginloop(0x09) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + // Enemy detected + label(0x08) + set_returnlist(CHR_SELF, AILIST_HANGAR_MAIAN) + set_shotlist(AILIST_HANGAR_MAIAN) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // Everything below here is unreachable + label(LABEL_B5) + jog_to_pad(PAD_LEE_0034) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x2c) + endloop(0x0f) + + label(0x2c) + restart_timer + chr_do_animation(ANIM_SNEEZE, 0, 193, 0, 16, CHR_SELF, 2) + + beginloop(0x10) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x10) + + label(0x06) + show_hudmsg(CHR_BOND, L_LEE_013) // "Navigational information has been retrieved." + set_stage_flag(STAGEFLAG_NAVIGATION_ROOM_DONE) + goto_first(0x03) + + endlist +}; + +u8 func0418_init_hangar_maian[] = { + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_HANGAR_MAIANS, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unset_self_chrflag(CHRCFLAG_HIDDEN) + add_health_or_armor(200) + set_reaction_speed(100) + set_ailist(CHR_SELF, AILIST_HANGAR_MAIAN) + endlist +}; + +u8 func100a_check_hangar_kills_done[] = { + yield + beginloop(LABEL_C2) + if_stage_flag_eq(STAGEFLAG_MET_ELVIS, TRUE, /*goto*/ 0x2c) + endloop(LABEL_C2) + + label(0x2c) + restart_timer + + // Wait 2 minutes, or: + // A = 6 kills + // SA = 8 kills + // PA = 10 kills + beginloop(0x04) + if_timer_gt(7200, /*goto*/ 0x2c) + if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_65) + if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_66) + + // PA + if_kill_count_gt(9, /*goto*/ 0x2c) + reloop(0x04) + + // A + label(LABEL_65) + if_kill_count_gt(5, /*goto*/ 0x2c) + reloop(0x04) + + // SA + label(LABEL_66) + if_kill_count_gt(7, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + set_stage_flag(STAGEFLAG_HANGAR_KILLS_DONE) + set_ailist(CHR_ELVIS, AILIST_ELVIS_GO_TO_HANGAR_LIFT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_msg_getshieldsdown[] = { + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + restart_timer + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_CASS_SCREAMING, TRUE, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + restart_timer + + beginloop(LABEL_C2) + if_timer_gt(120, /*goto*/ 0x06) + endloop(LABEL_C2) + + label(0x06) + speak(CHR_BOND, L_LEE_016, SFX_81A0, CHANNEL_6, COLOR_04_ORANGE) // "Outside, Joanna. Get the shields down and we can h..." + set_stage_flag(STAGEFLAG_SAID_GETSHIELDSDOWN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_engineroom[] = { + set_lights_state(0x0067, LIGHTOP_4, 0x46, 0xff, 0xfa) + + // Wait until both engines destroyed + beginloop(0x04) + if_object_in_good_condition(OBJ_ENGINE1, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_ENGINE2, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + endloop(0x04) + + label(0x06) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) + set_ailist(CHR_ELVIS, AILIST_ELVIS_RUN_FROM_ENGINEROOM) + play_x_track(XREASON_DEFAULT, 10, 10) + speak(CHR_BOND, L_LEE_046, MP3_03D7, CHANNEL_6, COLOR_04_ORANGE) // "We have to get out of here!" + label(0x2c) + set_countdown_timer(10) + show_countdown_timer + start_countdown_timer + + beginloop(LABEL_65) + if_countdown_timer_lt(1, /*goto*/ 0x2c) + endloop(LABEL_65) + + // Timer expired + label(0x2c) + unset_object_flag(0x1b, OBJFLAG_INVINCIBLE) + unset_object_flag(0x1c, OBJFLAG_INVINCIBLE) + unset_object_flag(0x1d, OBJFLAG_INVINCIBLE) + unset_object_flag(0x1e, OBJFLAG_INVINCIBLE) + unset_object_flag(0x1f, OBJFLAG_INVINCIBLE) + unset_object_flag(0x20, OBJFLAG_INVINCIBLE) + set_object_flag2(0x1b, OBJFLAG2_80000000) + set_object_flag2(0x1c, OBJFLAG2_80000000) + set_object_flag2(0x1d, OBJFLAG2_80000000) + set_object_flag2(0x1e, OBJFLAG2_80000000) + set_object_flag2(0x1f, OBJFLAG2_80000000) + set_object_flag2(0x20, OBJFLAG2_80000000) + label(0x06) + hide_countdown_timer + unset_object_flag(0x21, OBJFLAG_INVINCIBLE) + destroy_object(0x21) + destroy_object(0x1b) + destroy_object(0x1c) + destroy_object(0x1d) + destroy_object(0x1e) + destroy_object(0x1f) + destroy_object(0x20) + show_hudmsg(CHR_BOND, L_LEE_023) // "Engines have been disabled." + set_stage_flag(STAGEFLAG_ENGINES_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This is the lift BEFORE the bridge lift. + * + * The lift moves automatically until you ride it up, then it stays at the top + * unless called from below. + */ +u8 func100d_prebridgelift[] = { + // Wait until Y >= 2600 + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 2600, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x0a) + + label(0x2c) + endloop(0x09) + + // Wait until lift stopped at top + beginloop(0x0a) + if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x2c) + endloop(0x0a) + + // Deactivate lift + label(0x2c) + label(LABEL_64) + set_object_flag(OBJ_PREBRIDGELIFT, OBJFLAG_DEACTIVATED) + unset_object_flag(0x3d, OBJFLAG_CANNOT_ACTIVATE) + unset_object_flag(0x3e, OBJFLAG_CANNOT_ACTIVATE) + + // Wait until lift called at bottom by buddy or counterop + beginloop(LABEL_68) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x2c) + if_chr_activated_object(CHR_ANTI, 0x3d, /*goto*/ 0x2c) + if_chr_activated_object(CHR_ANTI, 0x3e, /*goto*/ 0x2c) + endloop(LABEL_68) + + // Activate lift + label(0x2c) + play_sound(SFX_81A6, -1) + unset_object_flag(OBJ_PREBRIDGELIFT, OBJFLAG_DEACTIVATED) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + + // Wait until stopped at bottom + beginloop(LABEL_69) + if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x2c) + endloop(LABEL_69) + + label(0x2c) + + // Wait until moving (upwards) + beginloop(LABEL_6A) + if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x06) + goto_next(0x2c) + + label(0x06) + endloop(LABEL_6A) + + label(0x2c) + yield + yield + yield + yield + + // Wait until stopped at top + beginloop(LABEL_6B) + if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x2c) + endloop(LABEL_6B) + + label(0x2c) + goto_first(LABEL_64) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_bridgelift[] = { + // Wait until Y >= 3600 + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 3600, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x0a) + + label(0x2c) + endloop(0x09) + + // Wait until lift stopped at top + beginloop(0x0a) + if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x2c) + endloop(0x0a) + + label(0x2c) + set_stage_flag(STAGEFLAG_ENTERED_BRIDGE) + + // Deactive lift + label(LABEL_64) + set_object_flag(OBJ_BRIDGELIFT, OBJFLAG_DEACTIVATED) + unset_object_flag(0x2f, OBJFLAG_CANNOT_ACTIVATE) + unset_object_flag(0x30, OBJFLAG_CANNOT_ACTIVATE) + + // Wait until lift called from below by buddy or counterop + beginloop(LABEL_68) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x2f, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x30, /*goto*/ 0x2c) + if_chr_activated_object(CHR_ANTI, 0x2f, /*goto*/ 0x2c) + if_chr_activated_object(CHR_ANTI, 0x30, /*goto*/ 0x2c) + endloop(LABEL_68) + + // Activate lift + label(0x2c) + play_sound(SFX_81A6, -1) + unset_object_flag(OBJ_BRIDGELIFT, OBJFLAG_DEACTIVATED) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + + // Wait until lift stopped + beginloop(LABEL_69) + if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x2c) + endloop(LABEL_69) + + label(0x2c) + + // Wait until lift moving again (upwards) + beginloop(LABEL_6A) + if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x06) + goto_next(0x2c) + + label(0x06) + endloop(LABEL_6A) + + label(0x2c) + yield + yield + yield + yield + + // Wait until lift stopped at top + beginloop(LABEL_6B) + if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x2c) + endloop(LABEL_6B) + + label(0x2c) + goto_first(LABEL_64) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to the two Skedar behind the bridge doors who must be killed to end + * the level. + */ +u8 func0415_bridgespawner[] = { + set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(190) + set_recovery_speed(0) + set_shield(0) + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_cloaked(CHR_SELF, TRUE, FALSE) + set_self_chrflag(CHRCFLAG_00040000) + set_morale(0) + + beginloop(LABEL_C2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE_SPAWNING, TRUE, /*goto*/ 0x04) + endloop(LABEL_C2) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_BRIDGE_DOORS_UNLOCKED, TRUE, /*goto*/ 0x06) + if_morale_lt(2, /*goto*/ 0x2c) + + // Doors are unlocked (have been spawning for over a minute) + label(0x06) + restart_timer + + beginloop(LABEL_65) + if_timer_gt(60, /*goto*/ 0x06) + endloop(LABEL_65) + + label(0x06) + goto_next(0x08) + + // morale is 0 or 1 + label(0x2c) + if_never_been_onscreen(/*goto*/ 0x4d) + if_chr_deadish(CHR_CLONE, /*goto*/ 0x2c) + label(0x2c) + if_can_see_target(/*goto*/ 0x08) + endloop(0x04) + + // Been spawning for 61 seconds, or Skedar can see player + // Unhide and uncloak + label(0x08) + unset_self_chrflag(CHRCFLAG_HIDDEN) + yield + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, AILIST_INIT_BRIDGESPAWNER_REVEAL) + + // chrflag3_00000008 was unset + // 1 in 256 chance of spawning on any given frame (or script invocation?) + // or after 5 seconds just spawn one anyway. + label(0x4d) + restart_timer + + beginloop(0x10) + call_rng + if_timer_gt(300, /*goto*/ 0x2c) + if_rand_lt(1, /*goto*/ 0x2c) + endloop(0x10) + + // Check clone is dead + label(0x2c) + if_chr_deadish(CHR_CLONE, /*goto*/ 0x4d) + goto_first(0x04) + + // Spawn + label(0x4d) + try_spawn_clone2(CHR_SELF, AILIST_INIT_BRIDGECLONE, 0, /*goto*/ 0x2c) + unset_self_chrflag(CHRCFLAG_HIDDEN) + yield + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, AILIST_INIT_BRIDGESPAWNER_REVEAL) + + label(0x2c) + add_morale(1) + yield + goto_first(0x04) + + endlist +}; + +u8 func0416_init_bridgeclone[] = { + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(190) + set_recovery_speed(0) + set_shield(0) + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + label(0x04) + rebuild_teams + rebuild_squadrons + + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2c) + try_inherit_properties(CHR_BRIDGESPAWNER1, /*goto*/ 0x06) + + label(0x06) + goto_next(0x06) + + label(0x2c) + try_inherit_properties(CHR_BRIDGESPAWNER2, /*goto*/ 0x06) + + label(0x06) + add_health_or_armor(40) + set_ailist(CHR_SELF, AILIST_BRIDGECLONE) + endlist +}; + +/** + * Assigned to the two bridge spawners when they stop sending clones and reveal + * themselves. Kill count isn't actually used to check if they're dead, so this + * function isn't necessary. + */ +u8 func0417_init_spawner_reveal[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) + set_ailist(CHR_SELF, AILIST_BRIDGECLONE) + endlist +}; + +u8 func041a_bridgeclone[] = { + set_shotlist(AILIST_BRIDGECLONE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Dying + label(0x2c) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00020000) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2c) + set_target_chr(CHR_ELVIS) + goto_next(LABEL_C2) + + label(0x2c) + call_rng + if_rand_gt(128, /*goto*/ 0x2c) + set_target_chr(CHR_COOP) + if_chr_dead(CHR_COOP, /*goto*/ 0x2c) + goto_next(LABEL_C2) + + label(0x2c) + set_target_chr(CHR_BOND) + label(0x03) + + beginloop(LABEL_C2) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_enemy_distance_lt_and_los(1000, /*goto*/ 0x06) + endloop(LABEL_C2) + + // Has target - walk towards for 2 seconds + label(0x06) + if_distance_to_target_lt(150, /*goto*/ 0x2e) + label(LABEL_C5) + restart_timer + try_walk_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_timer_gt(120, /*goto*/ 0x09) + endloop(0x08) + + label(0x09) + restart_timer + try_run_to_target(/*goto*/ 0x0a) + + // Start running + beginloop(0x0a) + if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_target_moving_away(/*goto*/ 0x2c) + if_distance_to_target_lt(150, /*goto*/ 0x2e) + label(0x2c) + if_distance_to_target_lt(50, /*goto*/ 0x2e) + if_timer_gt(14, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + goto_first(0x09) + + // Close to target - face them + label(0x2e) + restart_timer + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 1, /*goto*/ 0x0b) + + beginloop(0x0b) + if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + if_timer_gt(15, /*goto*/ 0x06) + endloop(0x0b) + + // Attempt punch or kick + label(0x06) + try_punch_or_kick(/*goto*/ 0x2f) + goto_first(0x03) + + beginloop(0x2f) + if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x2f) + + // Attack finished + label(0x06) + goto_first(0x03) + + // Target chr dying + label(0x10) + stop_chr + + beginloop(0x0f) + if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) + endloop(0x0f) + + label(0x06) + goto_first(LABEL_C2) + + label(LABEL_B8) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_bridge_entry[] = { + // Wait until 3 bridge Skedar dead + beginloop(0x09) + if_chr_deadish(CHR_BRIDGE1, /*goto*/ 0x2c) + reloop(0x09) + + label(0x2c) + if_chr_deadish(CHR_BRIDGE2, /*goto*/ 0x2c) + reloop(0x09) + + label(0x2c) + if_chr_deadish(CHR_BRIDGE3, /*goto*/ 0x2c) + endloop(0x09) + + label(0x2c) + label(0x2c) + label(0x06) + restart_timer + + // Wait 11.66 seconds + beginloop(0x0a) + if_timer_gt(700, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_stage_flag(STAGEFLAG_ELVIS_COMING_TO_BRIDGE) + set_ailist(CHR_ELVIS, GAILIST_STOP_AND_IDLE) + yield + if_chr_y(CHR_ELVIS, 3500, OPERATOR_LESS_THAN, /*goto*/ LABEL_65) + goto_next(0x2c) + + // Elvis is somewhere below - warp him up + beginloop(LABEL_65) + chr_move_to_pad(CHR_ELVIS, PAD_LEE_00A7, 0x01, /*goto*/ 0x2c) + endloop(LABEL_65) + + label(0x2c) + set_ailist(CHR_ELVIS, AILIST_ELVIS_AT_BRIDGE) + restart_timer + + // Wait another 11.66 seconds + beginloop(0x08) + if_timer_gt(700, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_BRIDGE_SPAWNING) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_check_bridge_captured[] = { + beginloop(LABEL_C2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE_SPAWNING, TRUE, /*goto*/ 0x2c) + endloop(LABEL_C2) + + // Wait for 2 spawner skedar to be killed. If 60 seconds have passed, + // unlock the bridge doors in case they've gotten stuck or became unalert + // or something. + label(0x2c) + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_BRIDGE_DOORS_UNLOCKED, TRUE, /*goto*/ 0x2c) + if_timer_gt(3600, /*goto*/ 0x0d) + label(0x2c) + if_chr_deadish(CHR_BRIDGESPAWNER1, /*goto*/ 0x2c) + reloop(0x09) + + label(0x2c) + if_chr_deadish(CHR_BRIDGESPAWNER2, /*goto*/ 0x2c) + endloop(0x09) + + // 60 seconds elapsed + label(0x0d) + set_stage_flag(STAGEFLAG_BRIDGE_DOORS_UNLOCKED) + unlock_door(0x46, 0x40) + unlock_door(0x47, 0x40) + unlock_door(0x48, 0x40) + unlock_door(0x49, 0x40) + goto_first(0x09) + + label(0x2c) + show_hudmsg(CHR_BOND, L_LEE_025) // "Bridge has been captured." + set_stage_flag(STAGEFLAG_BRIDGE_CAPTURED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_check_end_level[] = { + beginloop(0x09) + if_all_objectives_complete(/*goto*/ 0x06) + endloop(0x09) + + label(0x06) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) + goto_next(0x06) + + // Both players dead + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Either buddy is alive + label(0x06) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) + + // Mission complete + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + + // Elvis dead + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_ATTACKSHIP_INTRO) + camera_movement(ANIM_CUT_LEE_INTRO_CAM) + cmd0175(60) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LEE_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LEE_INTRO_CASS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 4) + + set_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_INTRO_SKEDAR, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LEE_INTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_SKEDAR, 4) + + restart_timer + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ LABEL_B0) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(60, LABEL_9A) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(120, LABEL_AC) + play_sound(MP3_075A, CHANNEL_10) + + wait_until(136, LABEL_9B) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(186, LABEL_9C) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(226, LABEL_9D) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(320, LABEL_9E) + speak(CHR_BOND, L_LEE_032, MP3_047F, CHANNEL_10, COLOR_09_BLUE) // "Oohhh... I'd better not be where I think I am." + + wait_until(505, LABEL_9F) + play_sound(SFX_0427, CHANNEL_10) + + wait_until(600, LABEL_A0) + speak(CHR_BOND, L_LEE_033, MP3_0480, CHANNEL_10, COLOR_04_ORANGE) // "And it's worse than that, my dear. Just look who y..." + + wait_until(1000, LABEL_A1) + speak(CHR_BOND, L_LEE_034, MP3_0481, CHANNEL_10, COLOR_09_BLUE) // "You! I thought you'd managed to escape. We found n..." + + wait_until(1018, LABEL_A2) + play_sound(SFX_0175, CHANNEL_10) + + wait_until(1142, LABEL_A3) + play_sound(SFX_0176, CHANNEL_10) + + wait_until(1168, LABEL_A4) + play_sound(SFX_0177, CHANNEL_10) + + wait_until(1210, LABEL_A5) + play_sound(SFX_0178, CHANNEL_10) + + wait_until(1260, LABEL_A6) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(1298, LABEL_A7) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(1358, LABEL_65) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(1396, LABEL_66) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(1400, LABEL_A8) + speak(CHR_BOND, L_LEE_035, MP3_0482, CHANNEL_10, COLOR_04_ORANGE) // "You couldn't find me. But there was no hiding from..." + + wait_until(1520, LABEL_67) + play_sound(SFX_0176, CHANNEL_10) + + wait_until(1592, LABEL_68) + play_sound(SFX_0177, CHANNEL_10) + + wait_until(1600, LABEL_69) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(1656, LABEL_6A) + play_sound(SFX_0175, CHANNEL_10) + + wait_until(1728, LABEL_6B) + play_sound(SFX_0178, CHANNEL_10) + + wait_until(1734, LABEL_6C) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(1770, LABEL_6E) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(1810, LABEL_61) + open_door(0x17) + play_sound(SFX_DOOR_801E, CHANNEL_10) + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until(1870, LABEL_6F) + speak(CHR_BOND, L_LEE_036, MP3_0483, CHANNEL_10, COLOR_04_ORANGE) // "This is it. Wait there! I'll make a distraction; i..." + + wait_until(1874, LABEL_70) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(1930, LABEL_71) + play_sound(SFX_0175, CHANNEL_10) + + wait_until(1986, LABEL_72) + play_sound(SFX_05A2, CHANNEL_10) + + wait_until(2040, LABEL_73) + play_sound(SFX_05A3, CHANNEL_10) + + wait_until(2108, LABEL_74) + play_sound(SFX_05A2, CHANNEL_10) + + wait_until(2168, LABEL_75) + play_sound(SFX_05A3, CHANNEL_10) + + wait_until(2226, LABEL_76) + play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) + + wait_until(2232, LABEL_77) + play_sound(SFX_05A2, CHANNEL_10) + + wait_until(2300, LABEL_62) + close_door(0x17) + + wait_until(2346, LABEL_78) + + wait_until(2424, LABEL_79) + play_sound(SFX_05A3, CHANNEL_10) + + wait_until(2468, LABEL_7A) + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until(2474, LABEL_7B) + play_sound(SFX_05A2, CHANNEL_10) + + wait_until(2560, LABEL_7C) + play_sound(SFX_0176, CHANNEL_10) + + wait_until(2580, LABEL_7D) + play_sound(SFX_0177, CHANNEL_10) + + wait_until(2581, LABEL_7E) + speak(CHR_BOND, L_LEE_037, MP3_0484, CHANNEL_10, COLOR_09_BLUE) // "Why are you doing this, Cassandra?" + + wait_until(2614, LABEL_7F) + play_sound(SFX_0171, CHANNEL_10) + + wait_until(2648, LABEL_80) + play_sound(SFX_0178, CHANNEL_10) + + wait_until(2670, LABEL_81) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(2708, LABEL_82) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(2736, LABEL_83) + play_sound(SFX_0174, CHANNEL_10) + + wait_until(2780, LABEL_84) + play_sound(SFX_0175, CHANNEL_10) + + wait_until(2790, LABEL_85) + speak(CHR_BOND, L_LEE_038, MP3_0485, CHANNEL_10, COLOR_04_ORANGE) // "The Skedar used me, Joanna. You are my best chance..." + + wait_until(2792, LABEL_86) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(2834, LABEL_87) + play_sound(SFX_0176, CHANNEL_10) + + wait_until(3016, LABEL_88) + play_sound(SFX_01DC, CHANNEL_10) + + wait_until(3068, LABEL_89) + play_sound(SFX_043A, CHANNEL_10) + play_sound(SFX_043D, CHANNEL_10) + + wait_until(3186, LABEL_63) + open_door(0x24) + + wait_until(3238, LABEL_8A) + play_sound(SFX_0177, CHANNEL_10) + + wait_until(3258, LABEL_8B) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(3280, LABEL_8C) + play_sound(SFX_0173, CHANNEL_10) + close_door(0x24) + + wait_until(3313, LABEL_8D) + play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) + speak(CHR_BOND, L_LEE_039, MP3_0486, CHANNEL_10, COLOR_04_ORANGE) // "Eeeeaaarrrrggghhh!!!" + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(LABEL_B0) + + label(0x2c) + if_controller_button_pressed(/*goto*/ LABEL_B0) + label(0x2c) + endloop(0x08) + + label(LABEL_B0) + label(0x06) + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + open_door(0x17) + mute_channel(CHANNEL_10) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LEE_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) + set_chr_chrflag(CHR_CASS, CHRCFLAG_00000001) + chr_do_animation(ANIM_CUT_LEE_INTRO_CASS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 2) + + unset_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_INTRO_SKEDAR, CHRHFLAG_00020000) + set_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_00000001) + chr_do_animation(ANIM_CUT_LEE_INTRO_SKEDAR, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_SKEDAR, 2) + + remove_chr(CHR_INTRO_SKEDAR) + set_ailist(CHR_SHY_SKEDAR, AILIST_SHY_SKEDAR_WAIT) + enter_firstperson + yield + chr_move_to_pad(CHR_CASS, PAD_LEE_00DF, 0x01, /*goto*/ 0x2c) + label(0x2c) + set_ailist(CHR_CASS, AILIST_CASS) + stop_cutscene_track + stop_ambient_track + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c01_outro[] = { + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2c) + set_target_chr(CHR_BOND) + goto_next(0x06) + + label(0x2c) + set_target_chr(CHR_COOP) + label(0x06) + disable_object(0x2c) + camera_movement(ANIM_CUT_LEE_OUTRO_CAM) + play_cutscene_track(MUSIC_ATTACKSHIP_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + + set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LEE_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) + + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LEE_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + + enable_object(OBJ_OUTRO_SHUTTLE) + set_object_flag2(OBJ_OUTRO_SHUTTLE, OBJFLAG2_04000000) + set_object_flag3(OBJ_OUTRO_SHUTTLE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_LEE_OUTRO_SKSHUTTLE, OBJ_OUTRO_SHUTTLE, 0x04, 0xffff) + object_set_modelpart_visible(OBJ_OUTRO_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + + show_nonessential_chrs(FALSE) + restart_timer + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + + wait_until(38, LABEL_65) + play_sound(SFX_00F9, CHANNEL_10) + + wait_until(140, LABEL_66) + play_sound(SFX_00FD, CHANNEL_10) + + wait_until(150, LABEL_A9) + speak(CHR_BOND, L_LEE_040, MP3_0487, CHANNEL_10, COLOR_09_BLUE) // "Wow. That's the first time I've seen another plane..." + + wait_until(368, LABEL_67) + play_sound(SFX_00FA, CHANNEL_10) + play_sound(SFX_00FB, CHANNEL_10) + + wait_until(540, LABEL_69) + play_sound(SFX_00FE, CHANNEL_10) + + wait_until(550, LABEL_6B) + play_sound(SFX_00FC, CHANNEL_10) + + wait_until(580, LABEL_6C) + play_sound(SFX_00F9, CHANNEL_10) + play_sound(SFX_00FB, CHANNEL_10) + + wait_until(690, LABEL_6E) + speak(CHR_BOND, L_LEE_041, MP3_0488, CHANNEL_10, COLOR_04_ORANGE) // "Hmmmm?" + + wait_until(850, LABEL_6F) + speak(CHR_BOND, L_LEE_042, MP3_0489, CHANNEL_10, COLOR_04_ORANGE) // "I don't... I don't believe it!" + + wait_until(963, LABEL_70) + play_sound(SFX_FOOTSTEP_80D4, CHANNEL_10) + + wait_until(972, LABEL_71) + play_sound(SFX_FOOTSTEP_80D8, CHANNEL_10) + + wait_until(988, LABEL_61) + play_sound(SFX_FOOTSTEP_80DB, CHANNEL_10) + + wait_until(1000, LABEL_72) + speak(CHR_BOND, L_LEE_043, MP3_048A, CHANNEL_10, COLOR_09_BLUE) // "Elvis? What is it?" + + wait_until(1030, LABEL_73) + play_sound(SFX_FOOTSTEP_80DA, CHANNEL_10) + + wait_until(1045, LABEL_74) + play_sound(SFX_FOOTSTEP_80D8, CHANNEL_10) + + wait_until(1065, LABEL_75) + play_sound(SFX_FOOTSTEP_80D9, CHANNEL_10) + + wait_until(1085, LABEL_76) + play_sound(SFX_FOOTSTEP_80DA, CHANNEL_10) + + wait_until(1200, LABEL_77) + speak(CHR_BOND, L_LEE_044, MP3_048B, CHANNEL_10, COLOR_09_BLUE) // "Where are you going?" + + wait_until(1237, LABEL_78) + play_sound(SFX_FOOTSTEP_80DB, CHANNEL_10) + + wait_until(1260, LABEL_79) + play_sound(SFX_FOOTSTEP_80D8, CHANNEL_10) + + wait_until(1280, LABEL_7A) + play_sound(SFX_FOOTSTEP_80D9, CHANNEL_10) + + wait_until(1300, LABEL_7B) + play_sound(SFX_FOOTSTEP_80DA, CHANNEL_10) + + wait_until(1301, LABEL_62) + speak(CHR_BOND, L_LEE_045, MP3_048C, CHANNEL_10, COLOR_04_ORANGE) // "We have to get down to the surface! Follow me!" + open_door(OBJ_HANGARDOOR1) + open_door(OBJ_HANGARDOOR2) + open_door(OBJ_HANGARDOOR3) + open_door(OBJ_HANGARDOOR4) + set_object_flag(OBJ_HANGARDOOR1, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_HANGARDOOR2, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_HANGARDOOR3, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(OBJ_HANGARDOOR4, OBJFLAG_DOOR_KEEPOPEN) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(LABEL_B0) + + label(0x2c) + if_controller_button_pressed(/*goto*/ LABEL_B0) + label(0x2c) + endloop(0x08) + + label(LABEL_B0) + mute_channel(CHANNEL_10) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_skedar(function) \ + set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) \ + set_reaction_speed(75) \ + set_chr_maxdamage(CHR_SELF, 10) \ + add_health_or_armor(190) \ + set_recovery_speed(0) \ + set_shield(0) \ + set_ailist(CHR_SELF, function) + +u8 func041e_init_bridge1and2[] = { + init_skedar(AILIST_BRIDGE_SKEDAR) + endlist +}; + +u8 func0425_init_shy_skedar[] = { + init_skedar(GAILIST_IDLE) + endlist +}; + +u8 func0420_init_bridge3[] = { + init_skedar(AILIST_BRIDGE_SKEDAR) + endlist +}; + +/** + * Assigned to the 3 Skedar on the bridge. + */ +u8 func0421_bridge_skedar[] = { + set_shotlist(AILIST_BRIDGE_SKEDAR) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x2c) + + // Dying + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x53) + if_timer_gt(15, /*goto*/ 0x06) + endloop(0x53) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x2c) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x08) + + // Injured + label(0x06) + set_view_distance(100) + + // Not injured + label(0x08) + set_self_chrflag(CHRCFLAG_00000040) + label(LABEL_C6) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + set_target_chr(CHR_BOND) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ LABEL_C7) + label(0x06) + kneel + + beginloop(LABEL_C7) + chr_toggle_p1p2(CHR_SELF) + label(0x2c) + set_target_chr(CHR_P1P2) + if_target_outside_my_yvisang(/*goto*/ 0x06) + if_target_in_sight(/*goto*/ LABEL_C8) + label(0x06) + if_saw_injury(0x00, /*goto*/ LABEL_C8) + if_near_miss(/*goto*/ LABEL_C9) + label(0x2c) + set_target_chr(CHR_P1P2) + reloop(LABEL_C7) + + label(0x06) + if_target_outside_my_yvisang(/*goto*/ 0x2c) + if_target_in_sight(/*goto*/ LABEL_C8) + label(0x2c) + set_target_chr(CHR_BOND) + endloop(LABEL_C7) + + label(LABEL_C8) + set_view_distance(100) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2c) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + label(0x2c) + goto_next(LABEL_CA) + + // Unreachable + try_attack_amount(90, 100) + + // Reachable from below + beginloop(LABEL_CB) + if_chr_stopped(/*goto*/ LABEL_CC) + endloop(LABEL_CB) + + label(LABEL_CC) + restart_timer + stop_chr + + beginloop(LABEL_B4) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(LABEL_B4) + + label(0x2c) + label(0x06) + goto_first(LABEL_C6) + + // Near miss + label(LABEL_C9) + set_view_distance(100) + restart_timer + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_CD) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + + label(LABEL_CD) + call_rng + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_outside_my_yvisang(/*goto*/ 0x06) + if_target_in_sight(/*goto*/ LABEL_CE) + label(0x06) + if_timer_gt(60, /*goto*/ LABEL_CF) + if_rand_lt(4, /*goto*/ LABEL_CF) + goto_first(LABEL_CD) + + label(LABEL_CF) + if_can_see_target(/*goto*/ LABEL_CE) + goto_first(LABEL_C6) + + label(LABEL_CE) + goto_first(LABEL_C8) + + label(LABEL_D0) + restart_timer + + beginloop(LABEL_D1) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ LABEL_CE) + if_timer_gt(300, /*goto*/ 0x06) + endloop(LABEL_D1) + + label(0x06) + goto_first(LABEL_C6) + + label(LABEL_CE) + goto_first(LABEL_C8) + + label(LABEL_CA) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ LABEL_60) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ LABEL_B1) + label(LABEL_B1) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) + goto_next(0x2c) + + label(LABEL_60) + try_attack_amount(40, 60) + label(0x06) + goto_first(LABEL_CB) + + label(0x2c) + goto_first(LABEL_CC) + + endlist +}; + +u8 func1013_msg_gottogetshieldsdown[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_SAID_GETSHIELDSDOWN, TRUE, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + restart_timer + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + speak(CHR_BOND, L_LEE_027, MP3_03DC, CHANNEL_6, COLOR_09_BLUE) // "I've got to get those shields down to let Elvis in..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_msg_hangarbaydoors[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) + restart_timer + + beginloop(0x04) + if_objective_complete(0, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + restart_timer + + beginloop(0x08) + if_timer_gt(240, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + speak(CHR_BOND, L_LEE_028, MP3_03DD, CHANNEL_6, COLOR_09_BLUE) // "Now only the hangar bay doors are in the way." + + label(0x09) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_msg_starmaps[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x003e, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + speak(CHR_P1P2, L_LEE_029, MP3_03DE, CHANNEL_6, COLOR_09_BLUE) // "This machine contains the Skedar star maps." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_msg_ifwecontrolthebridge[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x006f, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + set_stage_flag(STAGEFLAG_ENTERED_BRIDGELIFT) + unset_chr_chrflag(CHR_BRIDGE1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BRIDGE2, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_BRIDGE3, CHRCFLAG_INVINCIBLE) + speak(CHR_P1P2, L_LEE_030, MP3_03DF, CHANNEL_6, COLOR_09_BLUE) // "If we control the bridge, then the ship is ours." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0422_cass[] = { + set_shotlist(GAILIST_IDLE) + set_self_chrflag(CHRCFLAG_00040000) + run_to_pad(PAD_LEE_01DD) + + beginloop(0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 300, PAD_LEE_01DD, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + stop_chr + set_stage_flag(STAGEFLAG_CASS_AT_PAD) + + // @bug: Looks like there's a missing goto_first 0x09 here. + // With that statement, it would loop waiting for the Skedar to be ready. + // As it stands, the check is pointless and Cass will do the screams and die + // even if the Skedar is not ready. + label(0x09) + yield + if_stage_flag_eq(STAGEFLAG_SHY_SKEDAR_READY, TRUE, /*goto*/ 0x2c) + + label(0x2c) + play_sound(MP3_0486, CHANNEL_10) + set_stage_flag(STAGEFLAG_CASS_SCREAMING) + + beginloop(LABEL_C2) + damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + endloop(LABEL_C2) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0423_shy_skedar[] = { + set_shotlist(AILIST_INIT_SKEDAR) + set_self_chrflag(CHRCFLAG_00000040) + set_self_chrflag(CHRCFLAG_00040000) + set_target_chr(CHR_CASS) + goto_next(0x2c) + + if_self_flag_bankx_eq(CHRFLAG0_00008000, TRUE, BANK_0, /*goto*/ 0x03) + label(LABEL_C2) + chr_move_to_pad(CHR_SELF, PAD_LEE_00E0, 0x01, /*goto*/ 0x2c) + + // Warp failed or not available - so run + label(0x03) + set_target_chr(CHR_CASS) + restart_timer + try_run_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_LEE_00DA, /*goto*/ 0x2d) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x08) + + // Stopped, or running for 1 second + label(0x06) + set_target_chr(CHR_CASS) + goto_first(0x03) + + // Warped to pad 0x00e0 successfully - run rest of the way + label(0x2c) + run_to_pad(PAD_LEE_00DA) + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x2d) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_LEE_00DA, /*goto*/ 0x2d) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x09) + + // At pad + // The first time through this function, STAGEFLAG_SHY_SKEDAR_READY will + // be set. The second time through this function, stageflag 02000000 will + // be set. + label(0x2d) + if_stage_flag_eq(STAGEFLAG_SHY_SKEDAR_READY, TRUE, /*goto*/ 0x2c) + set_stage_flag(STAGEFLAG_SHY_SKEDAR_READY) + goto_next(0x2d) + + label(0x2c) + set_stage_flag(STAGEFLAG_02000000) + + // Set target chr based on who it can see + label(0x2d) + stop_chr + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2c) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2c) + set_target_chr(CHR_ANTI) + if_can_see_target(/*goto*/ 0x2c) + + label(0x2c) + stop_chr + set_shotlist(AILIST_INIT_SKEDAR) + set_returnlist(CHR_SELF, AILIST_INIT_SKEDAR) + set_ailist(CHR_SELF, AILIST_INIT_SKEDAR) + endlist +}; + +u8 func0423_shy_skedar_wait[] = { + set_shotlist(AILIST_SHY_SKEDAR) + set_target_chr(CHR_CASS) + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) + restart_timer + + beginloop(0x08) + if_timer_gt(180, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + set_ailist(CHR_SELF, AILIST_SHY_SKEDAR) + endlist +}; + +u8 func141b_setup_lifts[] = { + activate_lift(1, 0x25) + activate_lift(2, 0x26) + activate_lift(4, 0x28) + activate_lift(5, 0x29) + activate_lift(6, 0x2a) + activate_lift(7, 0x2b) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * In PA room where the hangar door console is. Once console is activated, or + * when hangar alarm is activated, the Skedar behind the door is alerted. + */ +u8 func1017_pa_skedar_alertness[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_HANGAR_DOORS_OPEN, TRUE, /*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_HANGAR_ALARM_ACTIVATED, TRUE, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + restart_timer + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + set_ailist(0x02, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_update_elvis_target_chr[] = { + beginloop(0x04) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x09) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x08) + goto_next(0x09) + + // Unreachable + reloop(0x04) + + // Jo dead + label(0x08) + set_chr_target_chr(CHR_ELVIS, CHR_COOP) + reloop(0x04) + + // Velvet dead or both alive + label(0x09) + set_chr_target_chr(CHR_ELVIS, CHR_BOND) + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Note Elvis is still hidden, hence why he doesn't appear until shields are + * down. + */ +u8 func1018_place_elvis_in_hangar[] = { + label(0x04) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // A and SA + beginloop(0x03) + chr_move_to_pad(CHR_ELVIS, PAD_LEE_0103, 0x01, /*goto*/ 0x2c) + endloop(0x03) + + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_hangar_shuttle[] = { + yield + enable_object(OBJ_HANGAR_SHUTTLE) + set_object_flag3(OBJ_HANGAR_SHUTTLE, OBJFLAG3_00000010) + object_set_modelpart_visible(OBJ_HANGAR_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + + label(0x09) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_BRIDGE_CAPTURED, TRUE, /*goto*/ 0x06) + if_objective_complete(4, /*goto*/ 0x06) +#if VERSION >= VERSION_NTSC_1_0 + object_do_animation(ANIM_045C, OBJ_HANGAR_SHUTTLE, 0x08, 0xffff) +#else + object_do_animation(ANIM_045C, OBJ_HANGAR_SHUTTLE, 0x01, 0xffff) +#endif + endloop(0x08) + + label(0x2c) + goto_first(0x09) + + label(0x06) + disable_object(OBJ_HANGAR_SHUTTLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_kill_maian[] = { + yield + damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_lift_door_sounds[] = { + beginloop(LABEL_C2) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x2f, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x30, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x31, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x32, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x33, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x34, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x35, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x36, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x37, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x38, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x39, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x3a, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x2c) + endloop(LABEL_C2) + + label(0x2c) + play_sound(SFX_81A6, -1) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + goto_first(LABEL_C2) + + endlist +}; + +u8 func101d_unlock_doors[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + + // PA - unlock door to console on other side of hangar + unlock_door(0x35, 0x80) + unlock_door(0x36, 0x80) + + // SA and PA - unlock door to engine room + label(0x06) + unlock_door(0x3f, 0x80) + unlock_door(0x40, 0x80) + + // All difficulties + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_bridge_music[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_BOND, 0x00, 0x006e, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + play_x_track(XREASON_DEFAULT, 10, 60) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_elvis_run_from_engineroom[] = { + set_shotlist(AILIST_ELVIS_RUN_FROM_ENGINEROOM) + run_to_pad(PAD_LEE_005C) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x2c) + if_stage_flag_eq(STAGEFLAG_ENGINES_DESTROYED, TRUE, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) + endlist +}; + +u8 func101f_enable_bridge_skedar[] = { + lock_door(0x41, 0x80) + lock_door(0x42, 0x80) + set_object_flag2(0x41, OBJFLAG2_LOCKEDBACK) + set_object_flag2(0x42, OBJFLAG2_LOCKEDFRONT) + set_object_flag2(0x41, OBJFLAG2_AICANNOTUSE) + set_object_flag2(0x42, OBJFLAG2_AICANNOTUSE) + + // Wait until first 4 objectives complete + beginloop(0x04) + if_objective_complete(0, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) + if_objective_complete(1, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_objective_complete(2, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) + if_objective_complete(3, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + unlock_door(0x41, 0x80) + unlock_door(0x42, 0x80) + unset_object_flag2(0x41, OBJFLAG2_LOCKEDBACK) + unset_object_flag2(0x42, OBJFLAG2_LOCKEDFRONT) + unset_object_flag2(0x41, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x42, OBJFLAG2_AICANNOTUSE) + enable_chr(0x21) + enable_chr(0x22) + enable_chr(CHR_BRIDGE1) + enable_chr(CHR_BRIDGE2) + enable_chr(CHR_BRIDGE3) + enable_chr(CHR_BRIDGESPAWNER1) + enable_chr(CHR_BRIDGESPAWNER2) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_engine_hum_noise[] = { + yield + assign_sound(SFX_81A5, CHANNEL_0) + play_sound_from_object(CHANNEL_0, 0x1b, 1, 2000, 4000) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1021_check_ammo_wasted[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x0d) + chr_toggle_p1p2(CHR_SELF) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_MAULER, /*goto*/ LABEL_65) + endloop(0x04) + + // Mauler equipped + beginloop(LABEL_65) + if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x0d) + if_ammo_quantity_lt(CHR_P1P2, AMMOTYPE_PISTOL, 1, /*goto*/ 0x2c) + endloop(LABEL_65) + + // Ammo wasted + label(0x2c) + set_stage_flag(STAGEFLAG_AMMO_WASTED) + show_hudmsg(CHR_BOND, L_LEE_049) // "Ammo depleted - consoles can't be destroyed." + + beginloop(LABEL_66) + if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x2c) + endloop(LABEL_66) + + label(0x2c) + unset_stage_flag(STAGEFLAG_AMMO_WASTED) + + // Shields disabled + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_setup_rtracker[] = { + // @bug: The Slayer is not R-tracked + yield + set_object_flag3(OBJ_MAULER1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_MAULER2, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040b_init_cass[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1024_set_bridge_skedar_invincible[] = { + set_chr_chrflag(CHR_BRIDGE1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BRIDGE2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BRIDGE3, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_BRIDGE1, CHRCFLAG_UNEXPLODABLE) + set_chr_chrflag(CHR_BRIDGE2, CHRCFLAG_UNEXPLODABLE) + set_chr_chrflag(CHR_BRIDGE3, CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Wait 10 seconds then set a flag on Joanna which enables buddy to warp to her. + */ +u8 unregistered_function1[] = { + restart_timer + + beginloop(0x04) + if_timer_gt(600, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1423_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1025_toggle_chrs[] = { + yield + disable_chr(0x0b) + disable_chr(0x0c) + disable_chr(CHR_SUSPENDEDANIM1) + disable_chr(CHR_SUSPENDEDANIM2) + disable_chr(CHR_SUSPENDEDANIM3) + disable_chr(CHR_SUSPENDEDANIM4) + disable_chr(0x11) + disable_chr(0x12) + disable_chr(0x13) + disable_chr(0x14) + disable_chr(0x15) + disable_chr(0x16) + disable_chr(0x17) + disable_chr(0x18) + disable_chr(0x19) + disable_chr(0x1a) + disable_chr(0x1b) + disable_chr(0x1c) + disable_chr(0x1d) + disable_chr(0x1e) + disable_chr(0x1f) + disable_chr(0x20) + disable_chr(0x27) + disable_chr(0x28) + disable_chr(0x29) + disable_chr(0x2a) + disable_chr(0x2b) + disable_chr(0x2c) + disable_chr(0x21) + disable_chr(0x22) + disable_chr(CHR_BRIDGE1) + disable_chr(CHR_BRIDGE2) + disable_chr(CHR_BRIDGE3) + disable_chr(CHR_BRIDGESPAWNER1) + disable_chr(CHR_BRIDGESPAWNER2) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 450, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + endloop(0x08) + + label(0x06) + enable_chr(0x0b) + yield + enable_chr(0x0c) + yield + enable_chr(CHR_SUSPENDEDANIM1) + yield + enable_chr(CHR_SUSPENDEDANIM2) + yield + enable_chr(CHR_SUSPENDEDANIM3) + yield + enable_chr(CHR_SUSPENDEDANIM4) + yield + enable_chr(0x11) + yield + enable_chr(0x12) + yield + enable_chr(0x13) + yield + enable_chr(0x14) + yield + enable_chr(0x15) + yield + enable_chr(0x16) + yield + enable_chr(0x17) + yield + enable_chr(0x18) + yield + enable_chr(0x19) + yield + enable_chr(0x1a) + yield + enable_chr(0x1b) + yield + enable_chr(0x1c) + yield + enable_chr(0x1d) + yield + enable_chr(0x1e) + yield + enable_chr(0x1f) + yield + enable_chr(0x20) + yield + enable_chr(0x27) + yield + enable_chr(0x28) + yield + enable_chr(0x29) + yield + enable_chr(0x2a) + yield + enable_chr(0x2b) + yield + enable_chr(0x2c) + yield + set_ailist(CHR_MAIAN1, AILIST_CLOAK_AND_REMOVE) + set_ailist(CHR_MAIAN2, AILIST_CLOAK_AND_REMOVE) + set_ailist(0x07, AILIST_CLOAK_AND_REMOVE) + set_ailist(0x08, AILIST_CLOAK_AND_REMOVE) + set_ailist(0x09, AILIST_CLOAK_AND_REMOVE) + set_ailist(0x0a, AILIST_CLOAK_AND_REMOVE) + rebuild_teams + rebuild_squadrons + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 550, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + endloop(0x09) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041f_cloak_and_remove[] = { + set_shotlist(AILIST_CLOAK_AND_REMOVE) + set_chr_cloaked(CHR_SELF, TRUE, FALSE) + restart_timer + + beginloop(0x04) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x04) + + label(0x2c) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1026_hide_necklace[] = { + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // A and SA + label(0x2c) + disable_object(OBJ_NECKLACE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#if VERSION >= VERSION_NTSC_1_0 +u8 func0427_set_cloaked[] = { + stop_chr + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0428_set_uncloaked[] = { + stop_chr + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) + endlist +}; +#endif + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_hangar_shuttle, 0x1002 }, + { func1003_intro, 0x1003 }, + { func1004_check_hangar_doors_opened, 0x1004 }, + { func1005_check_elvis_dead, 0x1005 }, + { func1006_wake_slayer_skedar, 0x1006 }, + { func1007_check_entered_slayer_area, 0x1007 }, + { func1008_hangar_lifts, 0x1008 }, + { func1009_keep_door_open_in_intro, 0x1009 }, + { func100a_check_hangar_kills_done, 0x100a }, + { func100b_msg_getshieldsdown, 0x100b }, + { func100c_engineroom, 0x100c }, + { func100d_prebridgelift, 0x100d }, + { func100e_bridgelift, 0x100e }, + { func100f_bridge_entry, 0x100f }, + { func1010_check_bridge_captured, 0x1010 }, + { func1011_check_end_level, 0x1011 }, + { func1012_update_elvis_target_chr, 0x1012 }, + { func1013_msg_gottogetshieldsdown, 0x1013 }, + { func1014_msg_hangarbaydoors, 0x1014 }, + { func1015_msg_starmaps, 0x1015 }, + { func1016_msg_ifwecontrolthebridge, 0x1016 }, + { func1017_pa_skedar_alertness, 0x1017 }, + { func1018_place_elvis_in_hangar, 0x1018 }, + { func1019_check_shields_lowered, 0x1019 }, + { func101a_kill_maian, 0x101a }, + { func141b_setup_lifts, 0x141b }, + { func101c_lift_door_sounds, 0x101c }, + { func101d_unlock_doors, 0x101d }, + { func101e_bridge_music, 0x101e }, + { func101f_enable_bridge_skedar, 0x101f }, + { func1020_engine_hum_noise, 0x1020 }, + { func1021_check_ammo_wasted, 0x1021 }, + { func1022_setup_rtracker, 0x1022 }, + { func1423_setup_environment, 0x1423 }, + { func1024_set_bridge_skedar_invincible, 0x1024 }, + { func1025_toggle_chrs, 0x1025 }, + { func1026_hide_necklace, 0x1026 }, + { func1003_intro, 0x0c00 }, + { func0c01_outro, 0x0c01 }, + { func0c01_outro, 0x0426 }, + { func040f_init_skedar, 0x040f }, + { func0410_wake_suspendedanim_skedar, 0x0410 }, + { func040d_elvis_wait_for_hangar_entry, 0x040d }, + { func040e_elvis_give_ar34, 0x040e }, + { func0409_elvis_follow, 0x0409 }, + { func040a_elvis_go_to_hangar_lift, 0x040a }, + { func040b_init_cass, 0x040b }, + { func040c_elvis_run_from_engineroom, 0x040c }, + { func0401_start_path00, 0x0401 }, + { func0402_start_path01, 0x0402 }, + { func0403_start_path02, 0x0403 }, + { func0404_start_path03, 0x0404 }, + { func0405_start_path04, 0x0405 }, + { func0406_start_path05, 0x0406 }, + { func0407_init_knifeable_skedar, 0x0407 }, + { func0408_knifeable_skedar, 0x0408 }, + { func0412_hangarspawner, 0x0412 }, + { func0413_init_hangarclone, 0x0413 }, + { func0414_hangarclone, 0x0414 }, + { func0415_bridgespawner, 0x0415 }, + { func0416_init_bridgeclone, 0x0416 }, + { func0417_init_spawner_reveal, 0x0417 }, + { func0418_init_hangar_maian, 0x0418 }, + { func0419_hangar_maian, 0x0419 }, + { func041a_bridgeclone, 0x041a }, + { func041b_elvis_at_bridge, 0x041b }, + { func041c_elvis_outside_prebridgelift, 0x041c }, + { func041d_init_elvis_outside_prebridgelift, 0x041d }, + { func041f_cloak_and_remove, 0x041f }, + { func041e_init_bridge1and2, 0x041e }, + { func0420_init_bridge3, 0x0420 }, + { func0421_bridge_skedar, 0x0421 }, + { func0422_cass, 0x0422 }, + { func0423_shy_skedar, 0x0423 }, + { func0423_shy_skedar_wait, 0x0424 }, + { func0425_init_shy_skedar, 0x0425 }, +#if VERSION >= VERSION_NTSC_1_0 + { func0427_set_cloaked, 0x0427 }, + { func0428_set_uncloaked, 0x0428 }, +#endif + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setuplen.c b/src/ailists/setuplen.c new file mode 100644 index 000000000..f5c9423fb --- /dev/null +++ b/src/ailists/setuplen.c @@ -0,0 +1,40 @@ +// +// Stage ID 0x36 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + intro_weapon(WEAPON_NONE, -1) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setuplip.c b/src/ailists/setuplip.c new file mode 100644 index 000000000..904813c13 --- /dev/null +++ b/src/ailists/setuplip.c @@ -0,0 +1,5036 @@ +// +// Rescue +// + +#include "stagesetup.h" + +// Characters +#define CHR_ALIEN 0x38 +#define CHR_DOORMAN 0x39 +#define CHR_LABTECH_RECORDS 0x3a +#define CHR_LABTECH_LIGHTS 0x3b +#define CHR_LABTECH_DOORS1 0x3c +#define CHR_LABTECH_SHOWERS 0x3d +#define CHR_LABTECH_HARRYSMATE 0x3e +#define CHR_LABTECH_KEYCARDGUY 0x3f +#define CHR_BIOTECH1 0x40 +#define CHR_BIOTECH2 0x41 +#define CHR_LABTECH_DOORS2 0x42 +#define CHR_MECHANIC 0x43 +#define CHR_JONATHAN 0x48 +#define CHR_INTRO_DEAD_GUARD 0x49 + +// Objects +#define OBJ_LABCOAT1 0x00 +#define OBJ_DOOR_TERMINAL 0x02 +#define OBJ_DATAUPLINK_BOND 0x05 +#define OBJ_KEYCARD 0x06 +#define OBJ_CRATE 0x17 +#define OBJ_WALL 0x18 +#define OBJ_AUTOGUN 0x19 +#define OBJ_CHAMBER1 0x1a +#define OBJ_CHAMBER2 0x1b +#define OBJ_CHAMBER3 0x1c +#define OBJ_CHAMBER4 0x1d +#define OBJ_CHAMBER5 0x1e +#define OBJ_CHAMBER6 0x1f +#define OBJ_CHAMBER7 0x20 +#define OBJ_CHAMBER8 0x21 +#define OBJ_CHAMBER1_SWITCH 0x22 +#define OBJ_CHAMBER2_SWITCH 0x23 +#define OBJ_CHAMBER3_SWITCH 0x24 +#define OBJ_CHAMBER4_SWITCH 0x25 +#define OBJ_CHAMBER5_SWITCH 0x26 +#define OBJ_CHAMBER6_SWITCH 0x27 +#define OBJ_CHAMBER7_SWITCH 0x28 +#define OBJ_CHAMBER8_SWITCH 0x29 +#define OBJ_DATAUPLINK_COOP 0x3a +#define OBJ_LABCOAT2 0x3e +#define OBJ_LABCOAT3 0x3f +#define OBJ_LABCOAT4 0x40 +#define OBJ_LABCOAT5 0x41 +#define OBJ_FALCON2SILENCED1 0x4c +#define OBJ_FALCON2SILENCED2 0x4d +#define OBJ_PHOENIX 0x4e + +// Stage flags +#define STAGEFLAG_CHAMBER4_RAISED 0x00000001 +#define STAGEFLAG_CHAMBER5_RAISED 0x00000002 +#define STAGEFLAG_CHAMBER6_RAISED 0x00000004 +#define STAGEFLAG_CHAMBER7_RAISED 0x00000008 +#define STAGEFLAG_CHAMBER8_RAISED 0x00000010 +#define STAGEFLAG_LOOKING_AT_CHAMBER 0x00000020 +#define STAGEFLAG_ONE_KEYCARD_GUARD_REMAINING 0x00000040 +#define STAGEFLAG_UPLINK_TERMINAL_DESTROYED 0x00000080 +#define STAGEFLAG_USED_DISGUISE 0x00000100 +#define STAGEFLAG_RECORDS_DESTROYED 0x00000200 +#define STAGEFLAG_DOOR_VIRUS_DOWNLOADED 0x00000400 +#define STAGEFLAG_LIGHT_VIRUS_DONE 0x00000800 +#define STAGEFLAG_AUTOGUN_VIRUS_DONE 0x00001000 +#define STAGEFLAG_ENTERED_LAB 0x00002000 +#define STAGEFLAG_DISGUISE_UNCOVERED 0x00010000 +#define STAGEFLAG_LABTECH_DEAD 0x00020000 +#define STAGEFLAG_DOORMAN_REJECTED 0x00040000 +#define STAGEFLAG_DOORMAN_DEAD 0x00080000 +#define STAGEFLAG_KEYCARDGUY_ANGRY 0x00100000 +#define STAGEFLAG_ENTERED_ELVIS_AREA 0x00200000 +#define STAGEFLAG_RESCUED_ELVIS 0x00400000 +#define STAGEFLAG_ELVIS_DEAD 0x00800000 +#define STAGEFLAG_XRAY_DONE 0x01000000 +#define STAGEFLAG_CHAMBER_SWITCH_DESTROYED 0x02000000 +#define STAGEFLAG_CRATE_DESTROYED 0x08000000 +#define STAGEFLAG_AUTOGUN_ACTIVATED 0x10000000 +#define STAGEFLAG_CHAMBER1_RAISED 0x20000000 +#define STAGEFLAG_CHAMBER2_RAISED 0x40000000 +#define STAGEFLAG_CHAMBER3_RAISED 0x80000000 + +// AI Lists +#define AILIST_LABTECH_SA_PA 0x0410 +#define AILIST_LABTECH_AGENT 0x0411 +#define AILIST_INIT_LABTECH 0x0412 +#define AILIST_MECHANIC 0x0413 +#define AILIST_INIT_MECHANIC 0x0414 +#define AILIST_WAREHOUSE_SPAWNER 0x0415 +#define AILIST_BECOME_UNAWARE 0x0416 +#define AILIST_WAREHOUSE_CLONE 0x0417 +#define AILIST_DOORMAN 0x0418 +#define AILIST_INIT_DOORMAN 0x0419 +#define AILIST_LABTECH_HARRYSMATE 0x041a +#define AILIST_LABTECH_KEYCARDGUY 0x041b +#define AILIST_LABTECH_LIGHTS 0x041f +#define AILIST_LABTECH_DOORS 0x0420 +#define AILIST_INIT_LABTECH_DOORS 0x0421 +#define AILIST_LABTECH_RECORDS 0x0422 +#define AILIST_INIT_LABTECH_RECORDS 0x0423 +#define AILIST_ALIEN 0x0424 +#define AILIST_HIDDENGUY 0x0425 +#define AILIST_CHECK_LOOKING_AT_ALIEN 0x0426 +#define AILIST_SHOCK_CLONE 0x0427 +#define AILIST_OUTRO 0x0428 +#define AILIST_DRAGON_GUARD 0x042c +#define AILIST_SUPERDRAGON_GUARD 0x042d +#define AILIST_BIOTECH_GUARD 0x042e +#define AILIST_BIOTECH_GUARD_ALERTED 0x042f +#define AILIST_BIOTECH2 0x0430 +#define AILIST_BIOTECH1 0x0431 +#define AILIST_INIT_BIOTECH1 0x0432 +#define AILIST_INIT_BIOTECH2 0x0433 + +enum labelnum { + LABEL_2D = (VERSION >= VERSION_NTSC_1_0 ? 0x2d : 0x2c), + LABEL_2E, + LABEL_2F, + LABEL_30, + LABEL_31, + LABEL_32, + LABEL_33, + LABEL_34, + LABEL_35, + LABEL_36, + LABEL_37, + LABEL_38, + LABEL_39, + LABEL_3A, + LABEL_3B, + LABEL_3C, + LABEL_3D, + LABEL_3E, + LABEL_3F, + LABEL_40, + LABEL_41, + LABEL_42, + LABEL_43, + LABEL_44, + LABEL_45, + LABEL_46, + LABEL_47, + LABEL_48, + LABEL_49, + LABEL_4A, + LABEL_4B, + LABEL_4C, + LABEL_4D, + LABEL_4E, + LABEL_4F, + LABEL_50, + LABEL_51, + LABEL_52, + LABEL_53, + LABEL_54, + LABEL_55, + LABEL_56, + LABEL_57, + LABEL_58, + LABEL_59, + LABEL_5A, + LABEL_5B, + LABEL_5C, + LABEL_5D, + LABEL_5E, + LABEL_5F, + LABEL_60, + LABEL_61, + LABEL_62, + LABEL_63, + LABEL_64, + LABEL_65, + LABEL_66, + LABEL_67, + LABEL_68, + LABEL_69, + LABEL_6A, + LABEL_6B, + LABEL_6C, + LABEL_6D, + LABEL_6E, + LABEL_6F, + LABEL_70, + LABEL_71, + LABEL_72, + LABEL_73, + LABEL_74, + LABEL_75, + LABEL_76, + LABEL_77, + LABEL_78, + LABEL_79, + LABEL_7A, + LABEL_7B, + LABEL_7C, + LABEL_7D, + LABEL_7E, + LABEL_7F, + LABEL_80, + LABEL_81, + LABEL_82, + LABEL_83, + LABEL_84, + LABEL_85, + LABEL_86, + LABEL_87, + LABEL_88, + LABEL_89, + LABEL_8A, + LABEL_8B, + LABEL_8C, + LABEL_8D, + LABEL_8E, + LABEL_8F, + LABEL_90, + LABEL_91, + LABEL_92, + LABEL_93, + LABEL_94, + LABEL_95, + LABEL_96, + LABEL_97, + LABEL_98, + LABEL_99, + LABEL_9A, + LABEL_9B, + LABEL_9C, + LABEL_9D, + LABEL_9E, + LABEL_9F, + LABEL_A0, + LABEL_A1, + LABEL_A2, + LABEL_A3, + LABEL_A4, + LABEL_A5, + LABEL_A6, + LABEL_A7, + LABEL_A8, + LABEL_A9, + LABEL_AA, + LABEL_AB, + LABEL_AC, + LABEL_AD, + LABEL_AE, + LABEL_AF, + LABEL_B0, + LABEL_B1, + LABEL_B2, + LABEL_B3, + LABEL_B4, + LABEL_B5, + LABEL_B6, + LABEL_B7, + LABEL_B8, + LABEL_B9, + LABEL_BA, + LABEL_BB, + LABEL_BC, + LABEL_BD, + LABEL_BE, + LABEL_BF, + LABEL_C0, + LABEL_C1, + LABEL_C2, + LABEL_C3, + LABEL_C4, + LABEL_C5, + LABEL_C6, + LABEL_C7, + LABEL_C8, + LABEL_C9, + LABEL_CA, + LABEL_CB, + LABEL_CC, + LABEL_CD, + LABEL_CE, + LABEL_CF, + LABEL_D0, + LABEL_D1, + LABEL_D2, + LABEL_D3, + LABEL_D4, + LABEL_D5, + LABEL_D6, + LABEL_D7, + LABEL_D8, + LABEL_D9, + LABEL_DA, + LABEL_DB, + LABEL_DC, + LABEL_DD, + LABEL_DE, + LABEL_DF, + LABEL_E0, + LABEL_E1, + LABEL_E2, + LABEL_E3, + LABEL_E4, + LABEL_E5, + LABEL_E6, + LABEL_E7, + LABEL_E8, + LABEL_E9, + LABEL_EA, + LABEL_EB, + LABEL_EC, + LABEL_ED, + LABEL_EE, + LABEL_EF, + LABEL_F0, + LABEL_F1, + LABEL_F2, + LABEL_F3, + LABEL_F4, + LABEL_F5, + LABEL_F6 +}; + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_LIP_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_LIP_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_LIP_002) + briefing(BRIEFINGTYPE_TEXT_A, L_LIP_003) + + beginobjective(0, L_LIP_010, (DIFFBIT_PA | DIFFBIT_PD)) // "Destroy computer records" + complete_flags(STAGEFLAG_RECORDS_DESTROYED) + fail_flags(STAGEFLAG_UPLINK_TERMINAL_DESTROYED) + endobjective + + beginobjective(1, L_LIP_011, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate conspiracy evidence" + complete_flags(STAGEFLAG_XRAY_DONE) + fail_flags(STAGEFLAG_CHAMBER_SWITCH_DESTROYED) + endobjective + + beginobjective(2, L_LIP_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Obtain and use lab technician disguise" + complete_flags(STAGEFLAG_USED_DISGUISE) + fail_flags(STAGEFLAG_DISGUISE_UNCOVERED) + endobjective + + beginobjective(3, L_LIP_012, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Gain access to autopsy lab" + complete_flags(STAGEFLAG_ENTERED_LAB) + require_object_collected(OBJ_KEYCARD) + fail_flags(STAGEFLAG_DOORMAN_REJECTED) + fail_flags(STAGEFLAG_DOORMAN_DEAD) + endobjective + + beginobjective(4, L_LIP_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Rescue the crash Survivor" + complete_flags(STAGEFLAG_RESCUED_ELVIS) + fail_flags(STAGEFLAG_ELVIS_DEAD) + fail_flags(STAGEFLAG_CRATE_DESTROYED) + endobjective + + chr(SPAWNFLAG_00000200, 0x00, PAD_LIP_039F, BODY_A51AIRMAN, HEAD_RANDOM, 0x0401, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x01, PAD_LIP_03A2, BODY_A51AIRMAN, HEAD_RANDOM, 0x0402, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x02, PAD_LIP_03A3, BODY_A51AIRMAN, HEAD_RANDOM, 0x0403, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x03, PAD_LIP_03A4, BODY_A51AIRMAN, HEAD_RANDOM, 0x0404, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x04, PAD_LIP_03A5, BODY_A51AIRMAN, HEAD_RANDOM, 0x0405, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x05, PAD_LIP_0386, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 2000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x06, PAD_LIP_0387, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 2000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x07, PAD_LIP_03A7, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x08, PAD_LIP_03A6, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 1000, 20, CHRFLAG0_CAN_RETREAT | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x09, PAD_LIP_03A8, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x0a, PAD_LIP_03CB, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x0b, PAD_LIP_03A9, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x0c, PAD_LIP_03AA, BODY_A51AIRMAN, HEAD_RANDOM, 0x0406, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x0d, PAD_LIP_01BB, BODY_A51AIRMAN, HEAD_RANDOM, 0x0406, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x0e, PAD_LIP_01BC, BODY_A51AIRMAN, HEAD_RANDOM, 0x0406, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x0f, PAD_LIP_03AB, BODY_AREA51GUARD, HEAD_RANDOM, 0x0407, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x10, PAD_LIP_03AC, BODY_AREA51GUARD, HEAD_RANDOM, 0x0408, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x11, PAD_LIP_03AE, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_BLUESIGHT, 0x3a, PAD_LIP_03AF, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH_RECORDS, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x27, PAD_LIP_03BF, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 100, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x28, PAD_LIP_03C0, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 100, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x12, PAD_LIP_03B1, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x3b, PAD_LIP_03D8, BODY_LABTECH, HEAD_RANDOM, AILIST_LABTECH_LIGHTS, -1, -1, 1000, 6, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_06, 0x3b, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_00000200, 0x13, PAD_LIP_03B2, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_BLUESIGHT, 0x3c, PAD_LIP_03C9, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH_DOORS, 0x03c8, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_07, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_BLUESIGHT, 0x42, PAD_LIP_03B3, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH_DOORS, 0x03c9, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_07, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x14, PAD_LIP_00F7, BODY_AREA51GUARD, HEAD_RANDOM, 0x0409, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x15, PAD_LIP_00F0, BODY_AREA51GUARD, HEAD_RANDOM, 0x040a, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_BLUESIGHT, 0x3d, PAD_LIP_03B4, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH, -1, -1, 1000, 100, 0, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x18, PAD_LIP_00C7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1e, PAD_LIP_0130, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, 0x0132, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x19, PAD_LIP_0131, BODY_BIOTECH, HEAD_BIOTECH, AILIST_BIOTECH_GUARD, 0x0136, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x1a, PAD_LIP_013B, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, 0x013c, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1d, PAD_LIP_0137, BODY_BIOTECH, HEAD_BIOTECH, AILIST_BIOTECH_GUARD, 0x013a, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x1b, PAD_LIP_0123, BODY_AREA51GUARD, HEAD_RANDOM, 0x040b, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1c, PAD_LIP_0124, BODY_AREA51GUARD, HEAD_RANDOM, 0x040c, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(0, 0x3e, PAD_LIP_03C1, BODY_LABTECH, HEAD_RANDOM, AILIST_LABTECH_HARRYSMATE, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + chr(0, 0x3f, PAD_LIP_03C2, BODY_LABTECH, HEAD_RANDOM, AILIST_LABTECH_KEYCARDGUY, -1, -1, 1000, 15, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x39, PAD_LIP_0121, BODY_AREA51GUARD, HEAD_BEAU1, AILIST_INIT_DOORMAN, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0039, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x33, PAD_LIP_03CC, BODY_BIOTECH, HEAD_BIOTECH, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x34, PAD_LIP_03CD, BODY_BIOTECH, HEAD_BIOTECH, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x37, PAD_LIP_03D0, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0037, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x2c, PAD_LIP_03D1, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x2d, PAD_LIP_03D2, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x2e, PAD_LIP_03D3, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x002e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x2f, PAD_LIP_03D4, BODY_BIOTECH, HEAD_BIOTECH, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x30, PAD_LIP_03D5, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x31, PAD_LIP_03D6, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x32, PAD_LIP_03D7, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1f, PAD_LIP_03B5, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x20, PAD_LIP_03B6, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x21, PAD_LIP_03B7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x22, PAD_LIP_03B8, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) +#if VERSION >= VERSION_NTSC_1_0 + chr(0, 0x23, PAD_LIP_03B9, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x23, PAD_LIP_03B9, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) +#if VERSION >= VERSION_NTSC_1_0 + chr(0, 0x24, PAD_LIP_03BA, BODY_BIOTECH, HEAD_BIOTECH, AILIST_BIOTECH_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x24, PAD_LIP_03BA, BODY_BIOTECH, HEAD_BIOTECH, AILIST_BIOTECH_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) +#if VERSION >= VERSION_NTSC_1_0 + chr(0, 0x25, PAD_LIP_03BB, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x25, PAD_LIP_03BB, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) +#if VERSION >= VERSION_NTSC_1_0 + chr(0, 0x26, PAD_LIP_03BC, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200, 0x26, PAD_LIP_03BC, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x40, PAD_LIP_03BE, BODY_BIOTECH, HEAD_BIOTECH, AILIST_INIT_BIOTECH1, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_NONCOMBAT, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSONICSCREWER, 0x0040, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_UNCOLLECTABLE, 0, 0, WEAPON_SCREWDRIVER) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x41, PAD_LIP_03DC, BODY_BIOTECH, HEAD_BIOTECH, AILIST_INIT_BIOTECH2, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_NONCOMBAT, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSONICSCREWER, 0x0041, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_UNCOLLECTABLE, 0, 0, WEAPON_SCREWDRIVER) + chr(SPAWNFLAG_BLUESIGHT, 0x43, PAD_LIP_01DE, BODY_OVERALL, HEAD_RANDOM, AILIST_INIT_MECHANIC, -1, -1, 1000, 5, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + tag(0x2f, 1) + hover_prop(0x0100, MODEL_HOVERBED, PAD_LIP_03BD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_HOVERBEDSHIELD, 1000, 0x00010000) + chr(0, 0x44, PAD_LIP_0196, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_HIDDENGUY, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0044, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(0, 0x47, PAD_LIP_0119, BODY_AREA51GUARD, HEAD_RANDOM, 0x0429, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0047, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x48, PAD_LIP_020A, BODY_A51AIRMAN, HEAD_JONATHAN, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0048, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x49, PAD_LIP_0197, BODY_A51AIRMAN, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x38, PAD_LIP_0134, BODY_ELVIS1, HEAD_ELVIS, AILIST_ALIEN, -1, -1, 2000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_NONCOMBAT, SQUADRON_09, 0x1a, 0, 0, 1, 0, 0) + door_scale(0x00008000) + tag(0x35, 1) + lift(0x0100, MODEL_A51_LIFT_STORE, PAD_LIP_0334, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0334, 0x0335, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x20000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_LIP_02E2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000e666, 0x00010000, 0x00000888, 0x00000888, 0x00000147, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_LIP_02E1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000e666, 0x00010000, 0x00000888, 0x00000888, 0x00000147, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + lift_door(-2, -3, 0) + lift_door(-2, -4, 1) + tag(0x39, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_LIP_0336, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0336, 0x0337, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x20000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_LIP_02E4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_LIP_02E3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + lift_door(-2, -3, 0) + lift_door(-2, -4, 1) + door_scale(0x00010000) + tag(0x00, 1) + weapon(0x0180, MODEL_LABCOAT, PAD_LIP_042B, OBJFLAG_00000001, 0, 0, WEAPON_DISGUISE40) + rename_object(-1, WEAPON_DISGUISE40, L_LIP_015, L_LIP_016, L_LIP_017, L_LIP_018, L_LIP_019) // "Obtain lab clothes." + tag(0x3e, 1) + weapon(0x0180, MODEL_LABCOAT, PAD_LIP_042C, OBJFLAG_00000001, 0, 0, WEAPON_DISGUISE40) + rename_object(-1, WEAPON_DISGUISE40, L_LIP_015, L_LIP_016, L_LIP_017, L_LIP_018, L_LIP_019) // "Obtain lab clothes." + tag(0x3f, 1) + weapon(0x0180, MODEL_LABCOAT, PAD_LIP_042D, OBJFLAG_00000001, 0, 0, WEAPON_DISGUISE40) + rename_object(-1, WEAPON_DISGUISE40, L_LIP_015, L_LIP_016, L_LIP_017, L_LIP_018, L_LIP_019) // "Obtain lab clothes." + tag(0x40, 1) + weapon(0x0180, MODEL_LABCOAT, PAD_LIP_042E, OBJFLAG_00000001, 0, 0, WEAPON_DISGUISE40) + rename_object(-1, WEAPON_DISGUISE40, L_LIP_015, L_LIP_016, L_LIP_017, L_LIP_018, L_LIP_019) // "Obtain lab clothes." + tag(0x41, 1) + weapon(0x0180, MODEL_LABCOAT, PAD_LIP_042F, OBJFLAG_00000001, 0, 0, WEAPON_DISGUISE40) + rename_object(-1, WEAPON_DISGUISE40, L_LIP_015, L_LIP_016, L_LIP_017, L_LIP_018, L_LIP_019) // "Obtain lab clothes." + tag(0x03, 1) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_LIP_0428, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x02, 1) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_LIP_0427, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x01, 1) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_LIP_0429, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x04, 1) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_LIP_0426, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x05, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, PAD_LIP_00DA, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_LIP_024, L_LIP_025, L_LIP_026, L_LIP_027, L_LIP_028) // "Obtain Data Uplink." + tag(0x3a, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, PAD_LIP_00DA, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_LIP_024, L_LIP_025, L_LIP_026, L_LIP_027, L_LIP_028) // "Obtain Data Uplink." + tag(0x3c, 2) + tag(0x3d, 2) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_LIP_03C6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_LIP_03C7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_027F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_027E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_027D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_027C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_027A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_027B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0278, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0279, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0277, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0276, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0274, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000002, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0275, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000002, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0273, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000002, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0272, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000002, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0270, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0271, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_026F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_026E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_026C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_026D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_026B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_026A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0268, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0269, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x44, 2) + tag(0x45, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0266, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0267, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x2b, 4) + tag(0x2c, 4) + tag(0x2d, 4) + tag(0x2e, 4) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02AA, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02AB, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02AC, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02AD, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x07, 2) + tag(0x08, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0280, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0281, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x09, 2) + tag(0x0a, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02B7, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02B8, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0b, 2) + tag(0x0c, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02B9, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02BA, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0d, 2) + tag(0x0e, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02BB, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02BC, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0283, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0282, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0284, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_0285, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_028B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_028A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_LIP_0286, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0287, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_LIP_0289, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_0288, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02A4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02A5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000020, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_SECRET, PAD_LIP_028E, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0000d555, 0x0000d555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000001, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_0292, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_0293, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_0294, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_0295, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51GATE_L, PAD_LIP_02B5, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00008000, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00000f00) + door(0x0100, MODEL_A51GATE_R, PAD_LIP_02B6, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00004000, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_0299, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_0298, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x4a, 2) + tag(0x4b, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_LIP_02A8, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000040, 0x00000258, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02A7, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000258, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_029A, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_029B, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_029C, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_029D, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x13, 1) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_029E, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_029F, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x30, 3) + tag(0x31, 3) + tag(0x11, 1) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_02A1, OBJFLAG_00000010 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_02A0, OBJFLAG_00000010 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_028C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_028D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02AE, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_028F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x12, 1) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_0290, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_0291, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02A2, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000a666, 0x0000a666, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02A3, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000a666, 0x0000a666, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + stdobject(0x00e6, MODEL_LAB_CONTAINER, PAD_LIP_031C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02E5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LIP_02E6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_02E7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LIP_02E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_02EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02EB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LIP_02EC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_02ED, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02EE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LIP_02EF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_02F0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02F1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LIP_02F2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_02F3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02F4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LIP_02F5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_02F6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_02F7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + blocked_path(2, 0x0111, 0x01bb) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_A51_UNEXP1, PAD_LIP_0422, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_A51_EXP1, PAD_LIP_0421, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_A51_EXP1, PAD_LIP_0421, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + tag(0x18, -2) + tag(0x46, 6) + tag(0x47, 6) + tag(0x48, 8) + tag(0x49, 8) + tag(0x38, 1) + lift(0x0100, MODEL_A51_LIFT_CONTROL, PAD_LIP_032A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x032a, 0x032b, -1, -1, 0x00000001, 0x00000005, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_0330, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_0331, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_0332, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_0333, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + lift_door(-2, -7, 1) + lift_door(-2, -8, 1) + tag(0x14, 2) + tag(0x15, 2) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02B3, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02B4, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0xffffffff, VERSION >= VERSION_NTSC_1_0 ? 0x00000000 : 0x00000300) + tag(0x33, 2) + tag(0x34, 2) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LIP_02AF, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LIP_02B0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LIP_0321, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LIP_0327, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) +#else + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LIP_0321, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LIP_0327, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) +#endif + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02B2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02B1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x17, 1) + hover_prop(0x00eb, MODEL_HOVERCRATE1, PAD_LIP_01C7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE, 1000, 0x02010000) + tag(0x06, 1) + key(0x0080, MODEL_KEYCARD, 0x003f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 32) + rename_object(-1, WEAPON_KEYCARD47, L_LIP_032, L_LIP_033, L_LIP_034, L_LIP_035, L_LIP_036) // "Obtain medlab 2 key card." + + // @bug: This keycard is given to guard 0x26 rather than being left + // unassigned. This breaks the keycard hot potato which is supposed to + // happen in the last room, because the keycard is not given to anyone until + // there's one guard left, and you can just kill guard 0x26 for it. + tag(0x10, 1) + key(0x0080, MODEL_KEYCARD, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 128) + rename_object(-1, WEAPON_KEYCARD48, L_LIP_059, L_LIP_060, L_LIP_061, L_LIP_062, L_LIP_063) // "Obtain op room key card." + + stdobject(0x0100, MODEL_A51BOARD, PAD_LIP_03C4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02BD, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02BE, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02BF, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02C0, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02C1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02C2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LIP_02C3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02C4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + glass(0x0100, MODEL_MEDLABWIN1, PAD_LIP_0436, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_LIP_0437, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_LIP_0438, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN1, PAD_LIP_0439, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_LIP_043A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_LIP_043B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_0446, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x0096012c) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_0445, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x0096012c) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_043D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_043E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_043F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_0440, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_0441, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LIP_0442, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tag(0x19, 1) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LIP_0405, OBJFLAG_00000004, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0108, 0x00004000, 0xffffc000, 0x000000da, 0x00140000) + tag(0x1a, 2) + tag(0x22, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_033C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033c, 0x033d, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_045C, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x1c, 2) + tag(0x24, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_0340, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0340, 0x0341, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_0459, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x1e, 2) + tag(0x26, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_0344, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0344, 0x0345, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_045A, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x20, 2) + tag(0x28, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_0348, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0348, 0x0349, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_045B, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x1b, 2) + tag(0x23, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_033F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033f, 0x033e, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_045E, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x1d, 2) + tag(0x25, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_0343, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0343, 0x0342, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_045F, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x1f, 2) + tag(0x27, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_0347, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0347, 0x0346, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_0460, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x21, 2) + tag(0x29, 2) + lift(0x0100, MODEL_CHAMBER, PAD_LIP_034B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x034b, 0x034a, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LIP_045D, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x32, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0461, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0462, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0463, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0464, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0465, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0466, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0467, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0468, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0469, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_046A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_046B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_046C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_046D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_046E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_046F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0470, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0471, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0472, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0473, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_0474, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0476, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0477, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0479, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_047A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_047B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_047C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_047D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_047E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_047F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0480, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0481, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0482, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0483, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0484, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0485, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x3b, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0486, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0487, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0488, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_LIP_0489, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0491, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0492, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0493, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0494, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0495, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0496, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0497, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0498, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_0499, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_049A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_049B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_049C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_049D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_049E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_049F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_04A0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_04A1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_04A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_LIP_04A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_LIP_04AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LIP_031A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LIP_031B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04B8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04B9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04BA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04BB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04BC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04BD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LIP_04BE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02C7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02C8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02C9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02CA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02CB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02CC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02CD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02CE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02CF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LIP_02D0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D1, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D2, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D3, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D4, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D5, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D6, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D7, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D8, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02D9, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02DA, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LIP_02DB, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + stdobject(0x0100, MODEL_A51TABLE, PAD_LIP_04D4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51GRATE, PAD_LIP_0443, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x4c, 2) + tag(0x4d, 2) + weapon(0x0100, MODEL_CHRFALCON2SIL, PAD_LIP_03DB, OBJFLAG_00000001, 0, 0, WEAPON_FALCON2_SILENCER) + weapon(0x0100, MODEL_CHRFALCON2SIL, PAD_LIP_03DB, OBJFLAG_00000001, 0, 0, WEAPON_FALCON2_SILENCER) + link_guns(-1, -2) + tag(0x4e, 1) + weapon(0x0100, MODEL_CHRMAIANPISTOL, PAD_LIP_0389, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, WEAPON_PHOENIX) + tag(0x42, 1) + shield(0x0100, MODEL_CHRSHIELD, 0x0004, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x43, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_LIP_0474, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_LIP_03A1) + intro_weapon(WEAPON_FALCON2_SILENCER, -1) + ammo(AMMOTYPE_PISTOL, 100) + intro_weapon(WEAPON_XRAYSCANNER, -1) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path00[] = { + PAD_LIP_0194, + PAD_LIP_0193, + PAD_LIP_0196, + PAD_LIP_0195, + -1, +}; + +s32 path01[] = { + PAD_LIP_019A, + PAD_LIP_019C, + PAD_LIP_018B, + PAD_LIP_018A, + PAD_LIP_018F, + PAD_LIP_01A0, + PAD_LIP_0190, + PAD_LIP_019E, + PAD_LIP_0199, + -1, +}; + +s32 path02[] = { + PAD_LIP_0190, + PAD_LIP_019E, + PAD_LIP_0199, + PAD_LIP_019A, + PAD_LIP_019C, + PAD_LIP_018B, + PAD_LIP_018A, + PAD_LIP_018F, + PAD_LIP_01A0, + -1, +}; + +s32 path03[] = { + PAD_LIP_018D, + PAD_LIP_0189, + PAD_LIP_0191, + PAD_LIP_018F, + PAD_LIP_018E, + -1, +}; + +s32 path04[] = { + PAD_LIP_0185, + PAD_LIP_0186, + PAD_LIP_0187, + PAD_LIP_0182, + PAD_LIP_0188, + -1, +}; + +s32 path05[] = { + PAD_LIP_01BD, + PAD_LIP_01BC, + PAD_LIP_01BB, + PAD_LIP_01BC, + PAD_LIP_01BD, + -1, +}; + +s32 path06[] = { + PAD_LIP_0111, + PAD_LIP_010F, + PAD_LIP_011A, + PAD_LIP_0118, + PAD_LIP_011A, + PAD_LIP_010F, + PAD_LIP_0111, + -1, +}; + +s32 path07[] = { + PAD_LIP_0112, + PAD_LIP_0113, + PAD_LIP_0100, + PAD_LIP_0102, + PAD_LIP_0104, + PAD_LIP_0102, + PAD_LIP_0100, + PAD_LIP_0113, + -1, +}; + +s32 path08[] = { + PAD_LIP_00F7, + PAD_LIP_00FA, + PAD_LIP_00FB, + PAD_LIP_00FC, + PAD_LIP_00FB, + PAD_LIP_00FA, + PAD_LIP_00F7, + PAD_LIP_00F8, + PAD_LIP_00F9, + PAD_LIP_00FA, + -1, +}; + +s32 path09[] = { + PAD_LIP_00F0, + PAD_LIP_00F2, + PAD_LIP_00F3, + PAD_LIP_00F4, + PAD_LIP_00F3, + PAD_LIP_00F2, + PAD_LIP_00F0, + PAD_LIP_00EF, + PAD_LIP_00F3, + PAD_LIP_00F2, + -1, +}; + +s32 path10[] = { + PAD_LIP_0123, + PAD_LIP_0124, + -1, +}; + +s32 path11[] = { + PAD_LIP_0124, + PAD_LIP_0123, + -1, +}; + +s32 path12[] = { + PAD_LIP_0118, + PAD_LIP_0119, + PAD_LIP_011A, + PAD_LIP_010D, + PAD_LIP_010E, + PAD_LIP_010F, + PAD_LIP_0110, + PAD_LIP_0111, + PAD_LIP_0112, + PAD_LIP_0113, + PAD_LIP_0114, + PAD_LIP_0100, + PAD_LIP_0114, + PAD_LIP_0113, + PAD_LIP_0112, + PAD_LIP_0111, + PAD_LIP_0110, + PAD_LIP_010F, + PAD_LIP_010E, + PAD_LIP_010D, + PAD_LIP_011A, + PAD_LIP_0119, + -1, +}; + +s32 path13[] = { + PAD_LIP_00ED, + PAD_LIP_0100, + PAD_LIP_00ED, + -1, +}; + +s32 path14[] = { + PAD_LIP_0100, + PAD_LIP_0118, + PAD_LIP_0100, + PAD_LIP_00ED, + -1, +}; + +u8 func1400_give_datauplinks[] = { + yield + set_chr_team(CHR_ANTI, TEAM_22) + give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) + give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1007_check_disguise_collected[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_LABCOAT1, /*goto*/ 0x06) + if_chr_has_object(CHR_P1P2, OBJ_LABCOAT2, /*goto*/ 0x06) + if_chr_has_object(CHR_P1P2, OBJ_LABCOAT3, /*goto*/ 0x06) + if_chr_has_object(CHR_P1P2, OBJ_LABCOAT4, /*goto*/ 0x06) + if_chr_has_object(CHR_P1P2, OBJ_LABCOAT5, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + + beginloop(0x08) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) + endloop(0x08) + + label(LABEL_2D) + set_stage_flag(STAGEFLAG_USED_DISGUISE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1026_check_records_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(0x04, /*goto*/ 0x06) + show_hudmsg(CHR_BOND, L_LIP_014) // "Research records destroyed." + set_stage_flag(STAGEFLAG_RECORDS_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1003_uplink_doors[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x02, /*goto*/ LABEL_2D) + reloop(0x04) + + label(LABEL_2D) + if_stage_flag_eq(STAGEFLAG_DOOR_VIRUS_DOWNLOADED, FALSE, /*goto*/ 0x06) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_P1P2, L_LIP_048) // "Virus has already been downloaded." + reloop(0x04) + + label(0x06) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_P1P2, L_LIP_020) // "Access to door control systems denied." + reloop(0x04) + + label(LABEL_2D) + show_hudmsg(CHR_P1P2, L_LIP_030) // "Data Uplink connected." + restart_timer + + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0427, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + goto_next(0x09) + + label(LABEL_2D) + endloop(0x08) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LIP_049) // "Initiating virus download." + restart_timer + assign_sound(SFX_01BF, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x02, TRUE) + + beginloop(0x11) + if_timer_gt(400, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0427, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + goto_next(0x09) + + label(LABEL_2D) + endloop(0x11) + + label(0x06) + mute_channel(CHANNEL_5) + if_object_in_good_condition(0x02, /*goto*/ LABEL_2D) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + assign_sound(SFX_01C1, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x02, TRUE) + show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." + yield + set_stage_flag(STAGEFLAG_DOOR_VIRUS_DOWNLOADED) + reloop(0x04) + + label(0x09) + show_hudmsg(CHR_P1P2, L_LIP_031) // "Data Uplink connection broken." + mute_channel(CHANNEL_5) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, 0x02, TRUE) + restart_timer + + beginloop(0x13) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x13) + + label(0x06) + mute_channel(CHANNEL_6) + endloop(0x04) + + endlist +}; + +u8 func1004_uplink_lights[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x01, /*goto*/ LABEL_2D) + reloop(0x04) + + label(LABEL_2D) + if_stage_flag_eq(STAGEFLAG_LIGHT_VIRUS_DONE, FALSE, /*goto*/ 0x06) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_P1P2, L_LIP_048) // "Virus has already been downloaded." + reloop(0x04) + + label(0x06) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_P1P2, L_LIP_021) // "Access to light control systems denied." + reloop(0x04) + + label(LABEL_2D) + show_hudmsg(CHR_P1P2, L_LIP_030) // "Data Uplink connected." + restart_timer + + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0429, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + goto_next(0x09) + + label(LABEL_2D) + endloop(0x08) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LIP_049) // "Initiating virus download." + restart_timer + assign_sound(SFX_01BF, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x01, TRUE) + + beginloop(0x11) + if_timer_gt(400, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0429, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + goto_next(0x09) + + label(LABEL_2D) + endloop(0x11) + + label(0x06) + mute_channel(CHANNEL_5) + if_object_in_good_condition(0x01, /*goto*/ LABEL_2D) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + assign_sound(SFX_01C1, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x01, TRUE) + show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." + yield + show_hudmsg(CHR_P1P2, L_LIP_088) // "Lighting systems overloaded." + configure_environment(0x00c4, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c3, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c8, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c9, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00ca, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c7, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c2, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c1, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c0, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00bf, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c6, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00c5, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + configure_environment(0x00a6, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) + set_stage_flag(STAGEFLAG_LIGHT_VIRUS_DONE) + reloop(0x04) + + label(0x09) + show_hudmsg(CHR_P1P2, L_LIP_031) // "Data Uplink connection broken." + mute_channel(CHANNEL_5) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, 0x01, TRUE) + restart_timer + + beginloop(0x13) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x13) + + label(0x06) + mute_channel(CHANNEL_6) + endloop(0x04) + + endlist +}; + +u8 func1005_uplink_autoguns[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x03, /*goto*/ LABEL_2D) + reloop(0x04) + + label(LABEL_2D) + if_stage_flag_eq(STAGEFLAG_LIGHT_VIRUS_DONE, FALSE, /*goto*/ 0x06) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_P1P2, L_LIP_048) // "Virus has already been downloaded." + reloop(0x04) + + label(0x06) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + play_sound(SFX_8116, -1) + show_hudmsg(CHR_P1P2, L_LIP_022) // "Access to security control systems denied." + reloop(0x04) + + label(LABEL_2D) + show_hudmsg(CHR_P1P2, L_LIP_030) // "Data Uplink connected." + restart_timer + + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0428, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + goto_next(0x09) + + label(LABEL_2D) + endloop(0x08) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LIP_049) // "Initiating virus download." + restart_timer + assign_sound(SFX_01BF, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x03, TRUE) + + beginloop(0x11) + if_timer_gt(400, /*goto*/ 0x06) + if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0428, /*goto*/ 0x09) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) + goto_next(0x09) + + label(LABEL_2D) + endloop(0x11) + + label(0x06) + mute_channel(CHANNEL_5) + if_object_in_good_condition(0x03, /*goto*/ LABEL_2D) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(LABEL_2D) + assign_sound(SFX_01C1, CHANNEL_5) + control_sound_from_object(CHANNEL_5, 0x00, TRUE) + show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." + yield + show_hudmsg(CHR_P1P2, L_LIP_105) // "Automatic Defenses Disabled." + set_stage_flag(STAGEFLAG_AUTOGUN_VIRUS_DONE) + reloop(0x04) + + label(0x09) + show_hudmsg(CHR_P1P2, L_LIP_031) // "Data Uplink connection broken." + mute_channel(CHANNEL_5) + assign_sound(SFX_01C0, CHANNEL_6) + control_sound_from_object(CHANNEL_6, 0x03, TRUE) + restart_timer + + beginloop(0x13) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x13) + + label(0x06) + mute_channel(CHANNEL_6) + reloop(0x04) + + show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." + set_stage_flag(STAGEFLAG_AUTOGUN_VIRUS_DONE) + endloop(0x04) + + endlist +}; + +u8 func1006_check_lab_accessed[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x008f, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LIP_029) // "Laboratory accessed successfully." + set_stage_flag(STAGEFLAG_ENTERED_LAB) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_path(accuracy, health, recovery, pathid) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(accuracy) \ + set_reaction_speed(35) \ + set_chr_maxdamage(CHR_SELF, health) \ + add_health_or_armor(0) \ + set_recovery_speed(recovery) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + +u8 func0401_start_path00[] = { + init_path(8, 50, 35, 0x00) + endlist +}; + +u8 func0402_start_path01[] = { + init_path(8, 50, 35, 0x01) + endlist +}; + +u8 func0403_start_path02[] = { + init_path(8, 50, 35, 0x02) + endlist +}; + +u8 func0404_start_path03[] = { + init_path(8, 50, 35, 0x03) + endlist +}; + +u8 func0405_start_path04[] = { + init_path(8, 50, 35, 0x04) + endlist +}; + +u8 func0406_start_path05[] = { + init_path(8, 50, 35, 0x05) + endlist +}; + +u8 func0407_start_path06[] = { + init_path(10, 80, 0, 0x06) + endlist +}; + +u8 func0408_start_path07[] = { + init_path(10, 80, 0, 0x07) + endlist +}; + +u8 func0409_start_path08[] = { + init_path(10, 80, 0, 0x08) + endlist +}; + +u8 func040a_start_path09[] = { + init_path(10, 80, 0, 0x09) + endlist +}; + +u8 func040b_start_path10[] = { + init_path(10, 80, 0, 0x0a) + endlist +}; + +u8 func040c_start_path11[] = { + init_path(10, 80, 0, 0x0b) + endlist +}; + +u8 func040d_start_path12[] = { + init_path(10, 80, 0, 0x0c) + endlist +}; + +u8 func040e_start_path13[] = { + init_path(10, 80, 0, 0x0d) + endlist +}; + +u8 func040f_start_path14[] = { + init_path(10, 80, 0, 0x0e) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_LABTECH_RECORDS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH_LIGHTS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH_DOORS1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH_SHOWERS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH_HARRYSMATE, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH_KEYCARDGUY, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_BIOTECH1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_BIOTECH2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_LABTECH_DOORS2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_MECHANIC, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func0411_labtech_showers_agent[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_WALL, /*goto*/ LABEL_2D) + goto_next(LABEL_64) + + label(LABEL_2D) + endloop(0x04) + + beginloop(LABEL_64) + damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) + if_chr_dead(CHR_SELF, /*goto*/ LABEL_2D) + endloop(LABEL_64) + + label(LABEL_2D) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_init_labtech_showers[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_2D) + goto_next(0x06) + + // Agent + label(LABEL_2D) + run_to_pad(PAD_LIP_03AB) + + beginloop(0x08) + if_chr_stopped(/*goto*/ LABEL_2E) + endloop(0x08) + + label(LABEL_2E) + set_ailist(CHR_SELF, AILIST_LABTECH_AGENT) + + // SA and PA + label(0x06) + set_ailist(CHR_SELF, AILIST_LABTECH_SA_PA) + endlist +}; + +u8 func0410_labtech_showers_sa_pa[] = { + set_shotlist(AILIST_LABTECH_SA_PA) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + set_shotlist(GAILIST_IDLE) + set_stage_flag(STAGEFLAG_LABTECH_DEAD) + restart_timer + + beginloop(LABEL_54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + // Injured + label(0x06) + restart_timer + + beginloop(LABEL_55) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_58) + endloop(LABEL_55) + + // Not injured, or recovered + label(LABEL_2D) + stop_chr + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ LABEL_2D) + if_distance_to_target_lt(500, /*goto*/ 0x03) + endloop(0x04) + + // Detected Jo + label(LABEL_2D) + label(0x03) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_56) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + speak(CHR_TARGET, L_LIP_037, MP3_032D, CHANNEL_4, COLOR_08_RED) // "Who are you?" + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ LABEL_64) + + // Wait until seeing Jo with a gun, or Jo has clothes + beginloop(LABEL_64) + if_timer_lt(120, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + if_chr_in_view(/*goto*/ LABEL_53) + label(LABEL_2D) + if_chr_has_object(CHR_TARGET, OBJ_LABCOAT1, /*goto*/ 0x0d) + if_chr_has_object(CHR_TARGET, OBJ_LABCOAT2, /*goto*/ 0x0d) + if_chr_has_object(CHR_TARGET, OBJ_LABCOAT3, /*goto*/ 0x0d) + if_chr_has_object(CHR_TARGET, OBJ_LABCOAT4, /*goto*/ 0x0d) + if_chr_has_object(CHR_TARGET, OBJ_LABCOAT5, /*goto*/ 0x0d) + endloop(LABEL_64) + + // Jo has clothes + label(0x0d) + speak(CHR_TARGET, L_LIP_038, MP3_032E, CHANNEL_4, COLOR_08_RED) // "Hey - you've got my clothes." + restart_timer + + beginloop(0x0e) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(LABEL_53) + + label(LABEL_2D) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + speak(CHR_TARGET, L_LIP_043, MP3_0332, CHANNEL_4, COLOR_08_RED) // "Give me back my clothes - or else!" + restart_timer + + beginloop(0x0f) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(LABEL_53) + + label(LABEL_2D) + if_timer_gt(200, /*goto*/ LABEL_56) + endloop(0x0f) + + label(LABEL_56) + if_chr_in_room(CHR_P1P2, 0x00, 0x00aa, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00a9, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b4, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b5, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b6, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00be, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b7, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b8, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b3, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x009b, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ae, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00af, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b0, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b1, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b2, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00bc, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ab, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00bb, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ba, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b9, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ac, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ad, /*goto*/ LABEL_2D) + goto_next(LABEL_58) + + // Jo is in one of many rooms + label(LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(LABEL_53) + + // Jo is in one of many rooms with nothing equipped - attack her + label(LABEL_2D) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_2D) + speak(CHR_TARGET, L_LIP_044, MP3_0333, CHANNEL_4, COLOR_08_RED) // "Right - you've asked for it!" + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + goto_next(0x06) + + label(LABEL_2D) + call_rng + if_rand_gt(25, /*goto*/ 0x06) + speak(CHR_TARGET, L_LIP_045, MP3_0334, CHANNEL_4, COLOR_08_RED) // "Give me my clothes." + label(0x06) + try_run_to_target(/*goto*/ LABEL_6F) + restart_timer + + beginloop(LABEL_6F) + if_distance_to_target_lt(400, /*goto*/ LABEL_2D) + if_timer_gt(600, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(LABEL_6F) + + label(LABEL_2D) + set_returnlist(CHR_SELF, AILIST_LABTECH_SA_PA) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + + // Chasing Jo for over 10 seconds - do room check again + label(0x06) + goto_first(LABEL_56) + + // Jo in an unknown room + label(LABEL_58) + goto_next(0x06) + + // Tech saw weapon + label(LABEL_53) + chr_do_animation(ANIM_SURPRISED_0202, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + speak(CHR_TARGET, L_LIP_041, SFX_8156, CHANNEL_4, COLOR_08_RED) // "Oh, my God - a gun!" + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + // Jo in an unknown room, or follow through from seeing weapon + label(0x06) + restart_timer + speak(CHR_TARGET, L_LIP_039, MP3_032F, CHANNEL_4, COLOR_08_RED) // "Help - help!" + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x06) + + // No chr in same group - run to pad instead + run_to_pad(PAD_LIP_0121) + + beginloop(0x10) + if_chr_stopped(/*goto*/ LABEL_61) + endloop(0x10) + + label(0x06) + try_run_to_chr(CHR_PRESET, /*goto*/ 0x0b) + + beginloop(0x0b) + if_detected_chr(CHR_PRESET, /*goto*/ LABEL_61) + endloop(0x0b) + + label(LABEL_61) + speak(CHR_TARGET, L_LIP_042, MP3_0331, CHANNEL_4, COLOR_08_RED) // "There's an intruder in the complex." + set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) + increase_squadron_alertness(100) + stop_chr + + beginloop(0x0c) + endloop(0x0c) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_disguise_timer[] = { + beginloop(0x04) + // Pointless check + if_stage_flag_eq(STAGEFLAG_LABTECH_DEAD, TRUE, /*goto*/ LABEL_2D) + label(LABEL_2D) + if_chr_has_object(CHR_BOND, OBJ_LABCOAT1, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_BOND, OBJ_LABCOAT2, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_BOND, OBJ_LABCOAT3, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_BOND, OBJ_LABCOAT4, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_BOND, OBJ_LABCOAT5, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_COOP, OBJ_LABCOAT1, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_COOP, OBJ_LABCOAT2, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_COOP, OBJ_LABCOAT3, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_COOP, OBJ_LABCOAT4, /*goto*/ LABEL_2D) + if_chr_has_object(CHR_COOP, OBJ_LABCOAT5, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + speak(CHR_BOND, L_LIP_046, MP3_02AB, CHANNEL_4, COLOR_09_BLUE) // "I don't have much time!!!" + if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_5D) + if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_5F) + set_countdown_timer(90) + goto_next(LABEL_2D) + + label(LABEL_5D) + set_countdown_timer(180) + goto_next(LABEL_2D) + + label(LABEL_5F) + set_countdown_timer(135) + label(LABEL_2D) + show_countdown_timer + start_countdown_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_ENTERED_LAB, TRUE, /*goto*/ LABEL_2D) + if_countdown_timer_lt(1, /*goto*/ 0x06) +#if VERSION >= VERSION_NTSC_1_0 + if_door_locked(0x4a, 0x40, /*goto*/ LABEL_2E) + goto_next(0x0d) + + label(LABEL_2E) +#endif + endloop(0x08) + +#if VERSION >= VERSION_NTSC_1_0 + // Door unlocked + label(0x0d) +#endif + + // Entered lab + label(LABEL_2D) + stop_countdown_timer + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Timer expired + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + stop_countdown_timer + hide_countdown_timer + restart_timer + label(LABEL_66) + activate_alarm + yield + label(LABEL_2D) +#else + activate_alarm +#endif + + show_hudmsg(CHR_BOND, L_LIP_047) // "The enemy has discovered the disguise." + set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_random_doors[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_DOOR_VIRUS_DOWNLOADED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_object_flag(0x07, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x09, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x0b, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x0d, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x08, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x0a, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x0c, OBJFLAG_CANNOT_ACTIVATE) + set_object_flag(0x0e, OBJFLAG_CANNOT_ACTIVATE) + + beginloop(0x03) + // 55 in 256 chance of doing anything on a given frame + call_rng + if_rand_gt(200, /*goto*/ 0x06) + reloop(0x03) + + label(0x06) + call_rng + if_rand_lt(64, /*goto*/ 0x0a) + if_rand_lt(128, /*goto*/ 0x0c) + if_rand_lt(196, /*goto*/ 0x0e) + + // 25% chance //1 + label(0x08) + if_door_state(0x07, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x09) + open_door(0x07) + open_door(0x08) + reloop(0x03) + + label(0x09) + close_door(0x07) + close_door(0x08) + reloop(0x03) + + // 25% chance //2 + label(0x0a) + if_door_state(0x09, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x0b) + open_door(0x09) + open_door(0x0a) + reloop(0x03) + + label(0x0b) + close_door(0x09) + close_door(0x0a) + reloop(0x03) + + // 25% chance //3 + label(0x0c) + if_door_state(0x0b, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x0d) + open_door(0x0b) + open_door(0x0c) + reloop(0x03) + + label(0x0d) + close_door(0x0b) + close_door(0x0c) + reloop(0x03) + + // 25% chance //4 + label(0x0e) + if_door_state(0x0d, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x0f) + open_door(0x0d) + open_door(0x0e) + reloop(0x03) + + label(0x0f) + close_door(0x0d) + close_door(0x0e) + endloop(0x03) + + endlist +}; + +u8 func0419_init_doorman[] = { + set_accuracy(10) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 1) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_DOORMAN) + endlist +}; + +u8 func0418_doorman[] = { + set_shotlist(GAILIST_ALERTED) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(LABEL_54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + if_has_gun(CHR_SELF, /*goto*/ LABEL_2D) + + // Gun shot out of hand + label(0x06) + increase_squadron_alertness(100) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + + // Waiting for Jo to arrive + label(LABEL_2D) + stop_chr + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x03) + if_distance_to_target_lt(500, /*goto*/ 0x03) + endloop(0x04) + + label(0x03) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + speak(CHR_TARGET, L_LIP_050, SFX_8157, CHANNEL_4, COLOR_08_RED) // "So, you got here at last." + + beginloop(0x0a) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ LABEL_2D) + if_stage_flag_eq(STAGEFLAG_USED_DISGUISE, TRUE, /*goto*/ 0x06) + + // Disguise not used, or uncovered + label(LABEL_2D) + speak(CHR_TARGET, L_LIP_051, SFX_8158, CHANNEL_4, COLOR_08_RED) // "Hey, you're not... SECURITY ALERT!" + restart_timer + stop_chr + + beginloop(0x0b) + if_timer_lt(120, /*goto*/ LABEL_2D) + endloop(0x0b) + + label(LABEL_2D) + set_stage_flag(STAGEFLAG_DOORMAN_REJECTED) + show_hudmsg(CHR_TARGET, L_LIP_057) // "Cannot gain access to autopsy lab." + goto_next(LABEL_64) + + // Disguised + label(0x06) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_59) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_59) + + // Jo has gun equipped + label(LABEL_2D) + speak(CHR_TARGET, L_LIP_052, SFX_8159, CHANNEL_4, COLOR_08_RED) // "No guns allowed in here - put your weapon away." + restart_timer + + beginloop(0x0c) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_59) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_59) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + speak(CHR_TARGET, L_LIP_053, SFX_815A, CHANNEL_4, COLOR_08_RED) // "I won't tell you again - lose the weapon." + restart_timer + + beginloop(0x0d) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_59) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_59) + if_timer_gt(600, /*goto*/ 0x06) + endloop(0x0d) + +#if VERSION >= VERSION_NTSC_1_0 + label(0x1b) +#endif + label(0x06) + speak(CHR_TARGET, L_LIP_054, SFX_815B, CHANNEL_4, COLOR_08_RED) // "Right - I'm calling security." + restart_timer + label(0x10) + set_stage_flag(STAGEFLAG_DOORMAN_REJECTED) + show_hudmsg(CHR_TARGET, L_LIP_057) // "Cannot gain access to autopsy lab." + goto_next(LABEL_64) + + // Jo disguised and unarmed + label(LABEL_59) + speak(CHR_TARGET, L_LIP_055, SFX_815C, CHANNEL_4, COLOR_08_RED) // "Everyone's been waiting for you..." + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + +#if VERSION >= VERSION_NTSC_1_0 + label(0x06) + if_alarm_active(/*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + goto_first(0x1b) +#endif + + // Unlocking + label(0x06) + unset_object_flag2(0x4a, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x4b, OBJFLAG2_AICANNOTUSE) + unlock_door(0x4a, 0x40) + unlock_door(0x4b, 0x40) + open_door(0x4a) + open_door(0x4b) + + beginloop(0x0f) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x06) + if_saw_injury(0x00, /*goto*/ 0x06) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + if_door_state(0x4a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ LABEL_2D) + reloop(0x0f) + + label(LABEL_2D) + open_door(0x4a) + open_door(0x4b) + endloop(0x0f) + + label(0x06) + increase_squadron_alertness(100) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(LABEL_64) + yield + goto_first(LABEL_64) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_doorman_dead[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_deadish(CHR_DOORMAN, /*goto*/ LABEL_2D) + reloop(0x04) + + label(LABEL_2D) + if_chr_has_object(CHR_BOND, 0x06, /*goto*/ 0x0d) + if_chr_has_object(CHR_COOP, 0x06, /*goto*/ 0x0d) + if_door_locked(0x4a, 0x40, /*goto*/ LABEL_2D) + goto_next(0x0d) + + label(LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x0083, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0084, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0085, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0086, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0087, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0088, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x0089, /*goto*/ 0x06) + if_chr_in_room(CHR_BOND, 0x00, 0x008a, /*goto*/ 0x06) + show_hudmsg(CHR_P1P2, L_LIP_056) // "Critical mission personnel killed." + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ LABEL_2D) + endloop(0x08) + + label(LABEL_2D) + show_hudmsg(CHR_P1P2, L_LIP_057) // "Cannot gain access to autopsy lab." + restart_timer + set_stage_flag(STAGEFLAG_DOORMAN_DEAD) + + beginloop(0x09) + if_timer_gt(120, /*goto*/ LABEL_2D) + endloop(0x09) + + label(LABEL_2D) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x06) + endloop(0x04) + + endlist +}; + +/** + * The lab guy who stands in the room behind the doorman. + */ +u8 func041a_labtech_harrysmate[] = { + set_shotlist(AILIST_LABTECH_HARRYSMATE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(LABEL_54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + restart_timer + + beginloop(LABEL_55) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_58) + endloop(LABEL_55) + + label(LABEL_58) + goto_next(LABEL_5A) + + label(LABEL_2D) + stop_chr + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_in_room(CHR_P1P2, 0x00, 0x0083, /*goto*/ 0x08) + endloop(0x04) + + beginloop(0x08) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_2D) + if_target_in_sight(/*goto*/ LABEL_2D) + if_distance_to_target_lt(500, /*goto*/ LABEL_2D) + endloop(0x08) + + label(LABEL_2D) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + speak(CHR_TARGET, L_LIP_058, MP3_02BB, CHANNEL_4, COLOR_08_RED) // "Hey, that's not Harry. It's an intruder." + increase_squadron_alertness(120) + restart_timer + chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + run_to_pad(PAD_LIP_011E) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ LABEL_5A) + endloop(0x0b) + + label(LABEL_5A) + chr_do_animation(ANIM_DRAW_PISTOL_0288, 0, -1, 0, 16, CHR_SELF, 2) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + try_equip_weapon(MODEL_CHRDRUGGUN, WEAPON_TRANQUILIZER, 0x10000000, /*goto*/ 0x06) + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func041b_labtech_keycardguy[] = { + set_shotlist(AILIST_LABTECH_KEYCARDGUY) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + // Dying + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(LABEL_54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x08) + + // Injured + label(0x06) + restart_timer + + beginloop(LABEL_55) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_58) + endloop(LABEL_55) + + label(LABEL_58) + goto_next(LABEL_5A) + + // Not injured, or recovered + // Waiting to detect Jo + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ LABEL_2D) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_2D) + endloop(0x08) + + // Detected + label(LABEL_2D) + jog_to_pad(PAD_LIP_011B) + + beginloop(0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_LIP_011B, /*goto*/ LABEL_2D) + endloop(0x08) + + label(LABEL_2D) + restart_timer + chr_do_animation(ANIM_SURRENDER_002E, 0, 190, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x09) + if_timer_gt(60, /*goto*/ 0x06) + reloop(0x09) + + label(0x06) + set_stage_flag(STAGEFLAG_KEYCARDGUY_ANGRY) + if_chr_stopped(/*goto*/ LABEL_5A) + endloop(0x09) + + label(LABEL_5A) + chr_do_animation(ANIM_DRAW_PISTOL_0288, 0, -1, 0, 16, CHR_SELF, 2) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + try_equip_weapon(MODEL_CHRDRUGGUN, WEAPON_TRANQUILIZER, 0x10000000, /*goto*/ 0x06) + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func100c_keycardguy_lights[] = { + set_lights_state(0x0088, LIGHTOP_1, 0x00, 0x00, 0x00) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_KEYCARDGUY_ANGRY, TRUE, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + set_lights_state(0x0088, LIGHTOP_1, 0x64, 0x00, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100d_check_entered_lab[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0083, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0084, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0085, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0086, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0087, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0089, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x008a, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_ENTERED_LAB) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_elvis_timer[] = { + beginloop(0x04) + if_door_state(0x13, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_ENTERED_ELVIS_AREA) + play_x_track(XREASON_DEFAULT, 10, 60) + set_countdown_timer(60) + show_countdown_timer + start_countdown_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_RESCUED_ELVIS, TRUE, /*goto*/ LABEL_2D) + if_countdown_timer_lt(1, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + stop_countdown_timer + hide_countdown_timer + set_stage_flag(STAGEFLAG_ELVIS_DEAD) + show_hudmsg(CHR_BOND, L_LIP_064) // "Elvis has been killed." + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + stop_countdown_timer + hide_countdown_timer + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_check_end_level[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_LIP_02A1, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_RESCUED_ELVIS) + yield + yield + if_all_objectives_complete(/*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + set_invincible(CHR_BOND) + revoke_control(CHR_BOND, 4) + hide_countdown_timer + stop_countdown_timer + restart_timer + + beginloop(LABEL_5C) + if_chr_deadish(CHR_BOND, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + if_chr_deadish(CHR_COOP, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_ailist(CHR_SELF, AILIST_OUTRO) + if_timer_gt(280, /*goto*/ LABEL_5B) + endloop(LABEL_5C) + + label(LABEL_5B) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_give_keycard[] = { + set_chr_chrflag(0x23, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x24, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x25, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x26, CHRCFLAG_KILLCOUNTABLE) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ONE_KEYCARD_GUARD_REMAINING, TRUE, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + label(LABEL_2D) + if_chr_deadish(0x23, /*goto*/ 0x06) + give_object_to_chr(0x10, 0x23) + goto_next(LABEL_2D) + + label(0x06) + if_chr_deadish(0x24, /*goto*/ 0x06) + give_object_to_chr(0x10, 0x24) + goto_next(LABEL_2D) + + label(0x06) + if_chr_deadish(0x25, /*goto*/ 0x06) + give_object_to_chr(0x10, 0x25) + goto_next(LABEL_2D) + + label(0x06) + if_chr_deadish(0x26, /*goto*/ LABEL_2D) + + label(LABEL_2D) + unset_object_flag2(0x10, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0414_init_mechanic[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_MECHANIC) + endlist +}; + +u8 func0413_mechanic[] = { + set_shotlist(AILIST_MECHANIC) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + restart_timer + + beginloop(LABEL_54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + // Injured + label(0x06) + restart_timer + + beginloop(LABEL_55) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_58) + endloop(LABEL_55) + + // Main logic + label(LABEL_2D) + stop_chr + + // Wait for player to attempt to open door + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x0a) + if_chr_activated_object(CHR_P1P2, 0x14, /*goto*/ LABEL_2D) + if_chr_activated_object(CHR_P1P2, 0x15, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + restart_timer + + beginloop(0x0d) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + unlock_door(0x14, 0x10) + unlock_door(0x15, 0x10) + open_door(0x14) + open_door(0x15) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + restart_timer + + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + speak(CHR_BOND, L_LIP_065, SFX_M0_GET_THE_HELL_OUT_OF_HERE, CHANNEL_4, COLOR_08_RED) // "Get the hell out of here!" + restart_timer + chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(LABEL_64) + if_timer_gt(120, /*goto*/ LABEL_2D) + endloop(LABEL_64) + + label(LABEL_58) + label(LABEL_2D) + run_to_pad(PAD_LIP_01BA) + + beginloop(0x0e) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + label(0x0f) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(LABEL_8A) + if_chr_stopped(/*goto*/ LABEL_2D) + endloop(LABEL_8A) + + label(LABEL_2D) + goto_first(0x0f) + + endlist +}; + +u8 func1011_unhide_warehouse_spawner[] = { + // Wait until player near second elevator + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x00f8, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00f7, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00f6, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00f4, /*goto*/ 0x06) + endloop(0x04) + + // Unhide a guy at the top of the ramp near the start + label(0x06) + unset_chr_chrflag(0x44, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x44, CHRCFLAG_INVINCIBLE) + set_ailist(0x44, AILIST_WAREHOUSE_SPAWNER) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_warehouse_spawner[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x08) + if_chr_in_room(CHR_TARGET, 0x00, 0x00f8, /*goto*/ 0x08) + if_chr_in_room(CHR_TARGET, 0x00, 0x00f7, /*goto*/ 0x08) + if_chr_in_room(CHR_TARGET, 0x00, 0x00f6, /*goto*/ 0x08) + if_chr_in_room(CHR_TARGET, 0x00, 0x00f4, /*goto*/ 0x08) + reloop(0x04) + + label(0x08) + + label(LABEL_2D) + if_never_been_onscreen(/*goto*/ LABEL_4E) + if_can_see_target(/*goto*/ 0x08) + reloop(0x04) + + label(0x08) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(LABEL_4E) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ LABEL_4E) + reloop(0x04) + + label(LABEL_4E) + try_spawn_clone2(CHR_SELF, AILIST_WAREHOUSE_CLONE, 0, /*goto*/ LABEL_2D) + reloop(0x04) + + label(LABEL_2D) + restart_timer + yield + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0417_warehouse_clone[] = { + set_target_chr(CHR_BOND) + set_alertness(100) + try_run_to_target(/*goto*/ LABEL_2D) + label(LABEL_2D) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1013_check_chamber_switch_destroyed[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + beginloop(0x04) + if_object_in_good_condition(OBJ_CHAMBER1_SWITCH, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_CHAMBER1_RAISED, TRUE, /*goto*/ LABEL_2D) + show_hudmsg(CHR_BOND, L_LIP_068) // "Mission critical equipment destroyed." + set_stage_flag(STAGEFLAG_CHAMBER_SWITCH_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + reloop(0x04) + + label(0x06) + endloop(0x04) + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_check_crate_destroyed[] = { + // The unsetting of the wall's IMMUNE_TO_EXPLOSIVES flag suggests that the + // wall was originally intended to only be blown up via the crate. This must + // have been changed at some point, but the unsetting of the flag remains. + beginloop(0x04) + if_object_in_good_condition(OBJ_CRATE, /*goto*/ 0x06) + unset_object_flag(OBJ_WALL, OBJFLAG_INVINCIBLE) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + if_object_in_good_condition(OBJ_WALL, /*goto*/ LABEL_2D) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + show_hudmsg(CHR_BOND, L_LIP_068) // "Mission critical equipment destroyed." + set_stage_flag(STAGEFLAG_CRATE_DESTROYED) + + beginloop(0x08) + if_object_in_good_condition(OBJ_WALL, /*goto*/ LABEL_2D) + goto_next(LABEL_2E) + + label(LABEL_2D) + endloop(0x08) + + label(LABEL_2E) + unset_stage_flag(STAGEFLAG_CRATE_DESTROYED) + show_hudmsg(CHR_BOND, L_LIP_089) // "Alternative entrance to medlabs created." + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + endloop(0x04) + + endlist +}; + +/** + * @unused + */ +u8 func041c_unused_041c[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func041d_unused_041d[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func041e_unused_041e[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_check_undisguised[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ 0x06) + if_chr_dead(CHR_LABTECH_HARRYSMATE, /*goto*/ 0x06) + if_chr_dead(CHR_LABTECH_KEYCARDGUY, /*goto*/ 0x06) + if_chr_dead(CHR_DOORMAN, /*goto*/ 0x06) + if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + unset_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041f_labtech_lights[] = { + set_shotlist(AILIST_LABTECH_LIGHTS) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + restart_timer + + beginloop(LABEL_54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_5E) + + label(0x06) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + restart_timer + + beginloop(LABEL_55) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_5E) + endloop(LABEL_55) + + label(LABEL_5E) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_53) + call_rng + if_rand_lt(86, /*goto*/ LABEL_69) + if_rand_lt(172, /*goto*/ LABEL_6A) + chr_do_animation(ANIM_SITTING_DORMANT, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + + label(LABEL_69) + chr_do_animation(ANIM_SITTING_DORMANT, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + + label(LABEL_6A) + chr_do_animation(ANIM_SITTING_DORMANT, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_53) + if_target_in_sight(/*goto*/ 0x03) + if_chr_idle(/*goto*/ 0x06) + goto_first(LABEL_5E) + + label(0x06) + endloop(0x04) + + // Jo in sight + label(0x03) + object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_53) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) + label(0x06) + object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) + speak(CHR_TARGET, L_LIP_037, SFX_SCI_WHO_THE_HELL_ARE_YOU, CHANNEL_4, COLOR_08_RED) // "Who are you?" + +#if VERSION >= VERSION_JPN_FINAL + label(LABEL_68) + if_sound_finished(CHANNEL_4, /*goto*/ 0x06) + yield + goto_first(LABEL_68) + + label(0x06) +#endif + + goto_next(0x06) + + label(LABEL_2D) + speak(CHR_TARGET, L_LIP_083, MP3_027F, CHANNEL_4, COLOR_08_RED) // "Should you be in here?" + restart_timer + do_preset_animation(PRESETANIM_TALKRANDOM) + + beginloop(LABEL_64) + if_sound_finished(CHANNEL_4, /*goto*/ 0x06) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + label(LABEL_2D) + endloop(LABEL_64) + + label(0x06) + stop_chr + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x0c) + label(0x06) + speak(CHR_TARGET, L_LIP_082, MP3_SCI_LEAVE_THIS_AREA, CHANNEL_4, COLOR_08_RED) // "Leave this area now." + restart_timer + do_preset_animation(PRESETANIM_TALKRANDOM) + + beginloop(LABEL_66) + if_sound_finished(CHANNEL_4, /*goto*/ LABEL_53) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + label(LABEL_2D) + endloop(LABEL_66) + + label(LABEL_53) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + + label(0x0a) + set_target_chr(CHR_BOND) + restart_timer + try_run_to_target(/*goto*/ 0x0b) + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x06) + if_distance_to_target_lt(400, /*goto*/ LABEL_2D) + endloop(0x0b) + + label(0x06) + goto_first(0x0a) + + label(LABEL_2D) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + set_returnlist(CHR_SELF, AILIST_LABTECH_LIGHTS) + set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) + + label(0x0c) + walk_to_pad(PAD_LIP_020D) + + beginloop(0x0d) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ LABEL_2D) + if_saw_injury(0x00, /*goto*/ 0x0f) + label(LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(0x0f) + + label(LABEL_2D) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + set_self_chrflag(CHRCFLAG_CANFACEWALL) + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_0428, /*goto*/ LABEL_6E) + + beginloop(LABEL_6E) + if_timer_gt(120, /*goto*/ LABEL_6F) + if_chr_stopped(/*goto*/ LABEL_6F) + endloop(LABEL_6E) + + label(LABEL_6F) + call_rng + if_rand_lt(86, /*goto*/ LABEL_64) + if_rand_lt(172, /*goto*/ LABEL_66) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x0e) + + label(LABEL_64) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x0e) + + label(LABEL_66) + chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x0e) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ LABEL_2D) + if_saw_injury(0x00, /*goto*/ 0x0f) + label(LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(0x0f) + + label(LABEL_2D) + if_chr_idle(/*goto*/ LABEL_2E) + goto_first(LABEL_6F) + + label(LABEL_2E) + endloop(0x0e) + + label(0x0f) + speak(CHR_TARGET, L_LIP_084, SFX_M1_HOLY, CHANNEL_4, COLOR_08_RED) // "Holy..." + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + chr_do_animation(ANIM_SURPRISED_0202, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + restart_timer + + beginloop(0x10) + if_timer_gt(60, /*goto*/ LABEL_2D) + endloop(0x10) + + label(LABEL_2D) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + goto_first(LABEL_53) + + endlist +}; + +u8 func0421_init_labtech_doors[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_LABTECH_DOORS) + endlist +}; + +u8 func0420_labtech_doors[] = { + set_self_chrflag(CHRCFLAG_CANFACEWALL) + set_shotlist(AILIST_LABTECH_DOORS) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_5E) + + label(0x06) + restart_timer + + beginloop(LABEL_55) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_5E) + endloop(LABEL_55) + + label(LABEL_5E) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(LABEL_6F) + + label(LABEL_64) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(LABEL_6F) + + label(LABEL_66) + chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + label(LABEL_6F) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + set_target_chr(CHR_BOND) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) + label(0x06) + goto_next(LABEL_2E) + + label(LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2E) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2E) + if_self_flag_bankx_eq(CHRFLAG0_COVER_TYPE2, TRUE, BANK_0, /*goto*/ 0x06) + label(LABEL_2E) + if_can_see_target(/*goto*/ 0x03) + label(0x06) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) + if_saw_injury(0x00, /*goto*/ 0x03) + if_saw_death(0x00, /*goto*/ 0x03) + if_chr_idle(/*goto*/ LABEL_2D) + goto_first(LABEL_5E) + + label(LABEL_2D) + endloop(0x04) + + label(0x03) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_saw_injury(0x00, /*goto*/ LABEL_89) + if_saw_death(0x00, /*goto*/ LABEL_89) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) + label(0x06) + goto_next(0x06) + + label(LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + do_preset_animation(PRESETANIM_TALK3) + say_quip(CHR_BOND, QUIP_GREETING, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_COVER_TYPE2, BANK_0) + + beginloop(LABEL_7B) + if_saw_injury(0x00, /*goto*/ LABEL_89) + if_saw_death(0x00, /*goto*/ LABEL_89) + if_chr_not_talking(CHR_SELF, /*goto*/ LABEL_2D) + endloop(LABEL_7B) + + label(LABEL_2D) + stop_chr + goto_first(LABEL_5E) + + label(LABEL_89) + label(0x06) + increase_squadron_alertness(100) + + beginloop(LABEL_83) + if_sound_finished(CHANNEL_4, /*goto*/ LABEL_2D) + endloop(LABEL_83) + + label(LABEL_2D) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_2E) + speak(CHR_BOND, L_LIP_085, MP3_M0_ITS_A_SPY, CHANNEL_4, COLOR_08_RED) // "It's a spy!" + goto_next(LABEL_2D) + + label(LABEL_2E) + speak(CHR_BOND, L_LIP_087, MP3_M0_IMPOSTER, CHANNEL_4, COLOR_08_RED) // "Imposter!" + label(LABEL_2D) + label(0x06) + go_to_target_pad(GOPOSFLAG_JOG) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + restart_timer + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_2D) + try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_03C6, /*goto*/ LABEL_70) + label(LABEL_2D) + try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_03C7, /*goto*/ LABEL_70) + + beginloop(LABEL_70) + if_timer_gt(30, /*goto*/ LABEL_2D) + endloop(LABEL_70) + + label(LABEL_2D) + chr_do_animation(ANIM_OPERATE_0221, -1, 120, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + restart_timer + + beginloop(LABEL_71) + if_timer_gt(120, /*goto*/ LABEL_2D) + if_timer_lt(60, /*goto*/ LABEL_2D) + if_stage_flag_eq(STAGEFLAG_AUTOGUN_ACTIVATED, TRUE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_AUTOGUN_VIRUS_DONE, TRUE, /*goto*/ LABEL_2D) + set_stage_flag(STAGEFLAG_AUTOGUN_ACTIVATED) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_75) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, 0x3c, TRUE) + goto_next(LABEL_2D) + + label(LABEL_75) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, 0x3d, TRUE) + label(LABEL_2D) + endloop(LABEL_71) + + label(0x06) + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_0107, /*goto*/ LABEL_73) + + beginloop(LABEL_73) + if_timer_gt(30, /*goto*/ 0x06) + endloop(LABEL_73) + + label(0x06) + label(0x10) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(LABEL_77) + if_chr_stopped(/*goto*/ LABEL_2D) + endloop(LABEL_77) + + label(LABEL_2D) + goto_first(0x10) + + endlist +}; + +u8 func1017_activate_autogun[] = { + set_object_flag(OBJ_AUTOGUN, OBJFLAG_DEACTIVATED) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_AUTOGUN_ACTIVATED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + if_object_in_good_condition(OBJ_AUTOGUN, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + unset_object_flag(OBJ_AUTOGUN, OBJFLAG_DEACTIVATED) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0423_init_labtech_records[] = { + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_LABTECH_RECORDS) + endlist +}; + +u8 func0422_labtech_records[] = { + set_shotlist(AILIST_LABTECH_RECORDS) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_2D) + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + label(LABEL_54) + yield + if_timer_gt(15, /*goto*/ 0x06) + goto_first(LABEL_54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(LABEL_2D) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(LABEL_5E) + label(0x06) + restart_timer + label(LABEL_55) + yield + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ LABEL_5E) + goto_first(LABEL_55) + + label(LABEL_5E) + call_rng + if_rand_lt(32, /*goto*/ LABEL_64) + if_rand_lt(64, /*goto*/ LABEL_66) + if_rand_lt(96, /*goto*/ LABEL_68) + if_rand_lt(128, /*goto*/ LABEL_69) + if_rand_lt(160, /*goto*/ LABEL_6A) + if_rand_lt(192, /*goto*/ LABEL_6B) + if_rand_lt(224, /*goto*/ LABEL_6C) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_64) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_66) + chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_68) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_69) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_6A) + chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_6B) + chr_do_animation(ANIM_023A, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x04) + label(LABEL_6C) + chr_do_animation(ANIM_HEAD_ROLL, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + + beginloop(0x04) + if_chr_idle(/*goto*/ LABEL_2D) + goto_first(LABEL_5E) + + label(LABEL_2D) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x03) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) + if_distance_to_target_lt(500, /*goto*/ 0x03) + reloop(0x04) + + label(0x03) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) + if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + label(0x06) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_2D) + increase_squadron_alertness(100) + speak(CHR_TARGET, L_LIP_087, MP3_M0_IMPOSTER, CHANNEL_4, COLOR_08_RED) // "Imposter!" + chr_do_animation(ANIM_SURPRISED_0202, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + restart_timer + + beginloop(LABEL_79) + if_timer_gt(90, /*goto*/ LABEL_2D) + endloop(LABEL_79) + + label(LABEL_2D) + speak(CHR_TARGET, L_LIP_086, SFX_M1_WARN_THE_OTHERS, CHANNEL_4, COLOR_08_RED) // "Warn the others..." + label(LABEL_2D) + label(0x06) + run_to_pad(PAD_LIP_0108) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + label(0x10) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x0e) + if_chr_stopped(/*goto*/ LABEL_2D) + endloop(0x0e) + + label(LABEL_2D) + goto_first(0x10) + + endlist +}; + +/** + * Chambers are actually lifts. They must be disabled so they don't continuously + * go up and down. + */ +u8 func1018_disable_chambers[] = { + set_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER3, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER4, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER5, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER6, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER7, OBJFLAG_DEACTIVATED) + set_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +// This macro is here is reduce the amount of duplicate code. However, each +// chamber's code is not entirely consistant, hence why it's not used by all +// chambers. +#define chamber_logic(switch, chamber, stageflag) \ + /* Wait for player to activate chamber switch */ \ + beginloop(0x04) \ + chr_toggle_p1p2(CHR_SELF) \ + if_chr_activated_object(CHR_P1P2, switch, /*goto*/ 0x06) \ + reloop(0x04) \ + \ + label(0x06) \ + if_stage_flag_eq(stageflag, TRUE, /*goto*/ LABEL_2D) \ + mute_channel(CHANNEL_0) \ + \ + /* Raising chamber */ \ + assign_sound(SFX_DOOR_042B, CHANNEL_0) \ + control_sound_from_object(CHANNEL_0, chamber, TRUE) \ + assign_sound(SFX_043A, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, switch, TRUE) \ + show_hudmsg(CHR_P1P2, 0x2a42) /* "Containment unit raised up." */ \ + set_object_image(switch, 0, TVCMDLIST_13) \ + unset_object_flag(chamber, OBJFLAG_DEACTIVATED) \ + set_stage_flag(stageflag) \ + restart_timer \ + \ + beginloop(0x08) \ + if_timer_gt(200, /*goto*/ 0x06) \ + endloop(0x08) \ + \ + label(0x06) \ + mute_channel(CHANNEL_0) \ + assign_sound(SFX_DOOR_042C, CHANNEL_0) \ + control_sound_from_object(CHANNEL_0, chamber, TRUE) \ + set_object_flag(chamber, OBJFLAG_DEACTIVATED) \ + reloop(0x04) \ + \ + /* Lowering chamber */ \ + label(LABEL_2D) \ + mute_channel(CHANNEL_0) \ + assign_sound(SFX_DOOR_042B, CHANNEL_0) \ + control_sound_from_object(CHANNEL_0, chamber, TRUE) \ + assign_sound(SFX_043A, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, switch, TRUE) \ + show_hudmsg(CHR_P1P2, 0x2a43) /* "Containment unit lowered down." */ \ + set_object_image(switch, 0, TVCMDLIST_12) \ + unset_object_flag(chamber, OBJFLAG_DEACTIVATED) \ + unset_stage_flag(stageflag) \ + restart_timer \ + \ + beginloop(0x09) \ + if_timer_gt(200, /*goto*/ 0x06) \ + endloop(0x09) \ + \ + label(0x06) \ + mute_channel(CHANNEL_0) \ + assign_sound(SFX_DOOR_042C, CHANNEL_0) \ + control_sound_from_object(CHANNEL_0, chamber, TRUE) \ + set_object_flag(chamber, OBJFLAG_DEACTIVATED) \ + endloop(0x04) + +/** + * This chamber has the alien in it. + */ +u8 func1019_chamber1[] = { + // Wait for player to activate chamber switch + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_CHAMBER1_SWITCH, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_CHAMBER1_RAISED, TRUE, /*goto*/ LABEL_2D) + mute_channel(CHANNEL_0) + + // Raising chamber + assign_sound(SFX_DOOR_042B, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_CHAMBER1_SWITCH, TRUE) + set_object_image(OBJ_CHAMBER1_SWITCH, 0, TVCMDLIST_13) + show_hudmsg(CHR_P1P2, L_LIP_066) // "Containment unit raised up." + unset_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) + set_stage_flag(STAGEFLAG_CHAMBER1_RAISED) + restart_timer + + beginloop(0x08) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042C, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) + set_chr_hiddenflag(CHR_ALIEN, CHRHFLAG_00100000) + + beginloop(LABEL_64) + chr_move_to_pad(CHR_ALIEN, PAD_LIP_03CA, 0x01, /*goto*/ 0x06) + endloop(LABEL_64) + + label(0x06) + yield + unset_chr_chrflag(CHR_ALIEN, CHRCFLAG_HIDDEN) + set_ailist(CHR_ALIEN, AILIST_CHECK_LOOKING_AT_ALIEN) + label(0x06) + set_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) + reloop(0x04) + + // Lowering chamber + label(LABEL_2D) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042B, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) + set_chr_chrflag(CHR_ALIEN, CHRCFLAG_HIDDEN) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_CHAMBER1_SWITCH, TRUE) + set_object_image(OBJ_CHAMBER1_SWITCH, 0, TVCMDLIST_12) + show_hudmsg(CHR_P1P2, L_LIP_067) // "Containment unit lowered down." + unset_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) + unset_stage_flag(STAGEFLAG_CHAMBER1_RAISED) + restart_timer + + beginloop(0x09) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042C, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) + set_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) + endloop(0x04) + endlist +}; + +u8 func101a_chamber2[] = { + // Wait for player to activate chamber switch + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_CHAMBER2_SWITCH, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + mute_channel(CHANNEL_0) + if_stage_flag_eq(STAGEFLAG_CHAMBER2_RAISED, TRUE, /*goto*/ LABEL_2D) + + // Raising chamber + assign_sound(SFX_DOOR_042B, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_CHAMBER2_SWITCH, TRUE) + set_object_image(OBJ_CHAMBER2_SWITCH, 0, TVCMDLIST_13) + show_hudmsg(CHR_P1P2, L_LIP_066) // "Containment unit raised up." + unset_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) + set_stage_flag(STAGEFLAG_CHAMBER2_RAISED) + restart_timer + + beginloop(0x08) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042C, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) + + set_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) + reloop(0x04) + + // Lowering chamber + label(LABEL_2D) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042B, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_CHAMBER2_SWITCH, TRUE) + set_object_image(OBJ_CHAMBER2_SWITCH, 0, TVCMDLIST_12) + show_hudmsg(CHR_P1P2, L_LIP_067) // "Containment unit lowered down." + unset_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) + unset_stage_flag(STAGEFLAG_CHAMBER2_RAISED) + restart_timer + + beginloop(0x09) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042C, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) + set_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) + endloop(0x04) + endlist +}; + +u8 func101b_chamber3[] = { + chamber_logic(OBJ_CHAMBER3_SWITCH, OBJ_CHAMBER3, STAGEFLAG_CHAMBER3_RAISED) + endlist +}; + +u8 func101c_chamber4[] = { + chamber_logic(OBJ_CHAMBER4_SWITCH, OBJ_CHAMBER4, STAGEFLAG_CHAMBER4_RAISED) + endlist +}; + +u8 func101d_chamber5[] = { + chamber_logic(OBJ_CHAMBER5_SWITCH, OBJ_CHAMBER5, STAGEFLAG_CHAMBER5_RAISED) + endlist +}; + +u8 func101e_chamber6[] = { + chamber_logic(OBJ_CHAMBER6_SWITCH, OBJ_CHAMBER6, STAGEFLAG_CHAMBER6_RAISED) + endlist +}; + +u8 func101f_chamber7[] = { + chamber_logic(OBJ_CHAMBER7_SWITCH, OBJ_CHAMBER7, STAGEFLAG_CHAMBER7_RAISED) + endlist +}; + +u8 func1020_chamber8[] = { + // Wait for player to activate chamber switch + beginloop(0x04) + // Likely @bug: Chamber 8 is the only chamber that doesn't call + // chr_toggle_p1p2 here. + // Co-op player might not be able to activate chamber 8. + if_chr_activated_object(CHR_P1P2, OBJ_CHAMBER8_SWITCH, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_CHAMBER8_RAISED, TRUE, /*goto*/ LABEL_2D) + mute_channel(CHANNEL_0) + + // Raising chamber + assign_sound(SFX_DOOR_042B, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_CHAMBER8_SWITCH, TRUE) + show_hudmsg(CHR_P1P2, L_LIP_066) // "Containment unit raised up." + set_object_image(OBJ_CHAMBER8_SWITCH, 0, TVCMDLIST_13) + unset_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) + set_stage_flag(STAGEFLAG_CHAMBER8_RAISED) + restart_timer + + beginloop(0x08) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042C, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) + + set_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) + reloop(0x04) + + // Lowering chamber + label(LABEL_2D) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042B, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) + + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_CHAMBER8_SWITCH, TRUE) + show_hudmsg(CHR_P1P2, L_LIP_067) // "Containment unit lowered down." + set_object_image(OBJ_CHAMBER8_SWITCH, 0, TVCMDLIST_12) + unset_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) + unset_stage_flag(STAGEFLAG_CHAMBER8_RAISED) + restart_timer + + beginloop(0x09) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + mute_channel(CHANNEL_0) + assign_sound(SFX_DOOR_042C, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) + set_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) + endloop(0x04) + endlist +}; + +u8 func0424_alien[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, AILIST_CHECK_LOOKING_AT_ALIEN) + endlist +}; + +/** + * Guy that's hidden near the start. He starts sending out clones once you reach + * the second elevator. + */ +u8 func0425_hiddenguy[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0426_check_looking_at_alien[] = { + beginloop(0x04) + set_target_chr(CHR_BOND) + if_self_has_chrflag(CHRCFLAG_HIDDEN, /*goto*/ LABEL_61) + if_distance_to_target_lt(300, /*goto*/ LABEL_64) + goto_next(LABEL_66) + + // Jo is in range + label(LABEL_64) + if_within_targets_fovx_by_angle(10, /*goto*/ LABEL_2D) + + // Jo is too far away or not looking at alien + label(LABEL_66) + set_target_chr(CHR_COOP) + if_distance_to_target_lt(300, /*goto*/ LABEL_68) + goto_next(LABEL_69) + + // Velvet is in range + label(LABEL_68) + if_within_targets_fovx_by_angle(10, /*goto*/ LABEL_2D) + + // Both players are too far away + label(LABEL_69) + + // Alien is lowered/hidden + label(LABEL_61) + unset_stage_flag(STAGEFLAG_LOOKING_AT_CHAMBER) + reloop(0x04) + + label(LABEL_2D) + set_stage_flag(STAGEFLAG_LOOKING_AT_CHAMBER) + endloop(0x04) + + endlist +}; + +u8 func1021_xray_scanning[] = { + beginloop(0x04) + // @bug? In co-op, the player wearing the xray may be the player who is + // not looking at the alien. + chr_toggle_p1p2(CHR_SELF) + if_player_using_device(CHR_P1P2, WEAPON_XRAYSCANNER, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_LOOKING_AT_CHAMBER, TRUE, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LIP_074) // "Scanner target acquired." + restart_timer + + beginloop(0x08) + if_timer_gt(240, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_LOOKING_AT_CHAMBER, FALSE, /*goto*/ LABEL_2D) + endloop(0x08) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LIP_075) // "Target ID confirmed - XT origin." + set_stage_flag(STAGEFLAG_XRAY_DONE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + show_hudmsg(CHR_P1P2, L_LIP_076) // "Scanner lock lost." + endloop(0x04) + + endlist +}; + +/** + * Waits until the player has been in the xray area for over 10 seconds, then + * spawns a dataDyne shock trooper. + * + * Rare may have decided that it was too challenging to have a guard attack you + * while xraying, hence removed the guard but left this function. + */ +u8 unregistered_function1[] = { + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_timer_gt(600, /*goto*/ 0x08) + pause_timer + if_chr_in_room(CHR_P1P2, 0x00, 0x010d, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0102, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0103, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0104, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0105, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0106, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0107, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0108, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0109, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x010c, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fa, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fb, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fc, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fd, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fe, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ff, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0100, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0101, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + resume_timer + reloop(0x04) + + // 10 seconds passed + label(0x08) + if_chr_death_animation_finished(0x46, /*goto*/ LABEL_2D) + reloop(0x04) + + label(LABEL_2D) + try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_DDSHOCK, PAD_LIP_0101, 0x0427, SPAWNFLAG_00000200, /*goto*/ 0x06) + goto_next(LABEL_2D) + + label(0x06) + restart_timer + reloop(0x04) + + label(LABEL_2D) + endloop(0x04) + + endlist +}; + +/** + * Assigned by the above, which is an unregistered function. + * + * Makes the shock trooper run to one of two xray rooms, depending on which one + * you're in. + * + * @unused + */ +u8 func0427_shock_clone[] = { + stop_chr + set_chr_id(0x46) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x10000000, /*goto*/ 0x04) + + label(0x04) + yield + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x010d, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0102, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0103, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0104, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0105, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0106, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0107, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0108, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0109, /*goto*/ 0x06) + run_to_pad(PAD_LIP_0184) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + label(0x06) + run_to_pad(PAD_LIP_013B) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1023_setup_door_locks[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) + + // PA + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Agent - lock big door at bottom of ramp near showers + label(0x06) + lock_door(0x44, 0x80) + lock_door(0x45, 0x80) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA - unlock the small shower doors + label(0x09) + unlock_door(0x2b, 0x80) + unlock_door(0x2c, 0x80) + unlock_door(0x2d, 0x80) + unlock_door(0x2e, 0x80) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c01_outro[] = { + set_invincible(CHR_BOND) + camera_movement(ANIM_CUT_LIP_OUTRO_CAM) + play_cutscene_track(MUSIC_RESCUE_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_ailist(CHR_BIOTECH1, GAILIST_IDLE) + set_ailist(CHR_BIOTECH2, GAILIST_IDLE) + set_invincible(CHR_BOND) + + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + set_chr_chrflag(CHR_BIOTECH1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_BIOTECH1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_BIOTECH1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_OUTRO_BIO1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BIOTECH1, 4) + + set_chr_chrflag(CHR_BIOTECH2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_BIOTECH2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_BIOTECH2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_OUTRO_BIO2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BIOTECH2, 4) + + set_object_flag2(0x2f, OBJFLAG2_04000000) + set_object_flag3(0x2f, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_LIP_OUTRO_BED, 0x2f, 0x04, 0xffff) + show_nonessential_chrs(FALSE) + restart_timer + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ LABEL_8B) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(315, LABEL_73) + open_door(0x30) + open_door(0x31) + + wait_until(344, LABEL_64) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(380, LABEL_66) + speak(CHR_P1P2, L_LIP_100, MP3_0433, CHANNEL_7, COLOR_09_BLUE) // "Put your hands up and step away from the alien." + + wait_until(390, LABEL_68) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(460, LABEL_69) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(500, LABEL_74) + + wait_until(514, LABEL_6A) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(580, LABEL_6C) + speak(CHR_P1P2, L_LIP_102, MP3_0435, CHANNEL_7, COLOR_09_BLUE) // "Don't make me tell you again, Doctor. And turn tha..." + + wait_until(588, LABEL_6B) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(606, LABEL_6D) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(612, LABEL_6E) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(618, LABEL_6F) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(656, LABEL_70) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(720, LABEL_71) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(786, LABEL_72) + play_sound(SFX_0163, CHANNEL_10) + + beginloop(0x08) + if_camera_animating(/*goto*/ LABEL_2D) + goto_next(LABEL_8B) + + label(LABEL_2D) + if_controller_button_pressed(/*goto*/ LABEL_8B) + label(LABEL_2D) + endloop(0x08) + + label(LABEL_8B) + mute_channel(CHANNEL_10) + stop_cutscene_track + stop_ambient_track + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_RESCUE_INTRO) + camera_movement(ANIM_CUT_LIP_INTRO_CAM) + cmd0175(60) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_INTRO_JON, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 4) + + set_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_INTRO_DEAD_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_DEAD_GUARD, 4) + + set_object_flag2(OBJ_CRATE, OBJFLAG2_04000000) + set_object_flag3(OBJ_CRATE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_LIP_INTRO_CRATE, OBJ_CRATE, 0x04, 0xffff) + + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) + + wait_until(62, LABEL_67) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(90, LABEL_64) + speak(CHR_BOND, L_LIP_090, MP3_0429, CHANNEL_5, COLOR_03_RED) // "The problem you have is that there is no way to sn..." + + wait_until(108, LABEL_66) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(686, LABEL_68) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(738, LABEL_69) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(782, LABEL_6A) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(810, LABEL_6B) + speak(CHR_BOND, L_LIP_091, MP3_042A, CHANNEL_5, COLOR_09_BLUE) // "Doesn't sound like a problem to me. Where are thes..." + + wait_until(1104, LABEL_6C) + speak(CHR_BOND, L_LIP_092, MP3_042B, CHANNEL_5, COLOR_03_RED) // "In that crate." + + wait_until(1186, LABEL_6D) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(1222, LABEL_6E) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1246, LABEL_6F) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1316, LABEL_70) + play_sound(SFX_01DC, CHANNEL_10) + + wait_until(1346, LABEL_71) + assign_sound(SFX_8169, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_CRATE, TRUE) + + wait_until(1390, LABEL_72) + speak(CHR_BOND, L_LIP_093, MP3_042C, CHANNEL_5, COLOR_09_BLUE) // "Cute. Very cute." + + wait_until(1440, LABEL_73) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(1492, LABEL_74) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(1584, LABEL_75) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1597, LABEL_76) + speak(CHR_BOND, L_LIP_094, MP3_042D, CHANNEL_5, COLOR_03_RED) // "By the way, the stores are crawling with guards. I..." + + wait_until(1628, LABEL_77) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(1658, LABEL_78) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(1724, LABEL_79) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1792, LABEL_7A) + play_sound(SFX_0164, CHANNEL_10) + + wait_until(1866, LABEL_7B) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(1906, LABEL_7C) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(2024, LABEL_7D) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(2017, LABEL_7E) + speak(CHR_BOND, L_LIP_095, MP3_042E, CHANNEL_5, COLOR_09_BLUE) // "Certainly. Any other pearls of wisdom?" + + wait_until(2275, LABEL_7F) + speak(CHR_BOND, L_LIP_096, MP3_042F, CHANNEL_5, COLOR_03_RED) // "That crate..." + + wait_until(2338, LABEL_80) + speak(CHR_BOND, L_LIP_097, MP3_0430, CHANNEL_5, COLOR_09_BLUE) // "Yes?" + + wait_until(2409, LABEL_81) + speak(CHR_BOND, L_LIP_098, MP3_0431, CHANNEL_5, COLOR_03_RED) // "It really doesn't like being shot." + + wait_until(2440, LABEL_65) + open_door(0x33) + open_door(0x34) + + wait_until(2648, LABEL_82) + play_sound(SFX_0172, CHANNEL_10) + + wait_until(2680, LABEL_83) + speak(CHR_BOND, L_LIP_099, MP3_0432, CHANNEL_5, COLOR_09_BLUE) // "Great. Now, if I can just fight the urge to report..." + + wait_until(2690, LABEL_84) + play_sound(SFX_0173, CHANNEL_10) + + wait_until(2986, LABEL_85) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(3048, LABEL_86) + play_sound(SFX_0162, CHANNEL_10) + + wait_until(3104, LABEL_87) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(3152, LABEL_88) + play_sound(SFX_0164, CHANNEL_10) + + beginloop(0x08) + if_camera_animating(/*goto*/ LABEL_2D) + goto_next(LABEL_8B) + + label(LABEL_2D) + if_controller_button_pressed(/*goto*/ LABEL_8B) + label(LABEL_2D) + endloop(0x08) + + label(LABEL_8B) + mute_channel(CHANNEL_10) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_1) + assign_sound(SFX_8169, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_CRATE, TRUE) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) + remove_chr(CHR_JONATHAN) + unset_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_UNPLAYABLE) + set_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_INVINCIBLE) + set_chr_hiddenflag(CHR_INTRO_DEAD_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LIP_INTRO_GUARD, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_DEAD_GUARD, 2) + mute_channel(CHANNEL_10) + unset_object_flag2(OBJ_CRATE, OBJFLAG2_04000000) + set_object_flag3(OBJ_CRATE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_LIP_INTRO_CRATE, OBJ_CRATE, 0x01, 0xfffe) + close_door(0x33) + close_door(0x34) + stop_cutscene_track + stop_ambient_track + enter_firstperson + yield + set_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_PERIMDISABLEDTMP) + chr_do_animation(ANIM_CUT_LIP_INTRO_GUARD, 2, 3, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_DEAD_GUARD, 2) + set_ailist(CHR_INTRO_DEAD_GUARD, GAILIST_IDLE) + yield + kill(CHR_INTRO_DEAD_GUARD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1024_noop[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_LIGHT_VIRUS_DONE, TRUE, /*goto*/ 0x03) + endloop(0x04) + + label(0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Disable chrs, wait until player has keycard, then activate them. + * Most likely guards in the final corridor. + */ +u8 func1025_toggle_guards[] = { + set_chr_chrflag(0x33, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x34, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x33, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x34, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x37, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x2c, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x2d, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x2e, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x37, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x2c, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x2d, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x2e, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x2f, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x30, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x31, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x32, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x2f, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x30, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x31, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x32, CHRCFLAG_INVINCIBLE) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ LABEL_2D) + endloop(0x08) + + label(LABEL_2D) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + unset_chr_chrflag(0x33, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x34, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x33, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x34, CHRCFLAG_INVINCIBLE) + set_ailist(0x33, AILIST_BIOTECH_GUARD_ALERTED) + set_ailist(0x34, AILIST_BIOTECH_GUARD_ALERTED) + unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x2c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x2d, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x2e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x37, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x2c, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x2d, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x2e, CHRCFLAG_INVINCIBLE) + set_ailist(0x37, AILIST_SUPERDRAGON_GUARD) + set_ailist(0x2c, AILIST_SUPERDRAGON_GUARD) + set_ailist(0x2d, AILIST_SUPERDRAGON_GUARD) + set_ailist(0x2e, AILIST_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x2f, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x30, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x31, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x32, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x2f, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x30, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x31, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x32, CHRCFLAG_INVINCIBLE) + set_ailist(0x2f, AILIST_BIOTECH_GUARD) + set_ailist(0x30, AILIST_SUPERDRAGON_GUARD) + set_ailist(0x31, AILIST_SUPERDRAGON_GUARD) + set_ailist(0x32, AILIST_SUPERDRAGON_GUARD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0429_spawn_while_xraying[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_00040000) + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x0d) + if_timer_gt(1800, /*goto*/ LABEL_2D) + reloop(0x04) + + // 30 seconds passed and not disguised + label(LABEL_2D) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x0d) + + // Xray area + if_chr_in_room(CHR_P1P2, 0x00, 0x010d, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0102, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0103, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0104, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0105, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0106, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0107, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0108, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0109, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x010c, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fa, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fb, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fc, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fd, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00fe, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x00ff, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0100, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0101, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + label(LABEL_4E) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ LABEL_4E) + reloop(0x04) + + label(LABEL_4E) + try_spawn_clone2(CHR_SELF, 0x042a, 0, /*goto*/ LABEL_2D) + label(LABEL_2D) + restart_timer + yield + endloop(0x04) + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042a_init_xray_clone[] = { + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x47, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, 0x042b) + endlist +}; + +u8 func042b_xray_clone[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func042c_dragon_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func042d_superdragon_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func042e_biotech_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(18) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func042e_biotech_guard_alerted[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(18) + set_reaction_speed(35) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func142d_start_lifts[] = { + activate_lift(1, 0x35) + activate_lift(4, 0x38) + activate_lift(5, 0x39) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1027_check_disguise_worn[] = { + beginloop(0x04) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + show_hudmsg(CHR_BOND, L_LIP_077) // "Disguise has been worn." + set_returnlist(0x00, 0x0401) + set_returnlist(0x01, 0x0402) + set_returnlist(0x02, 0x0403) + set_returnlist(0x03, 0x0404) + set_returnlist(0x04, 0x0405) + set_returnlist(0x05, AILIST_DRAGON_GUARD) + set_returnlist(0x06, AILIST_DRAGON_GUARD) + set_returnlist(0x07, AILIST_DRAGON_GUARD) + set_returnlist(0x08, AILIST_DRAGON_GUARD) + set_returnlist(0x09, AILIST_DRAGON_GUARD) + set_returnlist(0x0a, AILIST_DRAGON_GUARD) + set_returnlist(0x0b, AILIST_DRAGON_GUARD) + set_returnlist(0x0c, 0x0406) + set_returnlist(0x0d, 0x0406) + set_returnlist(0x0e, 0x0406) + set_returnlist(0x0f, 0x0407) + set_returnlist(0x10, 0x0408) + set_returnlist(0x11, AILIST_DRAGON_GUARD) + set_returnlist(0x27, AILIST_DRAGON_GUARD) + set_returnlist(0x28, AILIST_DRAGON_GUARD) + set_returnlist(0x12, AILIST_DRAGON_GUARD) + set_returnlist(0x13, AILIST_DRAGON_GUARD) + set_returnlist(0x14, 0x0409) + set_returnlist(0x15, 0x040a) + set_returnlist(0x16, AILIST_DRAGON_GUARD) + set_returnlist(0x17, AILIST_DRAGON_GUARD) + set_returnlist(0x18, AILIST_DRAGON_GUARD) + set_returnlist(0x1e, AILIST_DRAGON_GUARD) + set_returnlist(0x19, AILIST_DRAGON_GUARD) + set_returnlist(0x1a, AILIST_DRAGON_GUARD) + set_returnlist(0x1d, AILIST_DRAGON_GUARD) + set_returnlist(0x1b, 0x040b) + set_returnlist(0x1c, 0x040c) + set_returnlist(0x1f, AILIST_DRAGON_GUARD) + set_returnlist(0x20, AILIST_DRAGON_GUARD) + set_returnlist(0x21, AILIST_DRAGON_GUARD) + set_returnlist(0x22, AILIST_DRAGON_GUARD) + set_ailist(0x00, AILIST_BECOME_UNAWARE) + set_ailist(0x01, AILIST_BECOME_UNAWARE) + set_ailist(0x02, AILIST_BECOME_UNAWARE) + set_ailist(0x03, AILIST_BECOME_UNAWARE) + set_ailist(0x04, AILIST_BECOME_UNAWARE) + set_ailist(0x05, AILIST_BECOME_UNAWARE) + set_ailist(0x06, AILIST_BECOME_UNAWARE) + set_ailist(0x07, AILIST_BECOME_UNAWARE) + set_ailist(0x08, AILIST_BECOME_UNAWARE) + set_ailist(0x09, AILIST_BECOME_UNAWARE) + set_ailist(0x0a, AILIST_BECOME_UNAWARE) + set_ailist(0x0b, AILIST_BECOME_UNAWARE) + set_ailist(0x0c, AILIST_BECOME_UNAWARE) + set_ailist(0x0d, AILIST_BECOME_UNAWARE) + set_ailist(0x0e, AILIST_BECOME_UNAWARE) + set_ailist(0x0f, AILIST_BECOME_UNAWARE) + set_ailist(0x10, AILIST_BECOME_UNAWARE) + set_ailist(0x11, AILIST_BECOME_UNAWARE) + set_ailist(0x27, AILIST_BECOME_UNAWARE) + set_ailist(0x28, AILIST_BECOME_UNAWARE) + set_ailist(0x12, AILIST_BECOME_UNAWARE) + set_ailist(0x13, AILIST_BECOME_UNAWARE) + set_ailist(0x14, AILIST_BECOME_UNAWARE) + set_ailist(0x15, AILIST_BECOME_UNAWARE) + set_ailist(0x16, AILIST_BECOME_UNAWARE) + set_ailist(0x17, AILIST_BECOME_UNAWARE) + set_ailist(0x18, AILIST_BECOME_UNAWARE) + set_ailist(0x1e, AILIST_BECOME_UNAWARE) + set_ailist(0x19, AILIST_BECOME_UNAWARE) + set_ailist(0x1a, AILIST_BECOME_UNAWARE) + set_ailist(0x1d, AILIST_BECOME_UNAWARE) + set_ailist(0x1b, AILIST_BECOME_UNAWARE) + set_ailist(0x1c, AILIST_BECOME_UNAWARE) + set_ailist(0x1f, AILIST_BECOME_UNAWARE) + set_ailist(0x20, AILIST_BECOME_UNAWARE) + set_ailist(0x21, AILIST_BECOME_UNAWARE) + set_ailist(0x22, AILIST_BECOME_UNAWARE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1028_toggle_mechanic[] = { + if_savefile_flag_is_set(GAMEFILEFLAG_RESCUE_MECHANIC_DEAD, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + disable_chr(CHR_MECHANIC) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1029_msg_showers[] = { + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x00a9, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x00aa, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x00a9, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x00bc, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x009b, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x00b5, /*goto*/ LABEL_2D) + if_chr_in_room(CHR_BOND, 0x00, 0x00ad, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + speak(CHR_BOND, L_LIP_078, MP3_03BC, CHANNEL_6, COLOR_09_BLUE) // "The showers... Now, if I can convince someone to p..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102a_msg_temperaturedropping[] = { + restart_timer + + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x010a, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + speak(CHR_BOND, L_LIP_079, SFX_8180, CHANNEL_6, COLOR_09_BLUE) // "The temperature's dropping... You must be close to..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102b_msg_airrecycled[] = { + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x007f, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + speak(CHR_BOND, L_LIP_080, MP3_03BE, CHANNEL_6, COLOR_09_BLUE) // "The air's heavily recycled around here - must be n..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102c_msg_hurry[] = { + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x0093, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + speak(CHR_BOND, L_LIP_081, SFX_8181, CHANNEL_6, COLOR_09_BLUE) // "There he is, Jo! Hurry or you'll be too late!" + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This function is run on many guards when Jo puts on the disguise. + */ +u8 func0416_become_unaware[] = { + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00002000) + if_chr_deadish(CHR_SELF, /*goto*/ 0x0f) + if_can_see_target(/*goto*/ LABEL_2D) + set_alertness(0) + return + + label(LABEL_2D) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + + // Dying/dead + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function2[] = { + set_object_flag(OBJ_WALL, OBJFLAG_INVINCIBLE) + + beginloop(0x04) + if_object_in_good_condition(OBJ_CRATE, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + endloop(0x04) + + // Crate destroyed + label(0x06) + unset_object_flag(OBJ_WALL, OBJFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102f_shuffle_disguise[] = { + yield + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0c) + call_rng + if_rand_lt(51, /*goto*/ 0x08) + if_rand_lt(102, /*goto*/ 0x09) + if_rand_lt(153, /*goto*/ 0x0a) + if_rand_lt(204, /*goto*/ 0x0b) + + // Rand >= 204 (52 out of 256 chance) + disable_object(OBJ_LABCOAT1) + disable_object(OBJ_LABCOAT2) + disable_object(OBJ_LABCOAT3) + disable_object(OBJ_LABCOAT4) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Rand < 51 (51 out of 256 chance) + label(0x08) + disable_object(OBJ_LABCOAT2) + disable_object(OBJ_LABCOAT3) + disable_object(OBJ_LABCOAT4) + disable_object(OBJ_LABCOAT5) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Rand >= 51 and < 102 (51 out of 256 chance) + label(0x09) + disable_object(OBJ_LABCOAT1) + disable_object(OBJ_LABCOAT3) + disable_object(OBJ_LABCOAT4) + disable_object(OBJ_LABCOAT5) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Rand >= 102 and < 153 (51 out of 256 chance) + label(0x0a) + disable_object(OBJ_LABCOAT1) + disable_object(OBJ_LABCOAT2) + disable_object(OBJ_LABCOAT4) + disable_object(OBJ_LABCOAT5) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Rand >= 153 and < 204 (51 out of 256 chance) + label(0x0b) + disable_object(OBJ_LABCOAT1) + disable_object(OBJ_LABCOAT2) + disable_object(OBJ_LABCOAT3) + disable_object(OBJ_LABCOAT5) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // A and SA + label(0x0c) + give_object_to_chr(OBJ_LABCOAT1, CHR_LABTECH_SHOWERS) + disable_object(OBJ_LABCOAT2) + disable_object(OBJ_LABCOAT3) + disable_object(OBJ_LABCOAT4) + disable_object(OBJ_LABCOAT5) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + label(0x0d) + disable_object(OBJ_LABCOAT1) + disable_object(OBJ_LABCOAT2) + disable_object(OBJ_LABCOAT4) + disable_object(OBJ_LABCOAT5) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1030_lift_door_sounds[] = { + beginloop(LABEL_5E) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x46, /*goto*/ LABEL_2D) + if_chr_activated_object(CHR_P1P2, 0x47, /*goto*/ LABEL_2D) + if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ LABEL_2D) + if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ LABEL_2D) + reloop(LABEL_5E) + + label(LABEL_2D) + play_sound(SFX_DOOR_81B0, -1) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + endloop(LABEL_5E) + + endlist +}; + +u8 func1031_toggle_doorman[] = { + yield + set_chr_chrflag(CHR_DOORMAN, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_DOORMAN, CHRCFLAG_INVINCIBLE) + + beginloop(LABEL_5E) + label(LABEL_2D) + if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_2D) + if_objective_complete(0, /*goto*/ LABEL_2D) + goto_first(LABEL_5E) + + label(LABEL_2D) + if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_2D) + if_objective_complete(1, /*goto*/ LABEL_2D) + endloop(LABEL_5E) + + label(LABEL_2D) + unset_chr_chrflag(CHR_DOORMAN, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_DOORMAN, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1032_count_last_room_guards[] = { + beginloop(0x04) + set_morale(0) + if_chr_deadish(0x23, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + add_morale(1) + label(0x06) + if_chr_deadish(0x24, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + add_morale(1) + label(0x06) + if_chr_deadish(0x25, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + add_morale(1) + label(0x06) + if_chr_deadish(0x26, /*goto*/ LABEL_2D) + goto_next(0x06) + + label(LABEL_2D) + add_morale(1) + label(0x06) + if_morale_lt(3, /*goto*/ LABEL_2D) + set_stage_flag(STAGEFLAG_ONE_KEYCARD_GUARD_REMAINING) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + endloop(0x04) + + endlist +}; + +/** + * When the player uses the disguise the game sets CHRHFLAG_UNTARGETABLE on + * them. Guards check their targets for this flag periodically and unset their + * targets if found. + * + * This ailist disables the flag after 10 seconds. This causes guards to + * disengage combat and gives the player an opportunity to leave a combat + * situation before the guards can become savvy again and foil the disguise. + */ +u8 func1033_unset_untargetable_flag[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_UNTARGETABLE, /*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + restart_timer + + beginloop(LABEL_64) + if_timer_gt(600, /*goto*/ LABEL_2D) + endloop(LABEL_64) + + label(LABEL_2D) + unset_chr_hiddenflag(CHR_P1P2, CHRHFLAG_UNTARGETABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1034_setup_rtracker[] = { + yield + set_object_flag3(OBJ_FALCON2SILENCED1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_FALCON2SILENCED2, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_PHOENIX, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1435_setup_environment[] = { + yield + configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0080, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0083, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0084, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0085, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0086, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0087, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0088, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0089, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0090, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0091, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0092, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0093, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0094, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0095, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0096, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0097, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0098, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0099, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x009a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x009b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00aa, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ab, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ac, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ad, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ae, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00af, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ba, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00be, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bf, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ca, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00f2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fa, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fe, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ff, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0100, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0101, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0102, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0103, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0104, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0105, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0106, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0107, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0108, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0109, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0432_init_biotech1[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, AILIST_BIOTECH1) + endlist +}; + +u8 func0433_init_biotech2[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, AILIST_BIOTECH2) + endlist +}; + +u8 func0430_biotech2[] = { + label(0x0b) + call_rng + if_rand_gt(85, /*goto*/ LABEL_62) + if_rand_gt(170, /*goto*/ LABEL_63) + + chr_do_animation(ANIM_OPERATE_0221, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + goto_next(0x04) + + label(LABEL_62) + chr_do_animation(ANIM_OPERATE_0222, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + goto_next(0x04) + + label(LABEL_63) + chr_do_animation(ANIM_OPERATE_0223, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + goto_next(0x04) + + beginloop(0x04) + if_chr_stopped(/*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + goto_first(0x0b) + + endlist +}; + +u8 func0431_biotech1[] = { + label(0x0b) + call_rng + if_rand_gt(85, /*goto*/ LABEL_62) + if_rand_gt(170, /*goto*/ LABEL_63) + + chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + goto_next(0x04) + + label(LABEL_62) + chr_do_animation(ANIM_OPERATE_0205, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + goto_next(0x04) + + label(LABEL_63) + chr_do_animation(ANIM_OPERATE_0206, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) + goto_next(0x04) + + beginloop(0x04) + if_chr_stopped(/*goto*/ LABEL_2D) + endloop(0x04) + + label(LABEL_2D) + goto_first(0x0b) + + endlist +}; + +u8 func1036_check_door_terminal_destroyed[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_2E) + + beginloop(0x0b) + if_object_in_good_condition(OBJ_DOOR_TERMINAL, /*goto*/ LABEL_2D) + if_stage_flag_eq(STAGEFLAG_DOOR_VIRUS_DOWNLOADED, TRUE, /*goto*/ LABEL_2E) + show_hudmsg(CHR_BOND, L_LIP_068) // "Mission critical equipment destroyed." + set_stage_flag(STAGEFLAG_UPLINK_TERMINAL_DESTROYED) + label(LABEL_2E) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_2D) + endloop(0x0b) + + endlist +}; + +struct ailist ailists[] = { + { func1400_give_datauplinks, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_uplink_doors, 0x1003 }, + { func1004_uplink_lights, 0x1004 }, + { func1005_uplink_autoguns, 0x1005 }, + { func1006_check_lab_accessed, 0x1006 }, + { func1007_check_disguise_collected, 0x1007 }, + { func1009_disguise_timer, 0x1009 }, + { func100a_random_doors, 0x100a }, + { func100b_check_doorman_dead, 0x100b }, + { func100c_keycardguy_lights, 0x100c }, + { func100d_check_entered_lab, 0x100d }, + { func100e_elvis_timer, 0x100e }, + { func100f_check_end_level, 0x100f }, + { func1010_give_keycard, 0x1010 }, + { func1011_unhide_warehouse_spawner, 0x1011 }, + { func1013_check_chamber_switch_destroyed, 0x1013 }, + { func1014_check_crate_destroyed, 0x1014 }, + { func1016_check_undisguised, 0x1016 }, + { func1017_activate_autogun, 0x1017 }, + { func1018_disable_chambers, 0x1018 }, + { func1019_chamber1, 0x1019 }, + { func101a_chamber2, 0x101a }, + { func101b_chamber3, 0x101b }, + { func101c_chamber4, 0x101c }, + { func101d_chamber5, 0x101d }, + { func101e_chamber6, 0x101e }, + { func101f_chamber7, 0x101f }, + { func1020_chamber8, 0x1020 }, + { func1021_xray_scanning, 0x1021 }, + { func1023_setup_door_locks, 0x1023 }, + { func1024_noop, 0x1024 }, + { func1025_toggle_guards, 0x1025 }, + { func1026_check_records_destroyed, 0x1026 }, + { func1027_check_disguise_worn, 0x1027 }, + { func1028_toggle_mechanic, 0x1028 }, + { func1029_msg_showers, 0x1029 }, + { func102a_msg_temperaturedropping, 0x102a }, + { func102b_msg_airrecycled, 0x102b }, + { func102c_msg_hurry, 0x102c }, + { func142d_start_lifts, 0x142d }, + { func102f_shuffle_disguise, 0x102f }, + { func1030_lift_door_sounds, 0x1030 }, + { func1031_toggle_doorman, 0x1031 }, + { func1032_count_last_room_guards, 0x1032 }, + { func1033_unset_untargetable_flag, 0x1033 }, + { func1034_setup_rtracker, 0x1034 }, + { func1435_setup_environment, 0x1435 }, + { func1036_check_door_terminal_destroyed, 0x1036 }, + { func1002_intro, 0x0c00 }, + { func0c01_outro, 0x0c01 }, + { func0401_start_path00, 0x0401 }, + { func0402_start_path01, 0x0402 }, + { func0403_start_path02, 0x0403 }, + { func0404_start_path03, 0x0404 }, + { func0405_start_path04, 0x0405 }, + { func0406_start_path05, 0x0406 }, + { func0407_start_path06, 0x0407 }, + { func0408_start_path07, 0x0408 }, + { func0409_start_path08, 0x0409 }, + { func040a_start_path09, 0x040a }, + { func040b_start_path10, 0x040b }, + { func040c_start_path11, 0x040c }, + { func040d_start_path12, 0x040d }, + { func040e_start_path13, 0x040e }, + { func040f_start_path14, 0x040f }, + { func0410_labtech_showers_sa_pa, 0x0410 }, + { func0411_labtech_showers_agent, 0x0411 }, + { func0412_init_labtech_showers, 0x0412 }, + { func0413_mechanic, 0x0413 }, + { func0414_init_mechanic, 0x0414 }, + { func0415_warehouse_spawner, 0x0415 }, + { func0416_become_unaware, 0x0416 }, + { func0429_spawn_while_xraying, 0x0429 }, + { func042a_init_xray_clone, 0x042a }, + { func042b_xray_clone, 0x042b }, + { func0417_warehouse_clone, 0x0417 }, + { func0418_doorman, 0x0418 }, + { func0419_init_doorman, 0x0419 }, + { func041a_labtech_harrysmate, 0x041a }, + { func041b_labtech_keycardguy, 0x041b }, + { func041c_unused_041c, 0x041c }, + { func041d_unused_041d, 0x041d }, + { func041e_unused_041e, 0x041e }, + { func041f_labtech_lights, 0x041f }, + { func0420_labtech_doors, 0x0420 }, + { func0421_init_labtech_doors, 0x0421 }, + { func0422_labtech_records, 0x0422 }, + { func0423_init_labtech_records, 0x0423 }, + { func0424_alien, 0x0424 }, + { func0425_hiddenguy, 0x0425 }, + { func0426_check_looking_at_alien, 0x0426 }, + { func0427_shock_clone, 0x0427 }, + { func0c01_outro, 0x0428 }, + { func042c_dragon_guard, 0x042c }, + { func042d_superdragon_guard, 0x042d }, + { func042e_biotech_guard, 0x042e }, + { func042e_biotech_guard_alerted, 0x042f }, + { func0432_init_biotech1, 0x0432 }, + { func0433_init_biotech2, 0x0433 }, + { func0430_biotech2, 0x0430 }, + { func0431_biotech1, 0x0431 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, + { path10, 10, 0 }, + { path11, 11, 0 }, + { path12, 12, 0 }, + { path13, 13, 0 }, + { path14, 14, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setuplue.c b/src/ailists/setuplue.c new file mode 100644 index 000000000..52ff909b6 --- /dev/null +++ b/src/ailists/setuplue.c @@ -0,0 +1,3400 @@ +// +// Infiltration +// + +#include "stagesetup.h" + +// Characters +#define CHR_MECHANIC 0x30 +#define CHR_JONATHAN 0x31 +#define CHR_OUTRO_GUARD 0x33 +#define CHR_ROCKETLAUNCHER_GUARD 0x34 + +// Objects +#define OBJ_INTERCEPTOR1 0x02 +#define OBJ_INTERCEPTOR2 0x03 +#define OBJ_INTERCEPTOR3 0x04 +#define OBJ_MAINGATE_SWITCH 0x05 +#define OBJ_ANTENNA 0x07 +#define OBJ_BUG1_BOND 0x08 +#define OBJ_ANTENNA_SWITCH 0x09 +#define OBJ_KEYCARD 0x0a +#define OBJ_LIFT1_SWITCH 0x0b +#define OBJ_LIFT2_SWITCH 0x0c +#define OBJ_RADAR_TERMINAL 0x10 +#define OBJ_MAINGATE1 0x13 +#define OBJ_MAINGATE2 0x14 +#define OBJ_MINE1 0x17 +#define OBJ_MINE2 0x18 +#define OBJ_MINE3 0x19 +#define OBJ_MINE4 0x1b +#define OBJ_MINE5 0x1c +#define OBJ_MINE6 0x1d +#define OBJ_BUG2_BOND 0x2e +#define OBJ_AUTOGUN_AT_START 0x35 +#define OBJ_BUG1_COOP 0x36 +#define OBJ_BUG2_COOP 0x37 +#define OBJ_ROCKETLAUNCHER 0x53 +#define OBJ_EXPLOSIVE_BRICK 0x54 +#define OBJ_HOVERBIKE 0x55 + +// Stage flags +#define STAGEFLAG_INTERCEPTOR1_DESTROYED 0x00000100 +#define STAGEFLAG_INTERCEPTOR2_DESTROYED 0x00000200 +#define STAGEFLAG_INTERCEPTOR3_DESTROYED 0x00000400 +#define STAGEFLAG_COMMSBUG_PLACED 0x00000800 +#define STAGEFLAG_COMMSBUG_MISPLACED 0x00001000 +#define STAGEFLAG_ANTENNA_DESTROYED 0x00002000 +#define STAGEFLAG_ANTENNA_LOWERED 0x00004000 +#define STAGEFLAG_LIFT1_CALLED 0x00008000 +#define STAGEFLAG_LIFT2_CALLED 0x00010000 +#define STAGEFLAG_HANGAR_ACCESSED 0x00020000 +#define STAGEFLAG_MET_JON 0x00040000 +#define STAGEFLAG_RADAR_SHUT_DOWN 0x00080000 +#define STAGEFLAG_EXPLOSIVES_PLACED 0x00200000 +#define STAGEFLAG_TRIGGER_INTERCEPTOR 0x00400000 +#define STAGEFLAG_ENTERED_FINAL_HANGAR 0x00800000 +#define STAGEFLAG_INTRO_FINISHED 0x01000000 +#define STAGEFLAG_LIFT_SWITCHES_DESTROYED 0x04000000 +#define STAGEFLAG_ONE_BUG_WASTED 0x08000000 +#define STAGEFLAG_ANY_LASER_DESTROYED 0x10000000 + +// AI Lists +#define AILIST_OUTRO 0x040e +#define AILIST_SPAWNED_GUARD 0x040f +#define AILIST_INTRO 0x0410 +#define AILIST_ALERT_WHEN_STOPPED 0x0415 +#define AILIST_MECHANIC 0x0416 +#define AILIST_TRAITOR 0x0417 +#define AILIST_INIT_ALERTED_SPAWNED_GUARD 0x041a +#define AILIST_ALERTED_SPAWNED_GUARD 0x041b +#define AILIST_TEMPLATE_GUARD 0x041c +#define AILIST_TROOPER_UNALERTED 0x041d +#define AILIST_DRAGON_UNALERTED 0x041e +#define AILIST_TROOPER_ALERTED 0x041f +#define AILIST_DRAGON_ALERTED 0x0420 +#define AILIST_ACTIVATE_AUTOGUN 0x0421 +#define AILIST_ACTIVATE_LASERS 0x0424 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_LUE_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_LUE_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_LUE_002) + briefing(BRIEFINGTYPE_TEXT_A, L_LUE_003) + + beginobjective(0, L_LUE_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Shut down air intercept radar" + complete_flags(STAGEFLAG_RADAR_SHUT_DOWN) + endobjective + + beginobjective(1, L_LUE_010, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Plant comms device on antenna" + complete_flags(STAGEFLAG_COMMSBUG_PLACED) + fail_flags(STAGEFLAG_COMMSBUG_MISPLACED) + fail_flags(STAGEFLAG_ANTENNA_DESTROYED) + endobjective + + beginobjective(2, L_LUE_011, (DIFFBIT_PA | DIFFBIT_PD)) // "Disable all robot interceptors" + complete_flags(STAGEFLAG_INTERCEPTOR1_DESTROYED) + complete_flags(STAGEFLAG_INTERCEPTOR2_DESTROYED) + complete_flags(STAGEFLAG_INTERCEPTOR3_DESTROYED) + endobjective + + beginobjective(3, L_LUE_012, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Gain access to hangar lift" + complete_flags(STAGEFLAG_HANGAR_ACCESSED) + fail_flags(STAGEFLAG_LIFT_SWITCHES_DESTROYED) + endobjective + + beginobjective(4, L_LUE_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Make contact with CI spy" + complete_flags(STAGEFLAG_MET_JON) + endobjective + + tag(0x3c, 5) + tag(0x3d, 6) + tag(0x31, 2) + tag(0x0f, 2) + lift(0x0100, MODEL_A51_LIFT_HANGAR, PAD_LUE_031E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x031e, 0x031f, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x14000000) +#if VERSION >= VERSION_PAL_FINAL + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0321, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) +#else + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0321, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) +#endif + lift_door(-1, -2, 0) +#if VERSION >= VERSION_PAL_FINAL + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0322, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) +#else + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0322, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) +#endif + lift_door(-1, -4, 1) + tag(0x39, -2) + tag(0x3e, 5) + tag(0x3f, 6) + tag(0x32, 2) + tag(0x0e, 2) + lift(0x0100, MODEL_A51_LIFT_HANGAR, PAD_LUE_0324, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0324, 0x0325, -1, -1, 0x00000001, 0x00000003, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x14000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0327, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) + lift_door(-1, -2, 0) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0328, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) + lift_door(-1, -4, 1) + tag(0x38, -2) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0320, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000004, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_LUE_0326, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000004, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + tag(0x40, 6) + tag(0x41, 6) + tag(0x42, 8) + tag(0x43, 8) + tag(0x33, 1) + lift(0x0100, MODEL_A51_LIFT_CONTROL, PAD_LUE_0329, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0329, 0x032a, -1, -1, 0x00000001, 0x00000005, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_032E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_032F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -3, 0) + lift_door(-2, -4, 0) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_0330, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_0331, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + lift_door(-2, -7, 1) + lift_door(-2, -8, 1) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x00, PAD_LUE_0354, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TROOPER_UNALERTED, -1, -1, 10000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + weapon(0x0100, MODEL_CHRGRENADE, 0x0000, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_GRENADE) + chr(SPAWNFLAG_00000200, 0x01, PAD_LUE_0355, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TROOPER_UNALERTED, -1, -1, 10000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0001, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x02, PAD_LUE_0029, BODY_A51TROOPER, HEAD_RANDOM, 0x0402, -1, -1, 1000, 0, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 20, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + weapon(0x0100, MODEL_CHRGRENADE, 0x0002, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_GRENADE) + chr(SPAWNFLAG_00000200, 0x03, PAD_LUE_0012, BODY_A51TROOPER, HEAD_RANDOM, 0x0401, -1, -1, 1000, 0, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 5, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0003, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + weapon(0x0100, MODEL_CHRGRENADE, 0x0003, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_GRENADE) + chr(SPAWNFLAG_00000200, 0x04, PAD_LUE_0010, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TEMPLATE_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 5, 0) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, 0x05, PAD_LUE_0356, BODY_A51TROOPER, HEAD_RANDOM, 0x040d, -1, -1, 1000, 30, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAMP, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, 0x06, PAD_LUE_0357, BODY_A51TROOPER, HEAD_RANDOM, 0x040d, -1, -1, 1000, 30, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAMP, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0006, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x07, PAD_LUE_0055, BODY_A51TROOPER, HEAD_RANDOM, 0x0403, 0x0370, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + weapon(0x0100, MODEL_CHRGRENADE, 0x0007, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_GRENADE) + chr(SPAWNFLAG_00000200, 0x08, PAD_LUE_004F, BODY_A51TROOPER, HEAD_RANDOM, 0x0403, 0x0371, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0008, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + weapon(0x0100, MODEL_CHRGRENADE, 0x0008, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_GRENADE) + chr(SPAWNFLAG_00000200, 0x09, PAD_LUE_003E, BODY_A51TROOPER, HEAD_RANDOM, 0x0404, -1, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x0c, PAD_LUE_036D, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TROOPER_UNALERTED, -1, -1, 2000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x000c, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x0d, PAD_LUE_0085, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TROOPER_UNALERTED, -1, -1, 2000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x0e, PAD_LUE_0089, BODY_A51TROOPER, HEAD_RANDOM, 0x0405, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x000e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x0f, PAD_LUE_0092, BODY_A51TROOPER, HEAD_RANDOM, 0x0406, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_THROWGRENADEFIRST, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x10, PAD_LUE_036E, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TROOPER_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0010, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x11, PAD_LUE_036F, BODY_A51TROOPER, HEAD_RANDOM, AILIST_TROOPER_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_00008000 | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x12, PAD_LUE_035A, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0012, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x13, PAD_LUE_035B, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_BLUESIGHT, 0x30, PAD_LUE_0358, BODY_OVERALL, HEAD_RANDOM, AILIST_MECHANIC, -1, -1, 1000, 5, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_DRAW_PISTOL, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + tag(0x0a, 1) + key(0x0080, MODEL_KEYCARD, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 0) + rename_object(-1, WEAPON_KEYCARD4B, L_LUE_031, L_LUE_032, L_LUE_033, L_LUE_034, L_LUE_035) // "Obtain lift key card." + chr(SPAWNFLAG_00000200, 0x14, PAD_LUE_035D, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x15, PAD_LUE_0362, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0015, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x16, PAD_LUE_035C, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_THROWGRENADEFIRST | CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x17, PAD_LUE_035E, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0017, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x18, PAD_LUE_035F, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x19, PAD_LUE_0361, BODY_A51AIRMAN, HEAD_RANDOM, 0x0407, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0019, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1a, PAD_LUE_0360, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 20, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1c, PAD_LUE_0363, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001c, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1d, PAD_LUE_0364, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_DRAGON_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1e, PAD_LUE_0365, BODY_A51AIRMAN, HEAD_RANDOM, 0x0408, -1, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x1f, PAD_LUE_037B, BODY_A51TROOPER, HEAD_RANDOM, GAILIST_IDLE, 0x007d, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x001f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x22, PAD_LUE_037E, BODY_A51TROOPER, HEAD_RANDOM, GAILIST_IDLE, 0x007d, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0022, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x20, PAD_LUE_003A, BODY_A51TROOPER, HEAD_RANDOM, GAILIST_IDLE, 0x0077, -1, 1000, 100, CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0020, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x21, PAD_LUE_0033, BODY_A51TROOPER, HEAD_RANDOM, GAILIST_IDLE, 0x0077, -1, 1000, 100, CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0021, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + chr(SPAWNFLAG_00000200, 0x23, PAD_LUE_01BA, BODY_A51AIRMAN, HEAD_RANDOM, GAILIST_IDLE, 0x007d, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_THROWGRENADEFIRST, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0023, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_00000200, 0x24, PAD_LUE_01B2, BODY_A51AIRMAN, HEAD_RANDOM, GAILIST_IDLE, 0x007d, -1, 1000, 100, CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_THROWGRENADEFIRST, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0024, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(0, 0x25, PAD_LUE_01CE, BODY_A51AIRMAN, HEAD_RANDOM, 0x0419, 0x007d, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0025, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x31, PAD_LUE_0196, BODY_A51AIRMAN, HEAD_JONATHAN, 0x0425, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + chr(0, 0x32, PAD_LUE_0197, BODY_A51TROOPER, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0032, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(0, 0x33, PAD_LUE_0199, BODY_A51AIRMAN, HEAD_KEN, 0x0425, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0033, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + chr(0, 0x29, PAD_LUE_0158, BODY_LABTECH, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + chr(0, 0x2a, PAD_LUE_0157, BODY_BIOTECH, HEAD_BIOTECH, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSONICSCREWER, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SCREWDRIVER) + chr(0, 0x2b, PAD_LUE_0156, BODY_BIOTECH, HEAD_BIOTECH, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0A, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSONICSCREWER, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SCREWDRIVER) + tag(0x2f, 1) + hover_prop(0x0100, MODEL_HOVERBED, PAD_LUE_0155, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_HOVERBEDSHIELD, 1000, 0x00010000) + chr(0, 0x34, PAD_LUE_040F, BODY_A51TROOPER, HEAD_RANDOM, GAILIST_IDLE, 0x007d, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDYROCKET, 0x0034, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_ROCKETLAUNCHER) + tag(0x53, -1) + chr(0, 0x35, PAD_LUE_009F, BODY_AREA51GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_FLANK | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0035, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAGSEC4) + weapon(0x0100, MODEL_CHRLEEGUN1, 0x0035, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAGSEC4) + link_guns(-1, -2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_027F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_027E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_027D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_027C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_027A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_027B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_0278, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_0279, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_0277, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_0276, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_0274, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_0275, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_0273, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_0272, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_0270, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_0271, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_026F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_026E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_LUE_0266, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_0267, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_LUE_02A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + tag(0x11, 2) + tag(0x12, 2) +#if VERSION >= VERSION_PAL_FINAL + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LUE_02AF, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LUE_02B0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_LUE_02AF, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_LUE_02B0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) +#endif + tag(0x13, 2) + tag(0x14, 2) + door(0x0100, MODEL_A51GATE_L, PAD_LUE_02B5, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_A51GATE_R, PAD_LUE_02B6, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00001800) +#if VERSION >= VERSION_PAL_FINAL + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_02B3, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_02B4, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) +#else + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_02B3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_02B4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) +#endif + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_028C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_028D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_0291, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_LUE_02A9, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x00, 1) + autogun(0x0100, MODEL_A51_TURRET, PAD_LUE_0380, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 3000, 0x0028, 0x00020000, 0xfffe0000, 0x000002d8, 0x001e0000) + autogun(0x0100, MODEL_A51_TURRET, PAD_LUE_0382, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 3000, 0x002e, 0x00020000, 0xfffe0000, 0x000002d8, 0x001e0000) + tag(0x01, 1) + autogun(0x0100, MODEL_A51_TURRET, PAD_LUE_0383, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 3000, 0x0026, 0x00020000, 0xfffe0000, 0x0000016c, 0x001e0000) + tag(0x35, 1) + autogun(0x0100, MODEL_A51_TURRET, PAD_LUE_0381, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 500, 0x0015, 0x00020000, 0xfffe0000, 0x000002d8, 0x001e0000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0401, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0366, 0x00004000, 0xffffc000, 0x000000da, 0x00140000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0402, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0368, 0x00004000, 0xffffc000, 0x000000da, 0x00140000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0403, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0367, 0x00004000, 0xffffc000, 0x000000da, 0x00140000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0404, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0369, 0x000031c7, 0xffffce39, 0x000000da, 0x00140000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0401, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0366, 0x00004000, 0xffffc000, 0x00000e38, 0x003c0000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0402, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0368, 0x00004000, 0xffffc000, 0x00000e38, 0x003c0000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0403, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0367, 0x00004000, 0xffffc000, 0x00000e38, 0x003c0000) + autogun(0x00c0, MODEL_A51_ROOFGUN, PAD_LUE_0404, OBJFLAG_00000004, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 0x0369, 0x000031c7, 0xffffce39, 0x00000e38, 0x003c0000) + tag(0x55, 1) + hoverbike(0x0100, MODEL_HOVBIKE, PAD_LUE_037A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_GEOCYL, 1000) + tag(0x02, 1) + chopper(0x0a00, MODEL_A51INTERCEPTOR, PAD_LUE_0359, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_20000000, OBJFLAG2_INVISIBLE, OBJFLAG3_00000200 | OBJFLAG3_REACTTOSIGHT, 100, 0x040c) + tag(0x03, 1) + chopper(0x0a00, MODEL_A51INTERCEPTOR, PAD_LUE_036C, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_20000000, OBJFLAG2_INVISIBLE, OBJFLAG3_00000200 | OBJFLAG3_REACTTOSIGHT, 100, 0x040c) + tag(0x04, 1) + chopper(0x0a00, MODEL_A51INTERCEPTOR, PAD_LUE_034E, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_20000000, OBJFLAG2_INVISIBLE, OBJFLAG3_00000200 | OBJFLAG3_REACTTOSIGHT, 100, 0x040a) + tag(0x05, 1) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LUE_0409, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x08, 1) + weapon(0x0180, MODEL_CHRBUG, -1, OBJFLAG_00000001, 0, 0, WEAPON_COMMSRIDER) + rename_object(-1, WEAPON_COMMSRIDER, L_LUE_021, L_LUE_022, L_LUE_023, L_LUE_024, L_LUE_025) // "Obtain comms rider." + tag(0x36, 1) + weapon(0x0180, MODEL_CHRBUG, -1, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_COMMSRIDER) + rename_object(-1, WEAPON_COMMSRIDER, L_LUE_021, L_LUE_022, L_LUE_023, L_LUE_024, L_LUE_025) // "Obtain comms rider." + tag(0x2e, 1) + stdobject(0x0100, MODEL_CHRBUG, PAD_LUE_035B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + rename_object(-1, WEAPON_EXPLOSIVES, L_LUE_048, L_LUE_049, L_LUE_050, L_LUE_051, L_LUE_052) // "Obtain explosive." + tag(0x37, 1) + stdobject(0x0100, MODEL_CHRBUG, PAD_LUE_035B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + rename_object(-1, WEAPON_EXPLOSIVES, L_LUE_048, L_LUE_049, L_LUE_050, L_LUE_051, L_LUE_052) // "Obtain explosive." + tag(0x09, 1) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LUE_0406, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED, OBJFLAG3_INTERACTABLE, 1000, 19) + tag(0x0b, 1) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LUE_0407, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x0c, 1) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LUE_0408, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x10, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_LUE_04F7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, OBJFLAG2_INTERACTCHECKLOS, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 0, 0) + tag(0x54, 1) + stdobject(0x000c, MODEL_EXPLOSIVEBRICK, PAD_LUE_036B, OBJFLAG_00000008 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x17, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_LUE_040C, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + tag(0x18, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_LUE_040D, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + tag(0x19, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_LUE_040E, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + tag(0x1b, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_LUE_0410, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + tag(0x1c, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_LUE_0411, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + tag(0x1d, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_LUE_0412, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + stdobject(0x0100, MODEL_BARREL, PAD_LUE_0413, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LUE_0414, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LUE_0415, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LUE_0416, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LUE_0417, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_LUE_0418, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0311, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_0312, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LUE_0313, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0314, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0307, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_0306, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LUE_0305, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0304, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_02F9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_02FA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_02FB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_02FC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LUE_02FD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_02FE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_02FF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LUE_0300, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0301, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_0302, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LUE_0303, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0309, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_LUE_030A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_LUE_030B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_030C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_030D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_030E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_030F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0310, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_02F8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x07, 1) + lift(0x0100, MODEL_A51DISH, PAD_LUE_033B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033b, 0x033a, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LUE_0446, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x0096012c) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_LUE_0445, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x0096012c) + tag(0x1e, 7) + tag(0x1f, 7) + tag(0x20, 7) + tag(0x21, 7) + tag(0x22, 7) + tag(0x23, 7) + tag(0x24, 7) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_LASDOOR, PAD_LUE_044A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_0450, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) +#else + door(0x0100, MODEL_LASDOOR, PAD_LUE_044A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_044F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_LASDOOR, PAD_LUE_0450, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_THROWTHROUGH | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00011999, 0x00011999, 0x7fffffff, 0x7fffffff, 0x7fffffff, DOORFLAG_DAMAGEONCONTACT | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_LASER, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000000) +#endif + tag(0x25, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x26, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x27, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x28, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x29, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x2a, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x2b, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x2c, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x2d, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_0050, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x51, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_LUE_04E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_LUE_04EB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_LUE_040B, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS, 0, 1000, 18) + stdobject(0x0100, MODEL_A51TABLE, PAD_LUE_04D5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x44, 2) + tag(0x45, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04F8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04F9, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x46, 2) + tag(0x47, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04FA, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04FB, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x48, 2) + tag(0x49, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04FC, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04FD, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x4a, 2) + tag(0x4b, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04FE, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_04FF, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x4c, 2) + tag(0x4d, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0500, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0501, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x4e, 2) + tag(0x4f, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0502, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0503, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x50, 2) + tag(0x52, 2) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0504, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_LUE_0505, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_EXCLUDE_A | OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000) + tag(0x3a, 1) +#if VERSION >= VERSION_JPN_FINAL + shield(0x0100, MODEL_CHRSHIELD, PAD_LUE_0565, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PD, 0, 1000) +#else + shield(0x0100, MODEL_CHRSHIELD, PAD_LUE_0565, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) +#endif + tag(0x3b, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_LUE_0096, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_LUE_000F) + intro_weapon(WEAPON_FALCON2, -1) + ammo(AMMOTYPE_PISTOL, 100) + outfit(OUTFIT_DEFAULT) + endintro +}; + +s32 path34[] = { + PAD_LUE_0560, + PAD_LUE_0563, + PAD_LUE_0562, + PAD_LUE_0561, + -1, +}; + +s32 path00[] = { + PAD_LUE_001A, + PAD_LUE_001D, + PAD_LUE_001E, + PAD_LUE_0022, + PAD_LUE_0024, + PAD_LUE_0025, + PAD_LUE_0026, + PAD_LUE_0025, + PAD_LUE_0024, + PAD_LUE_0022, + PAD_LUE_001E, + PAD_LUE_001D, + PAD_LUE_001A, + PAD_LUE_0019, + PAD_LUE_0013, + -1, +}; + +s32 path01[] = { + PAD_LUE_0026, + PAD_LUE_0025, + PAD_LUE_0024, + PAD_LUE_0022, + PAD_LUE_001E, + PAD_LUE_001D, + PAD_LUE_001A, + PAD_LUE_0019, + PAD_LUE_0013, + PAD_LUE_0019, + PAD_LUE_001A, + PAD_LUE_001D, + PAD_LUE_001E, + PAD_LUE_0022, + PAD_LUE_0024, + PAD_LUE_0025, + -1, +}; + +s32 path02[] = { + PAD_LUE_0055, + PAD_LUE_0054, + PAD_LUE_004F, + PAD_LUE_004E, + -1, +}; + +s32 path03[] = { + PAD_LUE_003F, + PAD_LUE_0077, + PAD_LUE_0078, + PAD_LUE_0079, + PAD_LUE_007A, + PAD_LUE_007B, + PAD_LUE_007C, + PAD_LUE_007D, + PAD_LUE_007E, + PAD_LUE_007F, + PAD_LUE_007E, + PAD_LUE_007D, + PAD_LUE_007C, + PAD_LUE_007B, + PAD_LUE_007A, + PAD_LUE_0079, + PAD_LUE_0078, + PAD_LUE_0077, + -1, +}; + +s32 path04[] = { + PAD_LUE_008D, + PAD_LUE_008E, + PAD_LUE_0093, + PAD_LUE_008E, + PAD_LUE_0092, + PAD_LUE_0091, + PAD_LUE_0090, + PAD_LUE_008C, + -1, +}; + +s32 path05[] = { + PAD_LUE_0092, + PAD_LUE_008E, + PAD_LUE_0093, + PAD_LUE_008E, + PAD_LUE_008D, + PAD_LUE_008C, + PAD_LUE_0090, + PAD_LUE_0091, + -1, +}; + +s32 unregistered_path1[] = { + PAD_LUE_01DC, + PAD_LUE_01B9, + PAD_LUE_01B8, + PAD_LUE_01B7, + PAD_LUE_01B6, + PAD_LUE_01B5, + PAD_LUE_01B3, + PAD_LUE_01B5, + PAD_LUE_01B6, + PAD_LUE_01B7, + PAD_LUE_01B8, + PAD_LUE_01B9, + -1, +}; + +s32 unregistered_path2[] = { + PAD_LUE_01D6, + PAD_LUE_01D6, + PAD_LUE_01D4, + PAD_LUE_01D3, + PAD_LUE_01D2, + PAD_LUE_01D1, + PAD_LUE_01D2, + PAD_LUE_01D3, + PAD_LUE_01D4, + PAD_LUE_01D6, + -1, +}; + +s32 path08[] = { + PAD_LUE_0506, + PAD_LUE_0507, + -1, +}; + +s32 path09[] = { + PAD_LUE_0508, + PAD_LUE_0509, + PAD_LUE_050A, + -1, +}; + +s32 path10[] = { + PAD_LUE_050B, + PAD_LUE_050C, + PAD_LUE_050D, + PAD_LUE_050E, + PAD_LUE_050F, + PAD_LUE_0510, + -1, +}; + +s32 path11[] = { + PAD_LUE_0511, + PAD_LUE_0512, + PAD_LUE_0513, + PAD_LUE_0514, + -1, +}; + +s32 path12[] = { + PAD_LUE_0515, + PAD_LUE_0516, + PAD_LUE_0517, + PAD_LUE_0518, + PAD_LUE_0519, + -1, +}; + +s32 path13[] = { + PAD_LUE_051A, + PAD_LUE_051B, + PAD_LUE_051C, + PAD_LUE_051D, + PAD_LUE_051E, + PAD_LUE_051F, + -1, +}; + +s32 path14[] = { + PAD_LUE_0520, + PAD_LUE_0521, + PAD_LUE_0522, + PAD_LUE_0523, + PAD_LUE_0524, + PAD_LUE_0525, + -1, +}; + +s32 path15[] = { + PAD_LUE_0526, + PAD_LUE_0527, + PAD_LUE_0528, + PAD_LUE_0529, + PAD_LUE_052A, + PAD_LUE_052B, + -1, +}; + +s32 path16[] = { + PAD_LUE_052C, + PAD_LUE_052D, + PAD_LUE_052E, + PAD_LUE_052F, + -1, +}; + +s32 path17[] = { + PAD_LUE_0530, + PAD_LUE_0531, + PAD_LUE_0532, + PAD_LUE_0533, + PAD_LUE_0534, + PAD_LUE_0535, + -1, +}; + +s32 path18[] = { + PAD_LUE_0536, + PAD_LUE_0537, + PAD_LUE_0538, + PAD_LUE_0539, + -1, +}; + +s32 path19[] = { + PAD_LUE_053A, + PAD_LUE_053B, + PAD_LUE_053C, + PAD_LUE_053D, + PAD_LUE_053E, + PAD_LUE_053F, + PAD_LUE_0540, + PAD_LUE_0541, + -1, +}; + +s32 path20[] = { + PAD_LUE_0542, + PAD_LUE_0543, + PAD_LUE_0544, + -1, +}; + +s32 path21[] = { + PAD_LUE_0545, + PAD_LUE_0546, + PAD_LUE_0547, + -1, +}; + +s32 path22[] = { + PAD_LUE_0548, + PAD_LUE_0553, + -1, +}; + +s32 path23[] = { + PAD_LUE_0549, + PAD_LUE_0552, + -1, +}; + +s32 path24[] = { + PAD_LUE_054A, + PAD_LUE_0551, + -1, +}; + +s32 path25[] = { + PAD_LUE_054B, + PAD_LUE_0550, + -1, +}; + +s32 path26[] = { + PAD_LUE_054E, + PAD_LUE_054D, + -1, +}; + +s32 path27[] = { + PAD_LUE_054F, + PAD_LUE_054C, + -1, +}; + +s32 path28[] = { + PAD_LUE_0554, + PAD_LUE_055F, + -1, +}; + +s32 path29[] = { + PAD_LUE_0555, + PAD_LUE_055E, + -1, +}; + +s32 path30[] = { + PAD_LUE_0556, + PAD_LUE_055D, + -1, +}; + +s32 path31[] = { + PAD_LUE_0557, + PAD_LUE_055C, + -1, +}; + +s32 path32[] = { + PAD_LUE_0559, + PAD_LUE_055A, + -1, +}; + +s32 path33[] = { + PAD_LUE_0558, + PAD_LUE_055B, + -1, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, PATHFLAG_CIRCULAR }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path08, 8, 0 }, + { path09, 9, PATHFLAG_FLYING }, + { path10, 10, PATHFLAG_FLYING }, + { path11, 11, PATHFLAG_FLYING }, + { path12, 12, PATHFLAG_FLYING }, + { path13, 13, PATHFLAG_FLYING }, + { path14, 14, PATHFLAG_FLYING }, + { path15, 15, PATHFLAG_FLYING }, + { path16, 16, PATHFLAG_FLYING }, + { path17, 17, PATHFLAG_FLYING }, + { path18, 18, PATHFLAG_FLYING }, + { path19, 19, PATHFLAG_FLYING }, + { path20, 20, PATHFLAG_FLYING }, + { path21, 21, PATHFLAG_FLYING }, + { path22, 22, PATHFLAG_FLYING }, + { path23, 23, PATHFLAG_FLYING }, + { path24, 24, PATHFLAG_FLYING }, + { path25, 25, PATHFLAG_FLYING }, + { path26, 26, PATHFLAG_FLYING }, + { path27, 27, PATHFLAG_FLYING }, + { path28, 28, PATHFLAG_FLYING }, + { path29, 29, PATHFLAG_FLYING }, + { path30, 30, PATHFLAG_FLYING }, + { path31, 31, PATHFLAG_FLYING }, + { path32, 32, PATHFLAG_FLYING }, + { path33, 33, PATHFLAG_FLYING }, + { path34, 34, PATHFLAG_FLYING }, + { NULL, 0, 0 }, +}; + +u8 func0426_8420[] = { + try_inherit_properties(0x04, /*goto*/ 0x2e) + label(0x2e) + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +#define init_path(pathid) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(6) \ + set_reaction_speed(50) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + +u8 func0401_start_path00[] = { + init_path(0) + endlist +}; + +u8 func0402_start_path01[] = { + init_path(1) + endlist +}; + +u8 func0403_start_path02[] = { + init_path(2) + endlist +}; + +u8 func0404_start_path03[] = { + init_path(3) + endlist +}; + +u8 func0405_start_path04[] = { + init_path(4) + endlist +}; + +u8 func0406_start_path05[] = { + init_path(5) + endlist +}; + +u8 func0407_start_path06[] = { + assign_path(6) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0408_start_path07[] = { + assign_path(7) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040b_stop_vehicle[] = { + set_vehicle_speed(0, 1) + + beginloop(0x04) + endloop(0x04) + + endlist +}; + +u8 func0c00_init_intro[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, AILIST_INTRO) + endlist +}; + +u8 func140e_check_interceptors_destroyed[] = { + set_object_flag(OBJ_AUTOGUN_AT_START, OBJFLAG_DEACTIVATED) + + beginloop(0x04) + if_object_in_good_condition(OBJ_INTERCEPTOR1, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_INTERCEPTOR1_DESTROYED, TRUE, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_INTERCEPTOR1_DESTROYED) + show_hudmsg(CHR_BOND, L_LUE_019) // "Robot interceptor disabled." + + label(0x2e) + if_object_in_good_condition(OBJ_INTERCEPTOR2, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_INTERCEPTOR2_DESTROYED, TRUE, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_INTERCEPTOR2_DESTROYED) + show_hudmsg(CHR_BOND, L_LUE_019) // "Robot interceptor disabled." + + label(0x2e) + if_object_in_good_condition(OBJ_INTERCEPTOR3, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_INTERCEPTOR3_DESTROYED, TRUE, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_INTERCEPTOR3_DESTROYED) + show_hudmsg(CHR_BOND, L_LUE_019) // "Robot interceptor disabled." + + label(0x2e) + if_stage_flag_eq(STAGEFLAG_INTERCEPTOR1_DESTROYED, FALSE, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_INTERCEPTOR2_DESTROYED, FALSE, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_INTERCEPTOR3_DESTROYED, FALSE, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_LUE_020) // "All robot interceptors disabled." + + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + endloop(0x04) + + endlist +}; + +u8 func100c_maingate_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_door_state(OBJ_MAINGATE1, DOORSTATE_CLOSING, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + set_object_image(OBJ_MAINGATE_SWITCH, 0, TVCMDLIST_12) + label(0x06) + if_chr_activated_object(CHR_P1P2, OBJ_MAINGATE_SWITCH, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_MAINGATE_SWITCH, 0x012c, 0x0190, 0x00) + set_object_image(OBJ_MAINGATE_SWITCH, 0, TVCMDLIST_13) + if_door_state(OBJ_MAINGATE1, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + show_hudmsg(CHR_P1P2, L_LUE_043) // "Main gate has been opened." + open_door(OBJ_MAINGATE1) + open_door(OBJ_MAINGATE2) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + reloop(0x04) + + label(0x2e) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_MAINGATE_SWITCH, 0x012c, 0x0190, 0x00) + set_object_image(OBJ_MAINGATE_SWITCH, 0, TVCMDLIST_12) + show_hudmsg(CHR_P1P2, L_LUE_044) // "Main gate has been closed." + close_door(OBJ_MAINGATE1) + close_door(OBJ_MAINGATE2) + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1400_give_bugs[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + give_object_to_chr(OBJ_BUG1_BOND, CHR_BOND) + label(0x2e) + give_object_to_chr(OBJ_BUG2_BOND, CHR_BOND) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + give_object_to_chr(OBJ_BUG1_COOP, CHR_COOP) + label(0x2e) + give_object_to_chr(OBJ_BUG2_COOP, CHR_COOP) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + label(0x2e) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +#define check_bug_wasted(chr) \ + yield \ + beginloop(0x00) \ + if_ammo_quantity_lt(chr, AMMOTYPE_BUG, 1, /*goto*/ 0x2e) \ + endloop(0x00) \ + \ + beginloop(0x2e) \ + if_weapon_thrown(WEAPON_COMMSRIDER, /*goto*/ 0x06) \ + endloop(0x2e) \ + \ + label(0x06) \ + restart_timer \ + \ + beginloop(0x09) \ + if_weapon_thrown_on_object(WEAPON_COMMSRIDER, OBJ_ANTENNA, /*goto*/ 0x0a) \ + if_timer_gt(120, /*goto*/ 0x0b) \ + endloop(0x09) \ + \ + label(0x0a) \ + set_stage_flag(STAGEFLAG_COMMSBUG_PLACED) \ + show_hudmsg(chr, 0x2c1a) /* "Communications bug placed correctly." */ \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + label(0x0b) \ + if_stage_flag_eq(STAGEFLAG_ONE_BUG_WASTED, TRUE, /*goto*/ 0x2e) \ + set_stage_flag(STAGEFLAG_ONE_BUG_WASTED) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + label(0x2e) \ + set_stage_flag(STAGEFLAG_COMMSBUG_MISPLACED) \ + show_hudmsg(chr, 0x2c1b) /* "Communications bug placed incorrectly." */ \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +/** + * @unused + */ +u8 func0422_check_bug_wasted_target[] = { + check_bug_wasted(CHR_TARGET) + endlist +}; + +u8 func1003_check_bug_wasted_bond[] = { + set_target_chr(CHR_BOND) + check_bug_wasted(CHR_BOND) + endlist +}; + +u8 func1023_check_bug_wasted_coop[] = { + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) + set_target_chr(CHR_COOP) + goto_next(0x06) + + label(0x2e) + set_stage_flag(STAGEFLAG_ONE_BUG_WASTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + check_bug_wasted(CHR_COOP) + endlist +}; + +u8 func1004_check_antenna_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_ANTENNA, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_LUE_028) // "Antenna has been destroyed." + set_stage_flag(STAGEFLAG_ANTENNA_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + endloop(0x04) + + endlist +}; + +u8 func1405_antenna_switch[] = { + set_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_ANTENNA_SWITCH, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_stage_flag_eq(STAGEFLAG_ANTENNA_LOWERED, TRUE, /*goto*/ 0x06) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801E, 0x00, 0x00) + play_sound_from_object2(CHANNEL_1, OBJ_ANTENNA, SFX_00CD, 0x00, 0x02) +#else + assign_sound(SFX_00CD, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_ANTENNA_SWITCH, TRUE) +#endif + set_object_image(OBJ_ANTENNA_SWITCH, 0, TVCMDLIST_12) + unset_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) + show_hudmsg(CHR_P1P2, L_LUE_030) // "Antenna lowered." + set_stage_flag(STAGEFLAG_ANTENNA_LOWERED) + restart_timer + +#if VERSION >= VERSION_NTSC_1_0 + beginloop(0x09) + if_timer_gt(20, /*goto*/ 0x2e) + reloop(0x09) + + label(0x2e) + if_lift_stationary(OBJ_ANTENNA, /*goto*/ 0x2e) + endloop(0x09) +#else + beginloop(0x09) + if_timer_gt(270, /*goto*/ 0x2e) + endloop(0x09) +#endif + + label(0x2e) + mute_channel(CHANNEL_1) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801F, 0x00, 0x00) +#endif + set_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) + reloop(0x04) + + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801E, 0x00, 0x00) + play_sound_from_object2(CHANNEL_1, OBJ_ANTENNA, SFX_00CD, 0x00, 0x02) +#else + assign_sound(SFX_00CD, CHANNEL_1) + control_sound_from_object(CHANNEL_1, OBJ_ANTENNA_SWITCH, TRUE) +#endif + set_object_image(OBJ_ANTENNA_SWITCH, 0, TVCMDLIST_13) + unset_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) + unset_stage_flag(STAGEFLAG_ANTENNA_LOWERED) + show_hudmsg(CHR_P1P2, L_LUE_029) // "Antenna raised." + restart_timer + +#if VERSION >= VERSION_NTSC_1_0 + beginloop(0x0a) + if_timer_gt(20, /*goto*/ 0x2e) + reloop(0x0a) + + label(0x2e) + if_lift_stationary(OBJ_ANTENNA, /*goto*/ 0x2e) + endloop(0x0a) +#else + beginloop(0x0a) + if_timer_gt(270, /*goto*/ 0x2e) + endloop(0x0a) +#endif + + label(0x2e) + mute_channel(CHANNEL_1) +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801F, 0x00, 0x00) +#endif + set_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) + endloop(0x04) + + endlist +}; + +u8 func1006_lift_switches[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT1_SWITCH, /*goto*/ 0x09) + if_chr_activated_object(CHR_P1P2, OBJ_LIFT2_SWITCH, /*goto*/ 0x0a) + reloop(0x04) + + label(0x09) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LIFT1_SWITCH, 0x012c, 0x0190, 0x00) + if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2e) + show_hudmsg(CHR_P1P2, L_LUE_036) // "Lift access denied - key card needed." + goto_next(0x0b) + + label(0x2e) + set_object_image(OBJ_LIFT1_SWITCH, 0, TVCMDLIST_13) + if_stage_flag_eq(STAGEFLAG_LIFT1_CALLED, TRUE, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_LIFT1_CALLED) + open_door(0x0e) + open_door(0x38) + unlock_door(0x0e, 0x02) + unlock_door(0x38, 0x02) + show_hudmsg(CHR_P1P2, L_LUE_037) // "Key card accepted - lift operational." + goto_next(0x0b) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LUE_038) // "Lift is fully operational." + goto_next(0x0b) + + label(0x0a) + assign_sound(SFX_043F, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, OBJ_LIFT2_SWITCH, 0x012c, 0x0190, 0x00) +#if VERSION >= VERSION_PAL_BETA + if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2e) +#else + if_chr_has_object(CHR_BOND, OBJ_KEYCARD, /*goto*/ 0x2e) +#endif + show_hudmsg(CHR_P1P2, L_LUE_036) // "Lift access denied - key card needed." + goto_next(0x0b) + + label(0x2e) + set_object_image(OBJ_LIFT2_SWITCH, 0, TVCMDLIST_13) + if_stage_flag_eq(STAGEFLAG_LIFT2_CALLED, TRUE, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_LIFT2_CALLED) + open_door(0x0f) + open_door(0x39) + yield + yield + unlock_door(0x0f, 0x02) + unlock_door(0x39, 0x02) + show_hudmsg(CHR_P1P2, L_LUE_037) // "Key card accepted - lift operational." + goto_next(0x0b) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LUE_038) // "Lift is fully operational." + goto_next(0x0b) + + label(0x0b) + restart_timer + + beginloop(0x0c) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + endloop(0x04) + + endlist +}; + +u8 func1007_check_hangar_accessed[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0042, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0043, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_HANGAR_ACCESSED) + show_hudmsg(CHR_P1P2, L_LUE_039) // "Hangar has been accessed." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_check_end_level[] = { + beginloop(0x04) + if_door_state(0x11, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x09) + if_door_state(0x12, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x09) + endloop(0x04) + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0060, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + show_hudmsg(CHR_P1P2, L_LUE_040) // "Met up with CI agent." + set_stage_flag(STAGEFLAG_MET_JON) + yield + yield + if_chr_deadish(CHR_BOND, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_check_radar_shut_down[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_RADAR_TERMINAL, /*goto*/ 0x06) + goto_next(0x2e) + label(0x06) + endloop(0x04) + + label(0x2e) + show_hudmsg(CHR_BOND, L_LUE_041) // "Air intercept radar shut down." + mute_channel(CHANNEL_0) + set_stage_flag(STAGEFLAG_RADAR_SHUT_DOWN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_final_hangar[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_objective_complete(0, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_objective_complete(1, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + if_objective_complete(2, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_objective_complete(3, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_LUE_01D2, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_stage_flag(STAGEFLAG_ENTERED_FINAL_HANGAR) + play_x_track(XREASON_DEFAULT, 10, 60) + restart_timer + unlock_door(0x11, 0x08) + unlock_door(0x12, 0x08) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0411, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x09) + + beginloop(0x09) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0412, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0a) + + beginloop(0x0a) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0413, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0b) + + beginloop(0x0b) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0414, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0c) + + // @bug: This timer check will pass immediately. + // It was probably intended to be 120. + beginloop(0x0c) + if_timer_gt(1, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + + // This guard will shoot the spawned guards above, but this guard is NOT Jon + beginloop(0x60) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, AILIST_TRAITOR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0d) + endloop(0x60) + + label(0x0d) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0411_init_hangar_guard1[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(10) + set_recovery_speed(35) + set_shield(0) + set_squadron(SQUADRON_0B) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_self_chrflag(CHRCFLAG_00000040) + set_chr_id(0x2c) + set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + jog_to_pad(PAD_LUE_0420) + yield + set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) + endlist +}; + +u8 func0412_init_hangar_guard2[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(10) + set_recovery_speed(35) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_squadron(SQUADRON_0B) + set_self_chrflag(CHRCFLAG_00000040) + set_chr_id(0x2d) + set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + jog_to_pad(PAD_LUE_041F) + yield + set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) + endlist +}; + +u8 func0413_init_hangar_guard3[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(10) + set_recovery_speed(35) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_squadron(SQUADRON_0B) + set_self_chrflag(CHRCFLAG_00000040) + set_chr_id(0x2e) + set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + jog_to_pad(PAD_LUE_041E) + yield + set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) + endlist +}; + +u8 func0414_init_hangar_guard4[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(10) + set_recovery_speed(35) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_squadron(SQUADRON_0B) + set_self_chrflag(CHRCFLAG_00000040) + set_chr_id(0x2f) + set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + jog_to_pad(PAD_LUE_041D) + yield +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) + endlist +}; + +u8 func0415_alert_when_stopped[] = { + // @bug: This loop should have a check for seeing Jo or a distance check to + // Jo. Without it, the guards will run past Jo at the end if she's already + // at the door. + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * This is NOT assigned to Jon. + */ +u8 func0417_traitor[] = { + set_self_chrflag(CHRCFLAG_00000040) + set_self_flag_bankx(CHRFLAG1_PREWARNED, BANK_1) + set_accuracy(100) + set_reaction_speed(100) + restart_timer + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x00000000, /*goto*/ 0x03) + + beginloop(0x03) + if_timer_gt(300, /*goto*/ 0x09) + endloop(0x03) + + label(0x09) + open_door(0x11) + if_chr_dead(0x2f, /*goto*/ 0x0d) + if_chr_knockedout(0x2f, /*goto*/ 0x0d) + set_target_chr(0x2f) + goto_next(0x2e) + + label(0x0d) + if_chr_dead(0x2e, /*goto*/ 0x0e) + if_chr_knockedout(0x2e, /*goto*/ 0x0e) + set_target_chr(0x2e) + goto_next(0x2e) + + label(0x0e) + if_chr_dead(0x2d, /*goto*/ 0x0f) + if_chr_knockedout(0x2d, /*goto*/ 0x0f) + set_target_chr(0x2d) + goto_next(0x2e) + + label(0x0f) + if_chr_dead(0x2c, /*goto*/ 0x10) + if_chr_knockedout(0x2c, /*goto*/ 0x10) + set_target_chr(0x2c) + + label(0x2e) + call_rng + if_rand_gt(128, /*goto*/ 0x2e) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x0a) + + label(0x2e) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x0a) + yield + label(0x0a) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + goto_next(0x0c) + + beginloop(0x0b) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -1373, OPERATOR_LESS_THAN, /*goto*/ 0x10) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -1373, OPERATOR_LESS_THAN, /*goto*/ 0x10) + if_chr_stopped(/*goto*/ 0x0c) + endloop(0x0b) + + label(0x0c) + if_chr_death_animation_finished(0x2f, /*goto*/ 0x2e) + chr_damage_chr(CHR_SELF, 0x2f, HITPART_HEAD) + goto_next(0x06) + + label(0x2e) + if_chr_death_animation_finished(0x2e, /*goto*/ 0x2e) + chr_damage_chr(CHR_SELF, 0x2e, HITPART_HEAD) + goto_next(0x06) + + label(0x2e) + if_chr_death_animation_finished(0x2d, /*goto*/ 0x2e) + chr_damage_chr(CHR_SELF, 0x2d, HITPART_HEAD) + goto_next(0x06) + + label(0x2e) + if_chr_death_animation_finished(0x2c, /*goto*/ 0x06) + chr_damage_chr(CHR_SELF, 0x2c, HITPART_HEAD) + label(0x06) + goto_first(0x09) + + label(0x10) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) + run_to_pad(PAD_LUE_0197) + + beginloop(0x60) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x60) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0416_mechanic[] = { + set_shotlist(AILIST_MECHANIC) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0f) + goto_next(0x04) + + label(0x2e) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + + beginloop(0x6a) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x6a) + + // Not alert - at interceptor + label(0x04) + call_rng + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_INTERCEPTOR, TRUE, /*goto*/ 0x2f) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + if_target_in_sight(/*goto*/ 0x2e) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x04) + + label(0x2f) + jog_to_pad(PAD_LUE_0385) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x0e) + endloop(0x0c) + + // In bunker + label(0x0e) + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0d) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_heard_target_recently(/*goto*/ 0x2e) + if_target_in_sight(/*goto*/ 0x2e) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + goto_first(0x0e) + + label(0x2e) + set_alertness(100) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) + + beginloop(0x0a) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0a) + + label(0x0f) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons +#if VERSION >= VERSION_NTSC_1_0 + play_sound(SFX_M0_HOLY_SHH, CHANNEL_7) +#else + play_sound(SFX_80F6, CHANNEL_7) +#endif + label(0x06) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_object_flag2(OBJ_MINE1, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_MINE2, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_MINE3, OBJFLAG2_INVISIBLE) + set_object_flag2(0x1a, OBJFLAG2_INVISIBLE) // invalid object + set_object_flag2(OBJ_MINE4, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_MINE5, OBJFLAG2_INVISIBLE) + set_object_flag2(OBJ_MINE6, OBJFLAG2_INVISIBLE) + set_chr_chrflag(CHR_MECHANIC, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func040a_top_interceptor[] = { + set_chr_maxdamage(CHR_SELF, 5000) + set_object_flag(OBJ_INTERCEPTOR3, OBJFLAG_CHOPPER_INACTIVE) + restart_timer + + beginloop(0x03) + if_object_in_good_condition(OBJ_INTERCEPTOR3, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_TRIGGER_INTERCEPTOR, TRUE, /*goto*/ 0x06) + endloop(0x03) + + label(0x06) + unset_object_flag(OBJ_INTERCEPTOR3, OBJFLAG_CHOPPER_INACTIVE) + chopper_arm_weapons + begin_hovercar_path(0x22) + set_chr_maxdamage(CHR_SELF, 5000) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x59) + endloop(0x04) + + label(0x58) + yield + label(0x09) + begin_hovercar_path(0x22) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + label(0x06) + if_can_see_target(/*goto*/ 0x59) + reloop(0x0a) + + // Unreachable + label(0x5a) + goto_first(0x09) + + label(0x59) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x5b) + reloop(0x0a) + + label(0x5b) + yield + if_can_see_target(/*goto*/ 0x5c) + restart_timer + + beginloop(0x5d) + if_timer_gt(480, /*goto*/ 0x5e) + if_can_see_target(/*goto*/ 0x5c) + endloop(0x5d) + + label(0x5e) + stop_chr + endloop(0x0a) + + label(0x5c) + goto_first(0x5b) + + endlist +}; + +u8 func040c_init_bottom_interceptors[] = { + set_chr_maxdamage(CHR_SELF, 5000) + set_object_flag(OBJ_INTERCEPTOR1, OBJFLAG_CHOPPER_INACTIVE) + set_object_flag(OBJ_INTERCEPTOR2, OBJFLAG_CHOPPER_INACTIVE) + + beginloop(0x04) + endloop(0x04) + + endlist +}; + +u8 func040d_90c8[] = { + set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) + set_accuracy(30) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040e_outro[] = { + open_door(0x11) + disable_object(OBJ_HOVERBIKE) + camera_movement(ANIM_CUT_LUE_OUTRO_CAM) + play_cutscene_track(MUSIC_INFILTRATION_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_INVINCIBLE) + + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + set_chr_hudpiece_visible(CHR_P1P2, TRUE) + + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_OUTRO_JON, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 4) + + set_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_OUTRO_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD, 4) + + restart_timer + show_nonessential_chrs(FALSE) + set_cutscene_weapon(CHR_P1P2, -1, -1) + yield + set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x54) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(1, 0x60) + speak(CHR_P1P2, L_LUE_067, MP3_0421, CHANNEL_5, COLOR_07_RED) // "Agent Dark! Over here!" + + wait_until(46, 0x61) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(74, 0x62) + play_sound(SFX_0172, CHANNEL_6) + + wait_until(100, 0x64) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(150, 0x65) + speak(CHR_P1P2, L_LUE_068, MP3_0422, CHANNEL_5, COLOR_09_BLUE) // "There you are! I was beginning to wonder if..." + + wait_until(188, 0x66) + play_sound(SFX_0174, CHANNEL_6) + + wait_until(278, 0x67) + play_sound(SFX_0175, CHANNEL_7) + + wait_until(290, 0x68) + set_chr_shooting_in_cutscene(CHR_JONATHAN, TRUE) + yield + yield + set_chr_shooting_in_cutscene(CHR_JONATHAN, FALSE) + + wait_until(296, 0x79) + play_sound(SFX_HIT_CHR, CHANNEL_10) + + wait_until(310, 0x7a) + play_sound(SFX_ARGH_MALE_0090, CHANNEL_10) + + wait_until(392, 0x69) + play_sound(SFX_THUD_808E, CHANNEL_10) + + wait_until(406, 0x6c) + speak(CHR_P1P2, L_LUE_069, MP3_0423, CHANNEL_5, COLOR_07_RED) // "If what?" + + wait_until(410, 0x6a) + play_sound(SFX_0176, CHANNEL_6) + + wait_until(424, 0x6b) + play_sound(SFX_0177, CHANNEL_6) + + wait_until(426, 0x6c) + play_sound(SFX_0177, CHANNEL_7) + + wait_until(464, 0x6d) + play_sound(SFX_007D, CHANNEL_10) + + wait_until(472, 0x6e) + speak(CHR_P1P2, L_LUE_070, MP3_0424, CHANNEL_5, COLOR_09_BLUE) // "If you'd been discovered yet. And frankly, if this..." + + wait_until(900, 0x70) + speak(CHR_P1P2, L_LUE_071, MP3_0425, CHANNEL_5, COLOR_07_RED) // "I was tidying up one of your loose ends." + + wait_until(936, 0x6f) + play_sound(SFX_0178, CHANNEL_7) + + wait_until(1080, 0x71) + speak(CHR_P1P2, L_LUE_072, MP3_0426, CHANNEL_5, COLOR_09_BLUE) // "My loose ends?" + + wait_until(1180, 0x72) + speak(CHR_P1P2, L_LUE_073, MP3_0427, CHANNEL_5, COLOR_07_RED) // "I'm sorry, I didn't realize you wanted him to shoo..." + + wait_until(1228, 0x73) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(1286, 0x74) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(1434, 0x75) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(1462, 0x77) + play_sound(SFX_0174, CHANNEL_6) + + wait_until(1585, 0x76) + speak(CHR_P1P2, L_LUE_074, MP3_0428, CHANNEL_5, COLOR_09_BLUE) // "Okay, okay, forget about it. I'm going to let the ..." + + wait_until(1588, 0x78) + play_sound(SFX_0175, CHANNEL_7) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x54) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x54) + label(0x2e) + endloop(0x09) + + label(0x54) + label(0x06) + remove_chr(CHR_OUTRO_GUARD) + set_chr_hudpiece_visible(CHR_P1P2, FALSE) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0410_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + if_controller_button_pressed(/*goto*/ 0x54) + play_cutscene_track(MUSIC_INFILTRATION_INTRO) + camera_movement(ANIM_CUT_LUE_INTRO_CAM_01) + set_chr_chrflag(0x0c, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x0d, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x32, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x32, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x32, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x32, 4) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2, WEAPON_NONE) + + wait_until(26, 0x60) + speak(CHR_BOND, L_LUE_058, MP3_0418, CHANNEL_7, COLOR_06_WHITE) // "Okay, Joanna, take a look at this. Our operative i..." + + wait_until(500, 0x61) + speak(CHR_BOND, L_LUE_059, MP3_0419, CHANNEL_7, COLOR_06_WHITE) // "This is your entry point... A deserted helipad on ..." + + wait_until(800, 0x62) + speak(CHR_BOND, L_LUE_060, MP3_041A, CHANNEL_7, COLOR_06_WHITE) // "The lift down to the hangars and the rendezvous po..." + + wait_until(1200, 0x63) + + wait_until(1236, 0x64) + speak(CHR_BOND, L_LUE_061, MP3_041B, CHANNEL_7, COLOR_06_WHITE) // "Here is the communications antenna. Attach a comms..." + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x06) + label(0x2e) + endloop(0x09) + + label(0x06) + label(0x55) + unset_chr_chrflag(0x32, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + label(0x54) + if_controller_button_pressed(/*goto*/ 0x54) + camera_movement(ANIM_CUT_LUE_INTRO_CAM_02) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + + set_chr_chrflag(0x29, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x29, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x29, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_LAB_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x29, 4) + + set_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2a, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x2a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_BIO1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2a, 4) + + set_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2b, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x2b, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_BIO2_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2b, 4) + + set_object_flag2(0x2f, OBJFLAG2_04000000) + set_object_flag3(0x2f, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_LUE_INTRO_BED_01, 0x2f, 0x04, 0xffff) + restart_timer + + wait_until(186, 0x65) + speak(CHR_BOND, L_LUE_062, SFX_81B9, CHANNEL_7, COLOR_09_BLUE) // "Oh, my God!" + + wait_until(380, 0x66) + speak(CHR_BOND, L_LUE_063, MP3_041D, CHANNEL_7, COLOR_06_WHITE) // "Here is our friend. He appears to be physically un..." + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x06) + label(0x2e) + endloop(0x0a) + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x29, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) + unset_object_flag2(0x2f, OBJFLAG2_04000000) + label(0x54) + if_controller_button_pressed(/*goto*/ 0x54) + camera_movement(ANIM_CUT_LUE_INTRO_CAM_03) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + + set_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2a, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x2a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_BIO1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2a, 4) + + set_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2b, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x2b, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_BIO2_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2b, 4) + + set_object_flag2(0x2f, OBJFLAG2_04000000) + set_object_flag3(0x2f, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_LUE_INTRO_BED_02, 0x2f, 0x04, 0xffff) + restart_timer + + wait_until(416, 0x67) + speak(CHR_BOND, L_LUE_064, MP3_041E, CHANNEL_7, COLOR_09_BLUE) // "But who was...?" + + wait_until(485, 0x68) + speak(CHR_BOND, L_LUE_065, MP3_041F, CHANNEL_7, COLOR_06_WHITE) // "Any questions? No. Good. Away you go to the hangar..." + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x06) + label(0x2e) + endloop(0x0b) + + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) + unset_object_flag2(0x2f, OBJFLAG2_04000000) + label(0x54) + camera_movement(ANIM_CUT_LUE_INTRO_CAM_04) + cmd0175(60) + if_controller_button_pressed(/*goto*/ 0x54) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(0x03, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(0x03, CHRHFLAG_00020000) + unset_chr_chrflag(0x03, CHRCFLAG_HIDDEN) + restart_timer + + wait_until(1, 0x69) + speak(CHR_BOND, L_LUE_066, MP3_0420, CHANNEL_10, COLOR_09_BLUE) // "Agent Dark Mission Log, 1028 hours. Against my bet..." + + wait_until(340, 0x6a) + play_sound(SFX_FOOTSTEP_80D5, CHANNEL_10) + + wait_until(364, 0x6b) + play_sound(SFX_04B0, CHANNEL_10) + + wait_until(458, 0x6c) + play_sound(SFX_046E, CHANNEL_10) + + play_sound(SFX_FOOTSTEP_80D5, CHANNEL_10) + wait_until(496, 0x6d) + play_sound(SFX_FOOTSTEP_80CC, CHANNEL_10) + + play_sound(SFX_FOOTSTEP_80CD, CHANNEL_10) + wait_until(638, 0x6e) + + wait_until(688, 0x6f) + play_sound(SFX_JO_LANDING_046F, CHANNEL_10) + play_sound(SFX_FOOTSTEP_80CE, CHANNEL_10) + play_sound(SFX_FOOTSTEP_80CF, CHANNEL_10) + + wait_until(750, 0x70) + play_sound(SFX_016A, CHANNEL_10) + + wait_until(815, 0x71) + play_sound(SFX_016B, CHANNEL_10) + + wait_until(844, 0x72) + play_sound(SFX_016C, CHANNEL_10) + + wait_until(908, 0x73) + play_sound(SFX_0169, CHANNEL_10) + + wait_until(916, 0x74) + + beginloop(0x0c) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x54) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x54) + label(0x2e) + endloop(0x0c) + + label(0x54) + mute_channel(CHANNEL_10) + mute_channel(CHANNEL_7) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0d, CHRCFLAG_HIDDEN) + remove_chr(0x32) + remove_chr(0x29) + remove_chr(0x2a) + remove_chr(0x2b) + disable_object(0x2f) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_LUE_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(0x03, CHRCFLAG_UNPLAYABLE) + set_ailist(0x02, 0x0426) + set_ailist(0x03, 0x0426) + unset_object_flag2(OBJ_INTERCEPTOR1, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_INTERCEPTOR2, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_INTERCEPTOR3, OBJFLAG2_INVISIBLE) + stop_cutscene_track + stop_ambient_track + enter_firstperson + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This pad is right next to where you start. Most likely the guard was changed + * to use a path instead, but this function remained. + * + * @unused + */ +u8 func0418_walk_to_pad[] = { + walk_to_pad(PAD_LUE_0019) + beginloop(0x09) + endloop(0x09) + + endlist +}; + +u8 func1010_bunker_lighting[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + mute_channel(CHANNEL_0) + yield + assign_sound(SFX_ALARM_INFILTRATION, CHANNEL_0) + play_sound_from_object(CHANNEL_0, 0x10, 1, 800, 1100) + set_lights_state(0x0009, LIGHTOP_3, 0xff, 0x32, 0x78) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) + restart_timer + + beginloop(0x0a) + if_timer_gt(30, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + + beginloop(0x0b) + if_timer_gt(40, /*goto*/ 0x2e) + endloop(0x0b) + + label(0x2e) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_bunker_laser1[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA and PA only + label(0x2e) + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x0a) + endloop(0x09) + + label(0x0a) + restart_timer + close_door(0x1e) + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + restart_timer + open_door(0x1e) + + beginloop(0x0c) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + goto_first(0x0a) + + label(0x10) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_bunker_lasers234[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2e) + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x0a) + endloop(0x09) + + label(0x0a) + restart_timer + close_door(0x1f) + close_door(0x20) + close_door(0x21) + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + restart_timer + open_door(0x1f) + open_door(0x20) + open_door(0x21) + + beginloop(0x0c) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + goto_first(0x0a) + + label(0x10) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_bunker_lasers56[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2e) + restart_timer + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x0a) + endloop(0x09) + + label(0x0a) + restart_timer + close_door(0x22) + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + restart_timer + open_door(0x22) + close_door(0x23) + + beginloop(0x0c) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + label(0x06) + restart_timer + open_door(0x23) + close_door(0x24) + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + label(0x06) + restart_timer + open_door(0x24) + + beginloop(0x0e) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + goto_first(0x0a) + + label(0x10) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_bunker_lasers[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x03) + + // Agent - hide lasers + disable_object(0x1e) + disable_object(0x1f) + disable_object(0x20) + disable_object(0x21) + disable_object(0x22) + disable_object(0x23) + disable_object(0x24) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA and PA + label(0x03) + set_object_flag(0x1e, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x1f, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x20, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x21, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x22, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x23, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x24, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x1e) + open_door(0x1f) + open_door(0x20) + open_door(0x21) + open_door(0x22) + open_door(0x23) + open_door(0x24) + set_object_flag(0x1e, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x1f, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x20, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x21, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x22, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x23, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x24, OBJFLAG_DOOR_KEEPOPEN) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x09) + if_door_state(0x1e, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + goto_first(0x03) + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + open_door(0x1e) + open_door(0x1f) + open_door(0x20) + open_door(0x21) + open_door(0x22) + open_door(0x23) + open_door(0x24) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_bunker_explosives[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_RADAR_TERMINAL, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_EXPLOSIVES, /*goto*/ 0x2e) + show_hudmsg(CHR_P1P2, L_LUE_045) // "Access denied." + goto_first(0x04) + + label(0x2e) + unset_object_flag2(OBJ_EXPLOSIVE_BRICK, OBJFLAG2_INVISIBLE) + show_hudmsg(CHR_P1P2, L_LUE_046) // "Explosive has been placed." + remove_weapon_from_inventory(WEAPON_EXPLOSIVES) + set_stage_flag(STAGEFLAG_EXPLOSIVES_PLACED) + restart_timer + + beginloop(0x0a) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + yield + set_countdown_timer(20) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x06) + show_hudmsg(CHR_P1P2, L_LUE_047) // "Intruder detected - security system online." + goto_next(0x06) + + // Agent + label(0x2e) + show_hudmsg(CHR_P1P2, L_LUE_075) // "Foreign object detected - security alerted." + label(0x06) + play_x_track(XREASON_DEFAULT, 10, 20) + yield + show_countdown_timer + start_countdown_timer + + beginloop(0x09) + if_countdown_timer_lt(1, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + hide_countdown_timer + unset_object_flag(OBJ_RADAR_TERMINAL, OBJFLAG_INVINCIBLE) + yield + move_object_to_pad(0x25, PAD_LUE_036B) + disable_object(OBJ_EXPLOSIVE_BRICK) + unset_object_flag(0x25, OBJFLAG_INVINCIBLE) + destroy_object(0x25) + destroy_object(OBJ_RADAR_TERMINAL) + mute_channel(CHANNEL_0) + assign_sound(SFX_0479, CHANNEL_0) + control_sound_from_object(CHANNEL_0, OBJ_RADAR_TERMINAL, TRUE) + restart_timer + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + move_object_to_pad(0x26, PAD_LUE_0375) + unset_object_flag(0x26, OBJFLAG_INVINCIBLE) + destroy_object(0x26) + move_object_to_pad(0x27, PAD_LUE_0376) + unset_object_flag(0x27, OBJFLAG_INVINCIBLE) + destroy_object(0x27) + move_object_to_pad(0x28, PAD_LUE_0372) + unset_object_flag(0x28, OBJFLAG_INVINCIBLE) + destroy_object(0x28) + yield + restart_timer + + beginloop(0x0c) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + unset_object_flag(0x51, OBJFLAG_INVINCIBLE) + destroy_object(0x51) + restart_timer + + beginloop(0x7b) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x7b) + + label(0x06) + unset_object_flag(0x2d, OBJFLAG_INVINCIBLE) + move_object_to_pad(0x2d, PAD_LUE_0379) + destroy_object(0x2d) + restart_timer + + beginloop(0x11) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x11) + + label(0x06) + label(0x06) + unset_object_flag(0x29, OBJFLAG_INVINCIBLE) + move_object_to_pad(0x29, PAD_LUE_0373) + destroy_object(0x29) + restart_timer + + beginloop(0x0d) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + unset_object_flag(0x2a, OBJFLAG_INVINCIBLE) + move_object_to_pad(0x2a, PAD_LUE_0374) + destroy_object(0x2a) + restart_timer + + beginloop(0x0e) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + unset_object_flag(0x2b, OBJFLAG_INVINCIBLE) + move_object_to_pad(0x2b, PAD_LUE_0377) + destroy_object(0x2b) + restart_timer + + beginloop(0x0f) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0f) + + label(0x06) + unset_object_flag(0x2c, OBJFLAG_INVINCIBLE) + move_object_to_pad(0x2c, PAD_LUE_0378) + destroy_object(0x2c) + restart_timer + + beginloop(0x10) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x10) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_trigger_interceptor[] = { + restart_timer + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_COMMSBUG_PLACED, TRUE, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0a) + + // PA - 60 seconds + if_timer_gt(3600, /*goto*/ 0x06) + goto_first(0x04) + + // Agent - 120 seconds + label(0x09) + if_timer_gt(7200, /*goto*/ 0x06) + reloop(0x04) + + // SA - 90 seconds + label(0x0a) + if_timer_gt(5400, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_INTERCEPTOR) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_radar_terminal_noise[] = { + yield + assign_sound(SFX_8146, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_RADAR_TERMINAL, 1, 800, 1100) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_unhide_guards[] = { + set_chr_chrflag(0x35, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x1f, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x20, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x21, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x22, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x23, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x24, CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + set_chr_chrflag(0x35, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x1f, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x20, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x21, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x22, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x23, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x24, CHRCFLAG_INVINCIBLE) +#endif + + // Agent: wait until guards 0x10 and 0x11 are dead + // (two guards near antenna blue door) + // SA and PA: Wait until bug thrown on antenna + beginloop(0x04) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_objective_complete(1, /*goto*/ 0x2e) + reloop(0x04) + + label(0x06) + if_chr_deadish(0x10, /*goto*/ 0x06) + goto_first(0x04) + + label(0x06) + if_chr_deadish(0x11, /*goto*/ 0x2e) + endloop(0x04) + + // Enable 4 more guards - the ones inside the blue door + label(0x2e) + unset_chr_chrflag(0x1f, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x20, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x21, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x22, CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(0x1f, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x20, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x21, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x22, CHRCFLAG_INVINCIBLE) +#endif + set_ailist(0x1f, AILIST_TROOPER_ALERTED) + set_ailist(0x20, AILIST_TROOPER_ALERTED) + set_ailist(0x21, AILIST_TROOPER_ALERTED) + set_ailist(0x22, AILIST_TROOPER_ALERTED) + + // Wait until player in room 0x0044 (first hangar ramp) + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0044, /*goto*/ 0x2e) + endloop(0x09) + + // Enable 2 more guards + label(0x2e) + unset_chr_chrflag(0x23, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x24, CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(0x23, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x24, CHRCFLAG_INVINCIBLE) +#endif + set_ailist(0x23, AILIST_DRAGON_ALERTED) + set_ailist(0x24, AILIST_DRAGON_ALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0419_clone_spawner[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(8) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(10) + set_recovery_speed(35) + set_shield(0) + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_INVINCIBLE) +#endif + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ENTERED_FINAL_HANGAR, TRUE, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_never_been_onscreen(/*goto*/ 0x4f) + if_can_see_target(/*goto*/ 0x09) + reloop(0x04) + + label(0x09) + set_ailist(CHR_SELF, AILIST_ALERTED_SPAWNED_GUARD) + + label(0x4f) + unset_self_chrflag(CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + unset_self_chrflag(CHRCFLAG_INVINCIBLE) +#endif + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + label(0x4f) + try_spawn_clone2(CHR_SELF, AILIST_INIT_ALERTED_SPAWNED_GUARD, 0, /*goto*/ 0x2e) + set_ailist(CHR_SELF, AILIST_ALERTED_SPAWNED_GUARD) + + label(0x2e) + yield + endloop(0x04) + + endlist +}; + +u8 func041a_init_alerted_spawned_guard[] = { + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x25, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_ALERTED_SPAWNED_GUARD) + endlist +}; + +u8 func041b_alerted_spawned_guard[] = { + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func1019_spawn_guards_at_antenna[] = { + // Agent: wait until guards 0x10 and 0x11 are dead + // (two guards near antenna blue door) + // SA and PA: Wait until bug thrown on antenna + beginloop(0x04) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_objective_complete(1, /*goto*/ 0x2e) + reloop(0x04) + + label(0x06) + if_chr_deadish(0x10, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_chr_deadish(0x11, /*goto*/ 0x2e) + endloop(0x04) + + // Spawn 3 guards + label(0x2e) + label(0x06) + set_morale(3) + + beginloop(0x56) + if_morale_lt(1, /*goto*/ 0x06) + try_spawn_chr_at_pad(BODY_A51TROOPER, HEAD_RANDOM, PAD_LUE_00A0, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x57) + reloop(0x56) + + label(0x57) + yield + subtract_morale(1) + restart_timer + + beginloop(0x09) + if_timer_gt(10, /*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + endloop(0x56) + + label(0x06) + yield + yield + yield + yield + yield + unset_chr_chrflag(0x35, CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(0x35, CHRCFLAG_INVINCIBLE) +#endif + set_ailist(0x35, GAILIST_SEARCH_FOR_PLAYER) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040f_spawned_guard[] = { + try_equip_weapon(MODEL_CHRLEEGUN1, WEAPON_MAGSEC4, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_HOLD_POSITION, BANK_0) + set_squadron(SQUADRON_0E) + set_self_chrflag(CHRCFLAG_RUNFASTER) + try_inherit_properties(0x35, /*goto*/ 0x06) + label(0x06) + restart_timer + + beginloop(0x0a) + if_timer_gt(300, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + run_to_pad(PAD_LUE_0095) // outside blue door + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +#define init_guard(accuracy, reaction, armor, recovery, function) \ + set_accuracy(accuracy) \ + set_reaction_speed(reaction) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(armor) \ + set_recovery_speed(recovery) \ + set_shield(0) \ + set_ailist(CHR_SELF, function) + +u8 func041d_trooper_unalerted[] = { + set_chr_dodge_rating(2, 10) + init_guard(6, 50, 0, 0, GAILIST_UNALERTED) + endlist +}; + +u8 func041f_trooper_alerted[] = { + set_chr_dodge_rating(2, 10) + init_guard(6, 50, 0, 0, GAILIST_ALERTED) + endlist +}; + +u8 func041e_dragon_unalerted[] = { + init_guard(8, 30, 10, 35, GAILIST_UNALERTED) + endlist +}; + +u8 func0420_dragon_alerted[] = { + init_guard(8, 30, 10, 35, GAILIST_ALERTED) + endlist +}; + +u8 func141f_start_lifts[] = { + activate_lift(2, 0x31) + activate_lift(3, 0x32) + activate_lift(4, 0x33) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_check_mechanic_dead[] = { + yield + unset_savefile_flag(GAMEFILEFLAG_RESCUE_MECHANIC_DEAD) + + beginloop(0x04) + if_chr_dead(CHR_MECHANIC, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_savefile_flag(GAMEFILEFLAG_RESCUE_MECHANIC_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @bug: This message cannot be played because the player has no way to get to + * room 0x0001, which is above the bunker roof. + */ +u8 func101b_msg_airinterceptradar[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0001, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + speak(CHR_P1P2, L_LUE_053, SFX_817D, CHANNEL_6, COLOR_09_BLUE) // "The air intercept radar is controlled from that bu..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_msg_cantthrow[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0013, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + speak(CHR_P1P2, L_LUE_054, MP3_03B9, CHANNEL_6, COLOR_09_BLUE) // "There's the antenna, but... I can't throw a bug th..." + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This message is also unplayable. + */ +u8 func101d_msg_hangarlift[] = { + // Wait for radar shut down and player in room 0x0001 (which is impossible) + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_objective_complete(0, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x0001, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + speak(CHR_P1P2, L_LUE_055, SFX_817E, CHANNEL_6, COLOR_09_BLUE) // "The hangar lift is on the other side of that huge ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_msg_triggerfinger[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0051, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + speak(CHR_P1P2, L_LUE_056, SFX_817F, CHANNEL_6, COLOR_09_BLUE) // "Careful with that trigger finger, Agent Dark - you..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0421_activate_autogun[] = { + set_shotlist(GAILIST_ALERTED) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x2e) + if_heard_target_recently(/*goto*/ 0x2e) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + run_to_pad(PAD_LUE_0384) + + beginloop(0x09) + if_object_in_good_condition(OBJ_AUTOGUN_AT_START, /*goto*/ 0x06) + goto_next(0x0e) + + label(0x06) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 120, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + if_object_in_good_condition(OBJ_AUTOGUN_AT_START, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + unset_object_flag(OBJ_AUTOGUN_AT_START, OBJFLAG_DEACTIVATED) + label(0x06) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(0x0e) + say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + restart_timer + chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) + + beginloop(0x7c) + if_timer_gt(60, /*goto*/ 0x7d) + endloop(0x7c) + + label(0x7d) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * Randomly select one of two guards near the start to be the one who will + * attempt to activate the autogun. + */ +u8 func1020_choose_autogun_guard[] = { + yield + call_rng + if_rand_gt(128, /*goto*/ 0x2e) + set_ailist(0x00, AILIST_ACTIVATE_AUTOGUN) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2e) + set_ailist(0x01, AILIST_ACTIVATE_AUTOGUN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1021_damage_rl_guard[] = { + yield + damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_check_lift_switches_destroyed[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_LIFT1_CALLED, TRUE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_LIFT2_CALLED, TRUE, /*goto*/ 0x06) + if_object_in_good_condition(OBJ_LIFT1_SWITCH, /*goto*/ 0x2e) + if_object_in_good_condition(OBJ_LIFT2_SWITCH, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_LUE_057) // "Lift access terminals destroyed." + set_stage_flag(STAGEFLAG_LIFT_SWITCHES_DESTROYED) + goto_next(0x06) + + label(0x2e) + endloop(0x04) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1024_lift_door_sounds[] = { + beginloop(0x7e) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x3c, /*goto*/ 0x0a) + if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x0b) + if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x41) + if_chr_activated_object(CHR_P1P2, 0x3f, /*goto*/ 0x41) + if_chr_activated_object(CHR_P1P2, 0x40, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x41, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x42, /*goto*/ 0x2e) + if_chr_activated_object(CHR_P1P2, 0x43, /*goto*/ 0x2e) + goto_first(0x7e) + + label(0x0a) + if_door_locked(0x3c, 0x02, /*goto*/ 0x2f) + goto_next(0x41) + + label(0x0b) + if_door_locked(0x3e, 0x02, /*goto*/ 0x2f) + goto_next(0x41) + + label(0x41) + play_sound(SFX_01DC, -1) + goto_next(0x06) + + label(0x2e) + play_sound(SFX_DOOR_81B0, -1) + goto_next(0x06) + + label(0x2f) + play_sound(SFX_MENU_SELECT, -1) + label(0x06) + restart_timer + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + endloop(0x7e) + + endlist +}; + +u8 func1025_spawn_bunker_guards[] = { + // This logic is pointless and all leads to label 0x04 anyway + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2e) + goto_next(0x04) + label(0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0e) + + beginloop(0x04) + yield + yield + yield + yield + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x2e) + label(0x06) + endloop(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, FALSE, /*goto*/ 0x0e) + label(0x2e) + restart_timer + + beginloop(0x60) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_0057, 0x0423, SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, /*goto*/ 0x0a) + endloop(0x60) + + beginloop(0x0a) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + + beginloop(0x61) + try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_0050, 0x0423, SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, /*goto*/ 0x0b) + endloop(0x61) + + beginloop(0x0b) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0423_a5e8[] = { + try_inherit_properties(0x25, /*goto*/ 0x06) + label(0x06) + set_alertness(100) + set_self_flag_bankx(CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_self_flag_bankx(CHRFLAG0_CAN_HEARSPAWN, BANK_0) + try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + yield + yield + yield + yield + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_TROOPER_ALERTED) + endlist +}; + +#define watch_for_laser_broken(crate1, crate2, laser) \ + if_difficulty_gt(DIFF_A, /*goto*/ 0x7e) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + /* SA and PA */ \ + beginloop(0x7e) \ + if_object_in_good_condition(crate1, /*goto*/ 0x2e) \ + goto_next(0x06) \ + \ + label(0x2e) \ + if_object_in_good_condition(crate2, /*goto*/ 0x2e) \ + goto_next(0x06) \ + \ + label(0x2e) \ + endloop(0x7e) \ + \ + label(0x06) \ + disable_object(laser) \ + set_ailist(CHR_SELF, AILIST_ACTIVATE_LASERS) + +u8 func1026_check_laser1_broken[] = { + watch_for_laser_broken(0x44, 0x45, 0x1e) + endlist +}; + +u8 func1027_check_laser2_broken[] = { + watch_for_laser_broken(0x46, 0x47, 0x1f) + endlist +}; + +u8 func1028_check_laser3_broken[] = { + watch_for_laser_broken(0x48, 0x49, 0x20) + endlist +}; + +u8 func1029_check_laser4_broken[] = { + watch_for_laser_broken(0x4a, 0x4b, 0x21) + endlist +}; + +u8 func102a_check_laser5_broken[] = { + watch_for_laser_broken(0x4c, 0x4d, 0x22) + endlist +}; + +u8 func102b_check_laser6_broken[] = { + watch_for_laser_broken(0x4e, 0x4f, 0x23) + endlist +}; + +u8 func102c_check_laser7_broken[] = { + watch_for_laser_broken(0x50, 0x52, 0x24) + endlist +}; + +u8 func0424_activate_lasers[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + + // PA + label(0x7e) + if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_ANY_LASER_DESTROYED) + if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_LUE_047) // "Intruder detected - security system online." + + // A and SA + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0425_a7d4[] = { + label(0x04) + yield + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This hidden guard is used as a template for cloning others. + */ +u8 func041c_template_guard[] = { + label(0x04) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102d_check_antenna_switch_destroyed[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) + + beginloop(0x04) + if_object_in_good_condition(OBJ_ANTENNA_SWITCH, /*goto*/ 0x06) + goto_next(0x2e) + + label(0x06) + endloop(0x04) + + label(0x2e) + if_stage_flag_eq(STAGEFLAG_ANTENNA_LOWERED, TRUE, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_LUE_042) // "Critical mission object destroyed." + set_stage_flag(STAGEFLAG_ANTENNA_DESTROYED) + label(0x2e) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102e_setup_rtracker[] = { + yield + set_object_flag3(OBJ_ROCKETLAUNCHER, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func142f_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x0001, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_start_path00, 0x0401 }, + { func0402_start_path01, 0x0402 }, + { func0403_start_path02, 0x0403 }, + { func0404_start_path03, 0x0404 }, + { func0405_start_path04, 0x0405 }, + { func0406_start_path05, 0x0406 }, + { func0407_start_path06, 0x0407 }, + { func0408_start_path07, 0x0408 }, + { func040a_top_interceptor, 0x040a }, + { func040b_stop_vehicle, 0x040b }, + { func040c_init_bottom_interceptors, 0x040c }, + { func040d_90c8, 0x040d }, + { func0411_init_hangar_guard1, 0x0411 }, + { func0412_init_hangar_guard2, 0x0412 }, + { func0413_init_hangar_guard3, 0x0413 }, + { func0414_init_hangar_guard4, 0x0414 }, + { func0415_alert_when_stopped, 0x0415 }, + { func0416_mechanic, 0x0416 }, + { func0417_traitor, 0x0417 }, + { func0418_walk_to_pad, 0x0418 }, + { func040f_spawned_guard, 0x040f }, + { func040e_outro, 0x040e }, + { func0410_intro, 0x0410 }, + { func0419_clone_spawner, 0x0419 }, + { func041a_init_alerted_spawned_guard, 0x041a }, + { func041c_template_guard, 0x041c }, + { func041b_alerted_spawned_guard, 0x041b }, + { func041d_trooper_unalerted, 0x041d }, + { func041e_dragon_unalerted, 0x041e }, + { func041f_trooper_alerted, 0x041f }, + { func0420_dragon_alerted, 0x0420 }, + { func0421_activate_autogun, 0x0421 }, + { func0422_check_bug_wasted_target, 0x0422 }, + { func0423_a5e8, 0x0423 }, + { func0424_activate_lasers, 0x0424 }, + { func0425_a7d4, 0x0425 }, + { func0426_8420, 0x0426 }, + { func0c00_init_intro, 0x0c00 }, + { func040e_outro, 0x0c01 }, + { func1400_give_bugs, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func0c00_init_intro, 0x1002 }, + { func1003_check_bug_wasted_bond, 0x1003 }, + { func1004_check_antenna_destroyed, 0x1004 }, + { func1405_antenna_switch, 0x1405 }, + { func1006_lift_switches, 0x1006 }, + { func1007_check_hangar_accessed, 0x1007 }, + { func1008_check_end_level, 0x1008 }, + { func1009_check_radar_shut_down, 0x1009 }, + { func100b_final_hangar, 0x100b }, + { func100c_maingate_switch, 0x100c }, + { func140e_check_interceptors_destroyed, 0x140e }, + { func1010_bunker_lighting, 0x1010 }, + { func1011_bunker_explosives, 0x1011 }, + { func1012_bunker_laser1, 0x1012 }, + { func1013_bunker_lasers, 0x1013 }, + { func1013_bunker_lasers234, 0x1014 }, + { func1013_bunker_lasers56, 0x1015 }, + { func1016_trigger_interceptor, 0x1016 }, + { func1017_radar_terminal_noise, 0x1017 }, + { func1018_unhide_guards, 0x1018 }, + { func1019_spawn_guards_at_antenna, 0x1019 }, + { func101a_check_mechanic_dead, 0x101a }, + { func101b_msg_airinterceptradar, 0x101b }, + { func101c_msg_cantthrow, 0x101c }, + { func101d_msg_hangarlift, 0x101d }, + { func101e_msg_triggerfinger, 0x101e }, + { func141f_start_lifts, 0x141f }, + { func1020_choose_autogun_guard, 0x1020 }, + { func1021_damage_rl_guard, 0x1021 }, + { func1022_check_lift_switches_destroyed, 0x1022 }, + { func1023_check_bug_wasted_coop, 0x1023 }, + { func1024_lift_door_sounds, 0x1024 }, + { func1025_spawn_bunker_guards, 0x1025 }, + { func1026_check_laser1_broken, 0x1026 }, + { func1027_check_laser2_broken, 0x1027 }, + { func1028_check_laser3_broken, 0x1028 }, + { func1029_check_laser4_broken, 0x1029 }, + { func102a_check_laser5_broken, 0x102a }, + { func102b_check_laser6_broken, 0x102b }, + { func102c_check_laser7_broken, 0x102c }, + { func102d_check_antenna_switch_destroyed, 0x102d }, + { func102e_setup_rtracker, 0x102e }, + { func142f_setup_environment, 0x142f }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupmp1.c b/src/ailists/setupmp1.c new file mode 100644 index 000000000..092d2fe5b --- /dev/null +++ b/src/ailists/setupmp1.c @@ -0,0 +1,39 @@ +// +// Base (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp10.c b/src/ailists/setupmp10.c new file mode 100644 index 000000000..27cce04c9 --- /dev/null +++ b/src/ailists/setupmp10.c @@ -0,0 +1,41 @@ +// +// Sewers (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP10_006A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x006a, 0x006b, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00003555, 0x00085555, 0x00000000) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP10_006C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x006c, 0x006d, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00003555, 0x00085555, 0x00000000) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_MP10_006E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x006e, 0x006f, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00003555, 0x00085555, 0x00000000) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; diff --git a/src/ailists/setupmp11.c b/src/ailists/setupmp11.c new file mode 100644 index 000000000..3ec4ab3f1 --- /dev/null +++ b/src/ailists/setupmp11.c @@ -0,0 +1,39 @@ +// +// Felicity (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp12.c b/src/ailists/setupmp12.c new file mode 100644 index 000000000..3d788c4f5 --- /dev/null +++ b/src/ailists/setupmp12.c @@ -0,0 +1,39 @@ +// +// Fortress (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp13.c b/src/ailists/setupmp13.c new file mode 100644 index 000000000..c9262b6c3 --- /dev/null +++ b/src/ailists/setupmp13.c @@ -0,0 +1,39 @@ +// +// Villa (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp14.c b/src/ailists/setupmp14.c new file mode 100644 index 000000000..547203cee --- /dev/null +++ b/src/ailists/setupmp14.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x46 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp15.c b/src/ailists/setupmp15.c new file mode 100644 index 000000000..b90535aaa --- /dev/null +++ b/src/ailists/setupmp15.c @@ -0,0 +1,39 @@ +// +// Grid (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp16.c b/src/ailists/setupmp16.c new file mode 100644 index 000000000..26f90428f --- /dev/null +++ b/src/ailists/setupmp16.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x48 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp17.c b/src/ailists/setupmp17.c new file mode 100644 index 000000000..c69278d4c --- /dev/null +++ b/src/ailists/setupmp17.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x49 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp18.c b/src/ailists/setupmp18.c new file mode 100644 index 000000000..95157b40c --- /dev/null +++ b/src/ailists/setupmp18.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x4a +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp19.c b/src/ailists/setupmp19.c new file mode 100644 index 000000000..d19432449 --- /dev/null +++ b/src/ailists/setupmp19.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x4b +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp2.c b/src/ailists/setupmp2.c new file mode 100644 index 000000000..d9387668e --- /dev/null +++ b/src/ailists/setupmp2.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x3a +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp20.c b/src/ailists/setupmp20.c new file mode 100644 index 000000000..bd11e999a --- /dev/null +++ b/src/ailists/setupmp20.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x4c +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp3.c b/src/ailists/setupmp3.c new file mode 100644 index 000000000..ebf3c8015 --- /dev/null +++ b/src/ailists/setupmp3.c @@ -0,0 +1,46 @@ +// +// Area 52 (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1000_0038[] = { + set_wind_speed(20) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_0038, 0x1000 }, + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp4.c b/src/ailists/setupmp4.c new file mode 100644 index 000000000..454744af0 --- /dev/null +++ b/src/ailists/setupmp4.c @@ -0,0 +1,46 @@ +// +// Warehouse (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func0000_0034[] = { + endlist +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp5.c b/src/ailists/setupmp5.c new file mode 100644 index 000000000..3e0e5a028 --- /dev/null +++ b/src/ailists/setupmp5.c @@ -0,0 +1,39 @@ +// +// Car Park (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp6.c b/src/ailists/setupmp6.c new file mode 100644 index 000000000..50cbbb3d8 --- /dev/null +++ b/src/ailists/setupmp6.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x3e +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp7.c b/src/ailists/setupmp7.c new file mode 100644 index 000000000..5cbad2c77 --- /dev/null +++ b/src/ailists/setupmp7.c @@ -0,0 +1,38 @@ +// +// Stage ID 0x3f +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp8.c b/src/ailists/setupmp8.c new file mode 100644 index 000000000..763f6511b --- /dev/null +++ b/src/ailists/setupmp8.c @@ -0,0 +1,42 @@ +// +// Stage ID 0x40 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + endintro +}; + +s32 path00[] = { + -1, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupmp9.c b/src/ailists/setupmp9.c new file mode 100644 index 000000000..dd8883fcf --- /dev/null +++ b/src/ailists/setupmp9.c @@ -0,0 +1,39 @@ +// +// Ruins (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupold.c b/src/ailists/setupold.c new file mode 100644 index 000000000..d64889abf --- /dev/null +++ b/src/ailists/setupold.c @@ -0,0 +1,44 @@ +// +// Stage ID 0x4e +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + tag(0x00, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x01, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x02, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; diff --git a/src/ailists/setuppam.c b/src/ailists/setuppam.c new file mode 100644 index 000000000..cdfcc81a5 --- /dev/null +++ b/src/ailists/setuppam.c @@ -0,0 +1,4811 @@ +// +// Deep Sea +// + +#include "stagesetup.h" + +// Characters +#define CHR_ELVIS 0x00 +#define CHR_BLONDE1 0x22 +#define CHR_BLONDE2 0x23 +#define CHR_DRCAROLL 0x24 + +// Objects +#define OBJ_POWERNODE1 0x00 +#define OBJ_POWERNODE2 0x01 +#define OBJ_POWERNODE3 0x02 +#define OBJ_BACKUPDISK 0x74 +#define OBJ_PROXYMINES 0xb0 + +// Stage flags +#define STAGEFLAG_DRCAROLL_RESTORED 0x00000001 +#define STAGEFLAG_ELVIS_SAID_SABOTAGE 0x00000002 +#define STAGEFLAG_DONE_FIRST_TELEPORT 0x00000004 +#define STAGEFLAG_PURPLE_GUARD_SHOT_JO_OR_ELVIS 0x00000010 +#define STAGEFLAG_TELEPORT_DONE 0x00000020 +#define STAGEFLAG_ELVIS_FOLLOWING_COOP 0x00000080 +#define STAGEFLAG_TELEPORTALS_ACTIVATED 0x00000100 +#define STAGEFLAG_MIDCUTSCENE_FINISHED 0x00000200 +#define STAGEFLAG_ESCAPED 0x00000400 +#define STAGEFLAG_ALLY_DEAD 0x00000800 +#define STAGEFLAG_FARSIGHT_AMMO_WASTED 0x00001000 +#define STAGEFLAG_TIMER_EXPIRED 0x00002000 +#define STAGEFLAG_AGENT_MEGAWEAPON_DISABLED 0x00004000 +#define STAGEFLAG_BLONDES_DEAD 0x00008000 +#define STAGEFLAG_SA_EXIT_TELEPORT_DISABLED 0x00010000 +#define STAGEFLAG_MEGAWEAPON_DISABLED 0x00020000 +#define STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING 0x00040000 +#define STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON 0x00080000 +#define STAGEFLAG_PA_EARLYDOORCYLINDER1_DESTROYED 0x00100000 +#define STAGEFLAG_PA_EARLYDOORCYLINDER2_DESTROYED 0x00200000 +#define STAGEFLAG_PA_EARLYDOORCYLINDER3_DESTROYED 0x00400000 +#define STAGEFLAG_PA_EARLYDOORCYLINDER4_DESTROYED 0x00800000 +#define STAGEFLAG_PA_EARLYDOORCYLINDER5_DESTROYED 0x01000000 +#define STAGEFLAG_PA_LATEDOORCYLINDER1_DESTROYED 0x02000000 +#define STAGEFLAG_PA_LATEDOORCYLINDER2_DESTROYED 0x04000000 +#define STAGEFLAG_PA_LATEDOORCYLINDER3_DESTROYED 0x08000000 +#define STAGEFLAG_PA_LATEDOORCYLINDER4_DESTROYED 0x10000000 +#define STAGEFLAG_PA_CANISTER1_DESTROYED 0x20000000 +#define STAGEFLAG_PA_CANISDER2_DESTROYED 0x40000000 +#define STAGEFLAG_PA_MIDDOORCYLINDER_DESTROYED 0x80000000 + +// AI Lists +#define AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS 0x0402 +#define AILIST_ELVIS_GIVE_FARSIGHT 0x0403 +#define AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON 0x0404 +#define AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON 0x0406 +#define AILIST_ELVIS_GO_TO_SA_TELEPORT 0x0407 +#define AILIST_INIT_ELVIS 0x040b +#define AILIST_BLONDE 0x040c +#define AILIST_MINISKEDAR_SEND_CLONES 0x040d +#define AILIST_INIT_MINISKEDAR 0x040e +#define AILIST_MINISKEDAR 0x040f +#define AILIST_OUTRO 0x0410 +#define AILIST_HIDE 0x0411 +#define AILIST_CLOAK_AND_HIDE 0x0413 +#define AILIST_TELEPORT_BOND_TO_SAPA 0x0414 +#define AILIST_TELEPORT_BOND_TO_DRCAROLL 0x0415 +#define AILIST_TELEPORT_BOND_TO_A_PA_DRCAROLL 0x0416 +#define AILIST_TELEPORT_COOP_TO_SAPA 0x0417 +#define AILIST_TELEPORT_COOP_TO_DRCAROLL 0x0418 +#define AILIST_TELEPORT_COOP_TO_A_PA_DRCAROLL 0x0419 +#define AILIST_INIT_SNIPER 0x041a +#define AILIST_SNIPER_WAIT_FOR_DETECTION 0x041b +#define AILIST_TELEPORT_ACTIVATION_RESPONDER 0x041c +#define AILIST_SNIPER 0x041d +#define AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR 0x041e +#define AILIST_INIT_PA_CIRCLEROOM_MINISKEDAR 0x041f +#define AILIST_INIT_PA_DEADENDROOM_MINISKEDAR 0x0420 +#define AILIST_MIDCUTSCENE 0x042a +#define AILIST_RUN_TO_EXIT 0x042b +#define AILIST_ELVIS_STOP 0x042c +#define AILIST_ELVIS_WARP_TO_OUTSIDE_DRCAROLL 0x042d +#define AILIST_ELVIS_RUN_TO_EXIT 0x042e +#define AILIST_INIT_PELAGIC_GUARD 0x042f +#define AILIST_MINISKEDAR_UNALERTED 0x0431 +#define AILIST_DEAD_SKEDAR 0x0432 + +// Pads +#define PAD_STARTAREA_TELEPORT 0x0116 +#define PAD_AGENTAREA_ENTRY 0x01a2 +#define PAD_AGENTAREA_TELEPORT 0x01fd +#define PAD_SAPAAREA_ENTRY 0x01b6 +#define PAD_SAPAAREA_TELEPORT 0x01f9 +#define PAD_PAAREA_ENTRY 0x01a5 +#define PAD_PAAREA_TELEPORT 0x0200 +#define PAD_DRCAROLLROOM_ENTRY 0x01cb + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_PAM_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_PAM_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_PAM_002) + briefing(BRIEFINGTYPE_TEXT_A, L_PAM_003) + + beginobjective(0, L_PAM_005, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Reactivate teleportals" + complete_flags(STAGEFLAG_TELEPORTALS_ACTIVATED) + endobjective + + beginobjective(1, L_PAM_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Disable Cetan megaweapon" + complete_flags(STAGEFLAG_MEGAWEAPON_DISABLED) + fail_flags(STAGEFLAG_FARSIGHT_AMMO_WASTED) + endobjective + + beginobjective(2, L_PAM_007, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Secure control room" + complete_flags(STAGEFLAG_BLONDES_DEAD) + endobjective + + beginobjective(3, L_PAM_008, (DIFFBIT_PA | DIFFBIT_PD)) // "Restore Dr. Caroll's personality" + complete_flags(STAGEFLAG_DRCAROLL_RESTORED) + endobjective + + beginobjective(4, L_PAM_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Escape from Cetan ship" + complete_flags(STAGEFLAG_ESCAPED) + fail_flags(STAGEFLAG_ALLY_DEAD) + fail_flags(STAGEFLAG_TIMER_EXPIRED) + endobjective + + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x40, PAD_PAM_01B3, BODY_DDSNIPER, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0040, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + +#if VERSION >= VERSION_PAL_BETA + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x00, PAD_PAM_002E, BODY_THEKING, HEAD_ELVIS, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_BLUESIGHT, 0x00, PAD_PAM_002E, BODY_THEKING, HEAD_ELVIS, GAILIST_IDLE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) +#endif + weapon(0x0100, MODEL_CHRZ2020, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FARSIGHT) + + tag(0x73, -1) + chr(SPAWNFLAG_00000200, 0x01, PAD_PAM_018D, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 30, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x02, PAD_PAM_019A, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x03, PAD_PAM_019B, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x04, PAD_PAM_0006, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x05, PAD_PAM_019C, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x06, PAD_PAM_0190, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x07, PAD_PAM_0191, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x08, PAD_PAM_0008, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x09, PAD_PAM_000A, BODY_DDSNIPER, HEAD_RANDOM, AILIST_INIT_SNIPER, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_00000200, 0x0a, PAD_PAM_019D, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0421, -1, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0b, PAD_PAM_019E, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_INIT_PELAGIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0c, PAD_PAM_009A, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_INIT_PELAGIC_GUARD, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0d, PAD_PAM_001E, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0422, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0e, PAD_PAM_001B, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0423, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0f, PAD_PAM_0022, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0425, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x10, PAD_PAM_0021, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0424, -1, -1, 1000, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x11, PAD_PAM_002C, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_UNALERTED, 0x0027, -1, 3000, 10, CHRFLAG0_GP1 | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x12, PAD_PAM_0029, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, 0x0024, -1, 3000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x13, PAD_PAM_002B, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, 0x0026, -1, 3000, 100, CHRFLAG0_GP1 | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x14, PAD_PAM_01B3, BODY_DDSNIPER, HEAD_RANDOM, AILIST_CLOAK_AND_HIDE, 0x01b3, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x15, PAD_PAM_01B4, BODY_DDSNIPER, HEAD_RANDOM, AILIST_CLOAK_AND_HIDE, 0x01b4, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x16, PAD_PAM_01B5, BODY_DDSNIPER, HEAD_RANDOM, AILIST_CLOAK_AND_HIDE, 0x01b5, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_00008000 | CHRFLAG0_CAN_TRAP | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x25, PAD_PAM_0064, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x26, PAD_PAM_0079, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x27, PAD_PAM_0067, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x28, PAD_PAM_0075, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x29, PAD_PAM_0080, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x2a, PAD_PAM_0085, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x2b, PAD_PAM_007C, BODY_MINISKEDAR, 0x00, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x17, PAD_PAM_00C5, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0426, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x18, PAD_PAM_00C7, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0427, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x19, PAD_PAM_00CB, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0428, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x1a, PAD_PAM_01B8, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x1b, PAD_PAM_01B7, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x1c, PAD_PAM_00BE, BODY_PELAGIC_GUARD, HEAD_RANDOM, 0x0429, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x1d, PAD_PAM_01B9, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x1e, PAD_PAM_01BA, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x1f, PAD_PAM_01BB, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x20, PAD_PAM_01BC, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_IGNORECOLLISION, 0x22, PAD_PAM_0192, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_BLONDE, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ALLY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x24, PAD_PAM_0193, BODY_DRCAROLL, 0x00, GAILIST_IDLE, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ALLY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x23, PAD_PAM_0194, BODY_MRBLONDE, HEAD_MRBLONDE, AILIST_BLONDE, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ALLY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x2f, PAD_PAM_01A6, BODY_MINISKEDAR, 0x00, AILIST_MINISKEDAR_UNALERTED, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x30, PAD_PAM_01A7, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x31, PAD_PAM_01A8, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x32, PAD_PAM_01A9, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x33, PAD_PAM_01AA, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x34, PAD_PAM_01AB, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x35, PAD_PAM_01AC, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x36, PAD_PAM_01AD, BODY_MINISKEDAR, 0x00, AILIST_MINISKEDAR_UNALERTED, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x37, PAD_PAM_01AE, BODY_MINISKEDAR, 0x00, AILIST_MINISKEDAR_UNALERTED, -1, -1, 1000, 12, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x38, PAD_PAM_01AF, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 11, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x39, PAD_PAM_01B0, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 11, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x3a, PAD_PAM_01B1, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 11, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x3b, PAD_PAM_01B2, BODY_MINISKEDAR, 0x00, GAILIST_IDLE, -1, -1, 1000, 11, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x3c, PAD_PAM_01C0, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 5, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3d, PAD_PAM_01C1, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 5, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x3e, PAD_PAM_01C2, BODY_PELAGIC_GUARD, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 5, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x003e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x3f, PAD_PAM_0012, BODY_PELAGIC_GUARD, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 100, 30, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x003f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x21, PAD_PAM_0117, BODY_SKEDAR, HEAD_RANDOM, AILIST_DEAD_SKEDAR, -1, -1, 100, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_07, -1, 0, 0, 0, 0, 0) + tag(0x75, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0157, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00007333, 0x00006666, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0xae, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0156, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00007333, 0x00006666, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0xab, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_015C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00007333, 0x00006666, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0158, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00007333, 0x00006666, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0xb3, 2) + tag(0xb4, 2) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_014B, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x00006666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_014C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00006666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0xb5, 2) + tag(0xb6, 2) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_014D, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x00006666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_014E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00006666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_014F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000570a, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_0150, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000570a, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_0151, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00005c28, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_AL_AIRLOCK, PAD_PAM_0152, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00005c28, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x03, 3) + tag(0x04, 3) + tag(0x05, 3) + door(0x0100, MODEL_CETANSMALLDOOR, PAD_PAM_0153, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000001, 0x00004650, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_CETANSMALLDOOR, PAD_PAM_0155, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000001, 0x00004650, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_CETANSMALLDOOR, PAD_PAM_0154, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000001, 0x00004650, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_016F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_016E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOORSIDE, PAD_PAM_0174, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000b333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_CETANDOORSIDE, PAD_PAM_0175, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000b333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0xb7, 2) + tag(0xb8, 2) + door(0x0100, MODEL_CETANDOORSIDE, PAD_PAM_0177, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000b333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_CETANDOORSIDE, PAD_PAM_0176, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000b333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_CETANDOORSIDE, PAD_PAM_0179, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000b333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_CETANDOORSIDE, PAD_PAM_0178, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000b333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0169, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_016A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_016B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0xb1, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_016C, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_016D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0x09, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0159, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00009999, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_015A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00009999, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_015D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00009999, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_015B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00009999, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0x0b, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_015E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_015F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0160, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0161, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0162, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0163, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0164, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0165, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0x0d, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0166, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0167, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0x0f, 1) + door(0x0100, MODEL_CETANDOOR, PAD_PAM_0168, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000c000, 0x00035555, 0x00035555, 0x00000222, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001700) + tag(0x07, 1) + lift(0x0100, MODEL_AL_DOCKLIFT, PAD_PAM_0185, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0185, 0x0186, 0x0187, 0x0186, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x00085555, 0x15000000) + tag(0x00, 3) + tag(0x01, 3) + tag(0x02, 3) + stdobject(0x00e6, MODEL_POWERNODE, PAD_PAM_028D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_00400000, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 1000) + stdobject(0x00e6, MODEL_POWERNODE, PAD_PAM_028E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_00400000, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 1000) + stdobject(0x00e6, MODEL_POWERNODE, PAD_PAM_028F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_00400000, OBJFLAG2_00000100 | OBJFLAG2_00000200, 0, 1000) + tag(0x08, 1) + weapon(0x0180, MODEL_CHRBUG, -1, OBJFLAG_00000001, OBJFLAG2_INVISIBLE, 0, WEAPON_FARSIGHT) + tag(0x11, 4) + tag(0x12, 4) + tag(0x13, 4) + tag(0x9c, 4) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0203, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0204, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0205, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0291, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x14, 4) + tag(0x15, 4) + tag(0x16, 4) + tag(0x9d, 4) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0206, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0207, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0208, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0290, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x17, 4) + tag(0x18, 4) + tag(0x19, 4) + tag(0x9e, 4) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0209, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_020A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_020B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0292, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x1a, 4) + tag(0x1b, 4) + tag(0x1c, 4) + tag(0x9f, 4) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_020C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_020D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_020E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0293, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x1d, 4) + tag(0x1e, 4) + tag(0x1f, 4) + tag(0xa0, 4) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_020F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0210, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW1, PAD_PAM_0211, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0294, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x20, 12) + tag(0x21, 12) + tag(0x22, 12) + tag(0x23, 12) + tag(0x24, 12) + tag(0x25, 12) + tag(0x26, 12) + tag(0x27, 12) + tag(0x28, 12) + tag(0x29, 12) + tag(0x2a, 12) + tag(0x2b, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0212, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0213, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0214, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0215, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0216, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0217, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0218, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0219, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_021A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_021B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_021C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_021D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0295, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa1, -1) + tag(0x2c, 12) + tag(0x2d, 12) + tag(0x2e, 12) + tag(0x2f, 12) + tag(0x30, 12) + tag(0x31, 12) + tag(0x32, 12) + tag(0x33, 12) + tag(0x34, 12) + tag(0x35, 12) + tag(0x36, 12) + tag(0x37, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_021E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_021F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0220, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0221, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0222, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0223, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0224, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0225, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0226, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0227, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0228, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0229, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0296, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa2, -1) + tag(0x38, 12) + tag(0x39, 12) + tag(0x3a, 12) + tag(0x3b, 12) + tag(0x3c, 12) + tag(0x3d, 12) + tag(0x3e, 12) + tag(0x3f, 12) + tag(0x40, 12) + tag(0x41, 12) + tag(0x42, 12) + tag(0x43, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_022A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_022B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_022C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_022D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_022E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_022F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0230, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0231, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0232, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0233, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0234, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0235, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0297, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa3, -1) + tag(0x44, 12) + tag(0x45, 12) + tag(0x46, 12) + tag(0x47, 12) + tag(0x48, 12) + tag(0x49, 12) + tag(0x4a, 12) + tag(0x4b, 12) + tag(0x4c, 12) + tag(0x4d, 12) + tag(0x4e, 12) + tag(0x4f, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0236, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0237, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0238, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0239, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_023A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_023B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_023C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_023D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_023E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_023F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0240, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0241, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0298, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa4, -1) + tag(0x50, 12) + tag(0x51, 12) + tag(0x52, 12) + tag(0x52, 12) + tag(0x53, 12) + tag(0x54, 12) + tag(0x55, 12) + tag(0x56, 12) + tag(0x57, 12) + tag(0x58, 12) + tag(0x59, 12) + tag(0x5a, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0242, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0243, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0244, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0245, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0246, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0247, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0248, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0249, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_024A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_024B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_024C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_024D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_0299, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa5, -1) + chr(SPAWNFLAG_IGNORECOLLISION, 0x41, PAD_PAM_024E, BODY_MINISKEDAR, HEAD_MRBLONDE, GAILIST_IDLE, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_IGNORECOLLISION, 0x42, PAD_PAM_025A, BODY_MINISKEDAR, HEAD_MRBLONDE, GAILIST_IDLE, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + tag(0x5b, 12) + tag(0x5c, 12) + tag(0x5d, 12) + tag(0x5e, 12) + tag(0x5f, 12) + tag(0x60, 12) + tag(0x61, 12) + tag(0x62, 12) + tag(0x63, 12) + tag(0x64, 12) + tag(0x65, 12) + tag(0x66, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_024E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_024F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0250, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0251, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0252, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0253, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0254, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0255, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0256, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0257, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0258, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0259, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_029A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa6, -1) + tag(0x67, 12) + tag(0x68, 12) + tag(0x69, 12) + tag(0x6a, 12) + tag(0x6b, 12) + tag(0x6c, 12) + tag(0x6d, 12) + tag(0x6e, 12) + tag(0x6f, 12) + tag(0x70, 12) + tag(0x71, 12) + tag(0x72, 12) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_025A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_025B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_025C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_025D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_025E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_025F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0260, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0261, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0262, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0263, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW2, PAD_PAM_0264, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + glass(0x0100, MODEL_CETANWINDOW3, PAD_PAM_0265, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1500) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PAM_029B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0xa7, -1) + tag(0xa8, 1) + autogun(0x0100, MODEL_CETROOFGUN, PAD_PAM_0188, OBJFLAG_00000004, 0, 0, 1000, 0x00e4, 0x00020000, 0xfffe0000, 0x000000da, 0x00640000) + tag(0xa9, 1) + autogun(0x0100, MODEL_CETROOFGUN, PAD_PAM_0189, OBJFLAG_00000004, 0, 0, 1000, 0x00f8, 0x00004000, 0xffffc000, 0x000000da, 0x00640000) + tag(0xaa, 1) + autogun(0x0100, MODEL_CETROOFGUN, PAD_PAM_018A, OBJFLAG_00000004, 0, 0, 1000, 0x00e4, 0x00008000, 0xffff8000, 0x000000da, 0x00640000) + glass(0x0100, MODEL_DD_WINDOW, PAD_PAM_0266, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 100) + tag(0xbb, 1) + stdobject(0x0040, MODEL_ZIGGYCARD, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x74, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_BACKUPDISK) + rename_object(-1, WEAPON_BACKUPDISK, L_PAM_023, L_PAM_024, L_PAM_025, L_PAM_026, L_PAM_027) // "" + tag(0x76, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x77, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x78, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x79, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x7a, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x7b, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x7c, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x7d, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x7e, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x7f, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x80, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x81, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x82, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x83, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x84, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x85, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x86, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x87, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x88, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x89, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x8a, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x8b, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x8c, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x8d, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x8e, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x8f, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x90, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x91, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x92, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x93, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x94, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x95, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x96, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x97, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x98, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x99, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x9a, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x9b, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0xac, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_PAM_0012, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0xad, 1) + shield(0x0100, MODEL_CHRSHIELD, 0x001a, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0xb0, 1) + weapon(0x0080, MODEL_MULTI_AMMO_CRATE, 0x0008, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_PROXIMITYMINE) + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_FALCON2_SCOPE, -1) + ammo(AMMOTYPE_PISTOL, 50) + ammo(AMMOTYPE_PROXY_MINE, 2) + intro_weapon(WEAPON_SHOTGUN, -1) + ammo(AMMOTYPE_SHOTGUN, 100) + ammo(AMMOTYPE_FARSIGHT, 50) + intro_weapon(WEAPON_IRSCANNER, -1) + spawn(PAD_PAM_018B) + outfit(OUTFIT_DEEPSEA) + endintro +}; + +s32 path02[] = { + PAD_PAM_0099, + PAD_PAM_0098, + PAD_PAM_000E, + PAD_PAM_000D, + PAD_PAM_000C, + -1, +}; + +s32 path03[] = { + PAD_PAM_001E, + PAD_PAM_0096, + PAD_PAM_0095, + -1, +}; + +s32 path04[] = { + PAD_PAM_001B, + PAD_PAM_001A, + PAD_PAM_001C, + PAD_PAM_001D, + -1, +}; + +s32 path05[] = { + PAD_PAM_0021, + PAD_PAM_0020, + PAD_PAM_001F, + -1, +}; + +s32 path06[] = { + PAD_PAM_0022, + PAD_PAM_001A, + PAD_PAM_001C, + -1, +}; + +s32 path07[] = { + PAD_PAM_00C4, + PAD_PAM_00C5, + PAD_PAM_00C6, + PAD_PAM_00C7, + -1, +}; + +s32 path08[] = { + PAD_PAM_00C7, + PAD_PAM_00C8, + -1, +}; + +s32 path09[] = { + PAD_PAM_00CB, + PAD_PAM_00CC, + -1, +}; + +s32 path10[] = { + PAD_PAM_00BE, + PAD_PAM_00BF, + PAD_PAM_00C1, + -1, +}; + +u8 func0401_unused[] = { + begin_hovercar_path(0x00) + set_vehicle_speed(384, 120) + + beginloop(0x04) + endloop(0x04) + + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func040b_init_elvis[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_PUSHABLE) + set_accuracy(100) + set_reaction_speed(100) + set_alertness(100) + set_chr_maxdamage(CHR_SELF, 1) + add_health_or_armor(900) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + endlist +}; + +u8 func0402_elvis_follow_and_reactive_teleportals[] = { + set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + set_shotlist(AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Injured + label(0x2e) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) + goto_next(0x12) + + label(0x2f) + say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x12) + + // Not injured + label(0x06) + if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + goto_next(0x06) + + // Has flag + label(0x2e) + if_enemy_distance_lt_and_los(100, /*goto*/ 0x08) + + // No enemy nearby + label(0x06) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + + // Jo distance >= 200 + label(0x03) + set_target_chr(CHR_PRESET) + restart_timer + if_distance_to_target_gt(300, /*goto*/ 0x06) + try_jog_to_target(/*goto*/ 0x04) + + // Jo distance < 200 or distance > 300 + label(0x06) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + goto_next(0x06) + label(0x2e) + if_enemy_distance_lt_and_los(100, /*goto*/ 0x08) + label(0x06) + if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x2e) + if_chr_in_room(CHR_ELVIS, 0x00, 0x003c, /*goto*/ 0x5f) + label(0x2e) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + goto_first(0x03) + + // Waiting next to Jo? + label(0x06) + stop_chr + + beginloop(0x09) + if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + goto_next(0x06) + label(0x2e) + if_enemy_distance_lt_and_los(100, /*goto*/ 0x08) + label(0x06) + if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x2e) + if_chr_in_room(CHR_ELVIS, 0x00, 0x003c, /*goto*/ 0x5f) + label(0x2e) + set_target_chr(CHR_PRESET) + if_distance_to_target_gt(300, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + // Enemy detected + label(0x08) + yield + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + goto_next(0x2e) + label(0x06) + call_rng + if_rand_lt(85, /*goto*/ 0x63) + if_rand_lt(170, /*goto*/ 0x64) + + say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + + label(0x63) + say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + + label(0x64) + say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + label(0x2e) + set_shotlist(AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // In teleport control room + label(0x5f) + stop_chr + speak(CHR_TARGET, L_PAM_029, MP3_04EB, CHANNEL_6, COLOR_04_ORANGE) // "Time to reactivate those teleportals." + jog_to_pad(PAD_PAM_01C3) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x0f) + + label(0x6f) + label(0x2e) + unset_self_chrflag(CHRCFLAG_PUSHABLE) + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x10) + + label(0x06) + say_quip(CHR_BOND, 0x2c, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + show_hudmsg(CHR_BOND, L_PAM_030) // "Teleportals have been reactivated." + set_stage_flag(STAGEFLAG_TELEPORTALS_ACTIVATED) + set_self_chrflag(CHRCFLAG_PUSHABLE) + play_sound(SFX_8148, -1) + set_lights_state(0x003c, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_chr_chrflag(0x14, CHRCFLAG_00040000) + set_chr_chrflag(0x15, CHRCFLAG_00040000) + set_chr_chrflag(0x16, CHRCFLAG_00040000) + unset_chr_chrflag(0x14, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x15, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) + set_ailist(0x14, AILIST_TELEPORT_ACTIVATION_RESPONDER) + set_ailist(0x15, AILIST_TELEPORT_ACTIVATION_RESPONDER) + set_ailist(0x16, AILIST_TELEPORT_ACTIVATION_RESPONDER) + goto_first(0x03) + + label(0x60) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + endlist +}; + +u8 func0433_unused[] = { + beginloop(0x04) + set_target_chr(CHR_BOND) + if_nearly_in_targets_sight(30, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_nearly_in_targets_sight(30, /*goto*/ 0x06) + set_target_chr(CHR_ANTI) + if_nearly_in_targets_sight(30, /*goto*/ 0x06) + goto_next(0x2e) + + label(0x06) + endloop(0x04) + + label(0x2e) + unset_self_flag_bankx(CHRFLAG0_SURPRISABLE, BANK_0) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * This is also assigned to Elvis on PA, but in that case it's a general follow + * function because he can't enter the agent megaweapon room on PA. + */ +u8 func0404_elvis_follow_and_do_agent_megaweapon[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + unset_self_flag_bankx(CHRFLAG1_NOOP_00200000, BANK_1) + set_shotlist(AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Injured + label(0x2e) + say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x12) + + // Healthy + label(0x06) + if_stage_flag_eq(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_ELVIS_SAID_SABOTAGE, TRUE, /*goto*/ 0x5f) + label(0x2e) + if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + label(0x03) + set_target_chr(CHR_PRESET) + restart_timer + if_distance_to_target_gt(300, /*goto*/ 0x06) + try_jog_to_target(/*goto*/ 0x04) + label(0x06) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) + if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ 0x1d) + label(0x2e) + if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + goto_first(0x03) + + label(0x06) + stop_chr + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) + if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ 0x1d) + label(0x2e) + if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_gt(300, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + label(0x08) + call_rng + if_rand_lt(85, /*goto*/ 0x63) + if_rand_lt(170, /*goto*/ 0x64) + + say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + + label(0x63) + say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + + label(0x64) + say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + + label(0x2e) + set_shotlist(AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) + set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // In Agent megaweapon room + label(0x1d) + speak(CHR_TARGET, L_PAM_028, MP3_04EC, CHANNEL_6, COLOR_04_ORANGE) // "It looks like this could benefit from a little bit..." + label(0x5f) + set_stage_flag(STAGEFLAG_ELVIS_SAID_SABOTAGE) + stop_chr + jog_to_pad(PAD_PAM_005F) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x0f) + + label(0x6f) + label(0x2e) + unset_self_chrflag(CHRCFLAG_PUSHABLE) + restart_timer + chr_do_animation(ANIM_OPERATE_0205, -1, -1, 0, 16, CHR_SELF, 2) + + beginloop(0x10) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x10) + + label(0x06) + say_quip(CHR_BOND, 0x2c, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + set_self_chrflag(CHRCFLAG_PUSHABLE) + show_hudmsg(CHR_BOND, L_PAM_020) // "Cetan megaweapon has been disabled." + set_stage_flag(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED) + set_stage_flag(STAGEFLAG_MEGAWEAPON_DISABLED) + set_lights_state(0x006c, LIGHTOP_3, 0x64, 0xff, 0x78) + assign_sound(SFX_8148, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) + unlock_door(0xb7, 0x02) + unlock_door(0xb8, 0x02) + goto_first(0x03) + + label(0x60) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) + endlist +}; + +/** + * Seems to be a general follow function for Elvis. + * He does not engage in combat. + * + * @unused + */ +u8 func0405_elvis_follow_nocombat[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + unset_self_flag_bankx(CHRFLAG1_NOOP_00200000, BANK_1) + set_shotlist(0x0405) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Injured + label(0x2e) + say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x12) + + label(0x06) + if_enemy_distance_lt_and_los(300, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + label(0x03) + set_target_chr(CHR_PRESET) + restart_timer + if_distance_to_target_gt(300, /*goto*/ 0x06) + try_jog_to_target(/*goto*/ 0x04) + label(0x06) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + label(0x2e) + if_enemy_distance_lt_and_los(300, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + goto_first(0x03) + + label(0x06) + stop_chr + + beginloop(0x09) + label(0x2e) + if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) + set_target_chr(CHR_PRESET) + if_distance_to_target_gt(300, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + // Detected enemy + label(0x08) + restart_timer + say_quip(CHR_BOND, 0x29, 0xff, 0x14, 0xff, BANK_1, 0x00, 0x00) + retreat(GOPOSFLAG_RUN, 1) + + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + goto_first(0x03) + + endlist +}; + +u8 func0406_elvis_follow_and_do_sa_megaweapon[] = { + label(0x03) + set_shotlist(AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x5f) + + // Injured + label(0x2e) + say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x5f) + endloop(0x12) + + label(0x5f) + if_stage_flag_eq(STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON, TRUE, /*goto*/ 0x1b) + restart_timer + if_distance_to_target_lt(400, /*goto*/ 0x2e) + jog_to_pad(PAD_PAM_00B4) + goto_next(0x0f) + + label(0x2e) + label(0x1c) + run_to_pad(PAD_PAM_00B4) + + beginloop(0x0f) + if_timer_gt(300, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x0f) + + label(0x06) + goto_first(0x5f) + + label(0x2e) + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, 0x0115, /*goto*/ 0x97) + + beginloop(0x97) + if_timer_gt(60, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x97) + + label(0x06) + restart_timer + + label(0x1b) + set_stage_flag(STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON) + unset_self_chrflag(CHRCFLAG_PUSHABLE) + call_rng + if_rand_lt(86, /*goto*/ 0x63) + if_rand_lt(172, /*goto*/ 0x64) + + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x11) + + label(0x63) + chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x11) + + label(0x64) + chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) + goto_next(0x11) + + beginloop(0x11) + if_chr_idle(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_timer_gt(3600, /*goto*/ 0x2e) + endloop(0x11) + + label(0x06) + goto_first(0x1b) + + label(0x2e) + say_quip(CHR_BOND, 0x2c, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + set_self_chrflag(CHRCFLAG_PUSHABLE) + show_hudmsg(CHR_BOND, L_PAM_020) // "Cetan megaweapon has been disabled." + set_stage_flag(STAGEFLAG_MEGAWEAPON_DISABLED) + try_equip_weapon(MODEL_CHRMAIANPISTOL, WEAPON_PHOENIX, 0x00000000, /*goto*/ 0x04) + label(0x04) + set_ailist(CHR_SELF, AILIST_ELVIS_GO_TO_SA_TELEPORT) + goto_first(0x03) + + label(0x60) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON) + endlist +}; + +u8 func0407_elvis_go_to_sa_teleport[] = { + set_shotlist(AILIST_ELVIS_GO_TO_SA_TELEPORT) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x5f) + + // Injured + label(0x2e) + say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x12) + + label(0x06) + set_target_chr(CHR_PRESET) + label(0x5f) + restart_timer + if_distance_to_target_lt(1400, /*goto*/ 0x2e) + jog_to_pad(PAD_PAM_00C0) + goto_next(0x0f) + + label(0x2e) + run_to_pad(PAD_PAM_00C0) + + beginloop(0x0f) + if_enemy_distance_lt_and_los(800, /*goto*/ 0x08) + if_timer_gt(300, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x0f) + + label(0x06) + goto_first(0x5f) + + label(0x2e) + stop_chr + + beginloop(0x10) + if_enemy_distance_lt_and_los(800, /*goto*/ 0x08) + endloop(0x10) + + label(0x06) + restart_timer + label(0x08) + call_rng + if_rand_lt(85, /*goto*/ 0x63) + if_rand_lt(170, /*goto*/ 0x64) + say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + + label(0x63) + say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + + label(0x64) + say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + label(0x2e) + set_shotlist(AILIST_ELVIS_GO_TO_SA_TELEPORT) + set_returnlist(CHR_SELF, AILIST_ELVIS_GO_TO_SA_TELEPORT) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func0403_elvis_give_farsight[] = { + set_shotlist(AILIST_ELVIS_GIVE_FARSIGHT) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Injured + label(0x2e) + say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x12) + + // Healthy + label(0x06) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + + label(0x03) + set_target_chr(CHR_PRESET) + restart_timer + if_distance_to_target_gt(300, /*goto*/ 0x06) + try_jog_to_target(/*goto*/ 0x04) + label(0x06) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + set_target_chr(CHR_PRESET) + if_distance_to_target_lt(200, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + goto_first(0x03) + + label(0x06) + stop_chr + label(0x09) + do_preset_animation(PRESETANIM_TALK5) + speak(CHR_TARGET, L_PAM_018, MP3_02EA, CHANNEL_6, COLOR_04_ORANGE) // "Here, take this gun and keep those Skedar off my b..." + give_object_to_chr(0x73, CHR_TARGET) + yield + set_stage_flag(STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING) + + beginloop(0x0a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2e) + endloop(0x0a) + + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + + // PA + unset_self_flag_bankx(CHRFLAG1_NOOP_00200000, BANK_1) + yield + try_equip_weapon(MODEL_CHRMAIANPISTOL, WEAPON_PHOENIX, 0x00000000, /*goto*/ 0x2f) + label(0x2f) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) + + // SA + label(0x06) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON) + + // Agent + label(0x2e) + yield + try_equip_weapon(MODEL_CHRMAIANPISTOL, WEAPON_PHOENIX, 0x00000000, /*goto*/ 0x2e) + label(0x2e) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) + endlist +}; + +u8 func1003_powernode1[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_POWERNODE1, /*goto*/ 0x2e) + if_door_state(0x03, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + open_door(0x03) + endloop(0x04) + + label(0x2e) + if_object_health_lt(OBJ_POWERNODE1, 250, /*goto*/ 0x2e) + set_object_health(OBJ_POWERNODE1, 0) + set_object_flag(OBJ_POWERNODE1, OBJFLAG_INVINCIBLE) + open_door(0x03) + set_object_flag(0x03, OBJFLAG_DOOR_KEEPOPEN) + goto_first(0x04) + + label(0x2e) + goto_first(0x04) + endlist +}; + +u8 func1004_powernode2[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_POWERNODE2, /*goto*/ 0x2e) + if_door_state(0x04, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + open_door(0x04) + endloop(0x04) + + label(0x2e) + if_object_health_lt(OBJ_POWERNODE2, 250, /*goto*/ 0x2e) + set_object_health(OBJ_POWERNODE2, 0) + set_object_flag(OBJ_POWERNODE2, OBJFLAG_INVINCIBLE) + open_door(0x04) + set_object_flag(0x04, OBJFLAG_DOOR_KEEPOPEN) + goto_first(0x04) + + label(0x2e) + goto_first(0x04) + endlist +}; + +u8 func1005_powernode3[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_POWERNODE3, /*goto*/ 0x2e) + if_door_state(0x05, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + open_door(0x05) + endloop(0x04) + + label(0x2e) + if_object_health_lt(OBJ_POWERNODE3, 250, /*goto*/ 0x2e) + set_object_flag(OBJ_POWERNODE3, OBJFLAG_INVINCIBLE) + set_object_health(OBJ_POWERNODE3, 0) + open_door(0x05) + set_object_flag(0x05, OBJFLAG_DOOR_KEEPOPEN) + goto_first(0x04) + + label(0x2e) + goto_first(0x04) + endlist +}; + +u8 func0c01_midcutscene[] = { + remove_weapon_from_inventory(WEAPON_BACKUPDISK) + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 15) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + play_cutscene_track(MUSIC_DEEPSEA_MIDCUTSCENE) + camera_movement(ANIM_CUT_PAM_MID_CAM) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_MID_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_MID_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_MID_DRC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 4) + enable_object(0xbb) + set_object_flag2(0xbb, OBJFLAG2_04000000) + set_object_flag3(0xbb, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_PAM_MID_CARD, 0xbb, 0x04, 0xffff) + restart_timer + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + show_nonessential_chrs(FALSE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x57) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + #define wait_until_with_images(time, loopid, image1, image2) \ + beginloop(loopid) \ + set_drcaroll_images(CHR_DRCAROLL, image1, image2) \ + if_controller_button_pressed(/*goto*/ 0x57) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(114, 0x63) + speak(CHR_BOND, L_PAM_035, MP3_046D, CHANNEL_10, COLOR_09_BLUE) // "Here goes. I just hope dataDyne haven't done anyth..." + + wait_until(300, 0x64) + play_sound(SFX_0171, CHANNEL_2) + + wait_until(378, 0x65) + play_sound(SFX_04FC, CHANNEL_3) + + wait_until(408, 0x6a) + play_sound(SFX_0423, CHANNEL_5) + + wait_until(440, 0x1a) + play_sound(SFX_04F7, CHANNEL_10) + + wait_until(490, 0x6b) + speak(CHR_BOND, L_PAM_036, MP3_046E, CHANNEL_10, COLOR_04_ORANGE) // "Virus detected." + + wait_until(570, 0x69) + + label(0x6c) + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_X) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_X, DRCAROLLIMAGE_EYESFROWNING) + yield + if_controller_button_pressed(/*goto*/ 0x57) + if_timer_gt(600, /*goto*/ 0x06) + goto_first(0x6c) + + label(0x06) + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_EYESFROWNING) + speak(CHR_BOND, L_PAM_037, MP3_046F, CHANNEL_10, COLOR_09_BLUE) // "Me and my big mouth." + + wait_until(700, 0x6d) + play_sound(SFX_0172, CHANNEL_6) + + wait_until(712, 0x6f) + play_sound(SFX_04F8, CHANNEL_2) + + wait_until(716, 0x70) + play_sound(SFX_0127, CHANNEL_3) + + label(0x71) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_RANDOM25, DRCAROLLIMAGE_RANDOM25) + if_controller_button_pressed(/*goto*/ 0x57) + if_timer_gt(742, /*goto*/ 0x06) + goto_first(0x71) + + label(0x06) + speak(CHR_BOND, L_PAM_038, MP3_0470, CHANNEL_10, COLOR_04_ORANGE) // "Commencing countermeasures. Commenc..... *** ooOOo..." + + wait_until_with_images(746, 0x73, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0128, CHANNEL_5) + + wait_until_with_images(760, 0x75, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(764, 0x76, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESFROWNING) + play_sound(SFX_0173, CHANNEL_2) + + wait_until_with_images(784, 0x79, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0174, CHANNEL_5) + + wait_until_with_images(808, 0x7c, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESFROWNING) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(872, 0x81, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_04FA, CHANNEL_7) + + wait_until_with_images(886, 0x83, 0x00, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0129, CHANNEL_3) + + wait_until_with_images(894, 0x85, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESFROWNING) + play_sound(SFX_012A, CHANNEL_5) + label(0x86) + + wait_until_with_images(914, 0x87, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(980, 0x8b, 0x00, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(992, 0x8e, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_04F9, CHANNEL_2) + + wait_until_with_images(1012, 0x90, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_012B, CHANNEL_4) + + wait_until_with_images(1018, 0x91, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1026, 0x93, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0129, CHANNEL_7) + + wait_until_with_images(1034, 0x94, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_0176, CHANNEL_2) + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + + wait_until_with_images(1036, 0x95, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1068, 0x98, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_0177, CHANNEL_6) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1074, 0x99, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1090, 0xfc, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1112, 0x9e, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0127, CHANNEL_6) + + wait_until_with_images(1124, 0xa0, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_04F7, CHANNEL_2) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1130, 0xa1, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_CAMSPY_SHUTTER, CHANNEL_3) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1188, 0xa7, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1238, 0xaa, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_04F7, CHANNEL_6) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1304, 0xb2, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0129, CHANNEL_2) + + wait_until_with_images(1308, 0xb3, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0178, CHANNEL_3) + + wait_until_with_images(1354, 0xba, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_04F7, CHANNEL_4) + + wait_until_with_images(1406, 0xc5, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1468, 0xcd, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_012B, CHANNEL_5) + + wait_until_with_images(1480, 0xcf, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + play_sound(SFX_0173, CHANNEL_6) + + wait_until_with_images(1487, 0xd0, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_04F9, CHANNEL_2) + emit_sparks(CHR_DRCAROLL) + + wait_until_with_images(1494, 0xd1, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + play_sound(SFX_0171, CHANNEL_3) + + wait_until_with_images(1500, 0xd4, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) + speak(CHR_BOND, L_PAM_039, MP3_0471, CHANNEL_10, COLOR_09_BLUE) // "Dr. Caroll? Are you in control again? Can you stop..." + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + + wait_until(1534, 0xd6) + play_sound(SFX_04F9, CHANNEL_6) + + wait_until(1564, 0xda) + play_sound(SFX_0178, CHANNEL_5) + + wait_until(1630, 0xe0) + play_sound(SFX_0175, CHANNEL_5) + + wait_until(1810, 0xe3) + speak(CHR_BOND, L_PAM_040, MP3_0472, CHANNEL_10, COLOR_04_ORANGE) // "Yes, I'm back again, my dear. But the program has ..." + + wait_until(1810, 0xe5) + play_sound(SFX_0177, CHANNEL_3) + + wait_until(1886, 0xe7) + play_sound(SFX_0175, CHANNEL_5) + + wait_until(2378, 0xe9) + mute_channel(CHANNEL_7) + speak(CHR_BOND, L_PAM_041, MP3_0473, CHANNEL_10, COLOR_09_BLUE) // "What do you mean?" + + wait_until(2510, 0xea) + speak(CHR_BOND, L_PAM_042, MP3_0474, CHANNEL_10, COLOR_04_ORANGE) // "When the program has run, I will have control of a..." + + wait_until(3126, 0xf5) + play_sound(SFX_012B, CHANNEL_5) + + wait_until(3156, 0xf6) + emit_sparks(CHR_DRCAROLL) + + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + + wait_until(3266, 0xf7) + emit_sparks(CHR_DRCAROLL) + + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + + wait_until(3556, 0xf8) + + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + emit_sparks(CHR_DRCAROLL) + + wait_until(3606, 0xf9) + emit_sparks(CHR_DRCAROLL) + + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + + wait_until(3985, 0x10) + play_sound(SFX_0424, CHANNEL_1) + + wait_until(4046, 0xfa) + emit_sparks(CHR_DRCAROLL) + + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) + yield + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) + + wait_until(4106, 0xfb) + emit_sparks(CHR_DRCAROLL) + + label(0x11) + yield + if_controller_button_pressed(/*goto*/ 0x57) + if_timer_gt(4250, /*goto*/ 0x06) + mute_channel(CHANNEL_1) + goto_first(0x11) + + label(0x06) + fade_to_color(0x000000ff, 250) + + wait_until(4500, 0x12) + play_sound(SFX_012B, CHANNEL_5) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x57) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x57) + label(0x2e) + endloop(0x08) + + label(0x57) + mute_channel(CHANNEL_10) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_3) + mute_channel(CHANNEL_2) + mute_channel(CHANNEL_1) + mute_channel(CHANNEL_0) + fade_to_color(0xffffffff, 0) + fade_to_color(0x00000000, 15) + disable_object(0xbb) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_MID_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_MID_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) + unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_MID_DRC, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS, WEAPON_PHOENIX, WEAPON_NONE) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + yield + chr_move_to_pad(CHR_ELVIS, PAD_PAM_0013, 0x01, /*goto*/ 0x2e) + label(0x2e) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_move_to_pad(CHR_BOND, PAD_PAM_019F, 0x01, /*goto*/ 0x2e) + label(0x2e) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + stop_cutscene_track + stop_ambient_track + play_x_track(XREASON_DEFAULT, 10, 60) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_0017, 0x01, /*goto*/ 0x2e) + label(0x2e) + remove_weapon_from_inventory(WEAPON_BACKUPDISK) + set_ailist(CHR_ELVIS, AILIST_ELVIS_WARP_TO_OUTSIDE_DRCAROLL) + show_nonessential_chrs(TRUE) + set_stage_flag(STAGEFLAG_MIDCUTSCENE_FINISHED) + set_ailist(CHR_SELF, GAILIST_END_CINEMA) + endlist +}; + +u8 func042d_elvis_warp_to_outside_drcaroll[] = { + stop_chr + + beginloop(0x04) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_0017, 0x01, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + stop_chr + set_ailist(CHR_SELF, AILIST_ELVIS_RUN_TO_EXIT) + endlist +}; + +u8 func0c02_outro[] = { + show_nonessential_chrs(FALSE) + hide_countdown_timer + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_DEEPSEA_OUTRO) + camera_movement(ANIM_CUT_PAM_OUTRO_CAM) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + restart_timer + + // @bug: Missing button checks makes the outro unskippable until a certain + // point. + #define blow_mine1(time, loopid, msg, mine, pad) \ + beginloop(loopid) \ + if_timer_gt(time, /*goto*/ 0x2e) \ + endloop(loopid) \ + label(0x2e) \ + enable_object(mine) \ + yield \ + move_object_to_pad(mine, pad) \ + yield \ + destroy_object(mine) + + #define blow_mine2(time, loopid, msg1, msg2, mine, pad) \ + beginloop(loopid) \ + if_timer_gt(time, /*goto*/ 0x2e) \ + endloop(loopid) \ + label(0x2e) \ + enable_object(mine) \ + yield \ + move_object_to_pad(mine, pad) \ + yield \ + destroy_object(mine) + + blow_mine1(40, 0x63, '1', 0x76, 0x028c) + blow_mine1(72, 0x64, '2', 0x77, 0x028b) + blow_mine1(155, 0x65, '3', 0x78, 0x028a) + blow_mine1(176, 0x66, '4', 0x79, 0x0289) + blow_mine1(194, 0x6a, '5', 0x7a, 0x0288) + blow_mine1(252, 0x6b, '6', 0x7b, 0x0287) + blow_mine1(300, 0x6c, '7', 0x7c, 0x0286) + blow_mine1(331, 0x6d, '8', 0x7d, 0x0285) + blow_mine1(355, 0x6e, '9', 0x7e, 0x0284) + blow_mine2(411, 0x6f, '1','0', 0x7f, 0x0283) + blow_mine2(441, 0x70, '1','1', 0x80, 0x0282) + blow_mine2(485, 0x71, '1','2', 0x81, 0x0281) + blow_mine2(543, 0x72, '1','3', 0x82, 0x0280) + blow_mine2(594, 0x73, '1','4', 0x83, 0x027f) + blow_mine2(607, 0x74, '1','5', 0x84, 0x027e) + blow_mine2(629, 0x75, '1','6', 0x85, 0x027d) + blow_mine2(671, 0x76, '1','7', 0x86, 0x027c) + blow_mine2(720, 0x77, '1','8', 0x87, 0x027b) + blow_mine2(776, 0x78, '1','9', 0x88, 0x027a) + blow_mine2(865, 0x79, '2','0', 0x89, 0x0279) + blow_mine2(914, 0x7a, '2','1', 0x8a, 0x0278) + blow_mine2(991, 0x7b, '2','2', 0x8b, 0x0277) + + beginloop(0x7c) + if_timer_gt(1011, /*goto*/ 0x2e) + endloop(0x7c) + + label(0x2e) + + blow_mine2(1038, 0x7d, '2','4', 0x8d, 0x0275) + blow_mine2(1071, 0x7e, '2','5', 0x8e, 0x0274) + blow_mine2(1090, 0x7f, '2','6', 0x8f, 0x0273) + blow_mine2(1110, 0x80, '2','7', 0x90, 0x0272) + blow_mine2(1137, 0x81, '2','8', 0x91, 0x0271) + + wait_until(1150, 0x8e) + open_door(0xb3) + open_door(0xb4) + open_door(0xb5) + open_door(0xb6) + + blow_mine2(1191, 0x82, '2','9', 0x92, 0x0270) + blow_mine2(1214, 0x83, '3','0', 0x93, 0x026f) + blow_mine2(1266, 0x84, '3','1', 0x94, 0x026e) + blow_mine2(1285, 0x85, '3','2', 0x95, 0x026d) + blow_mine2(1296, 0x86, '3','3', 0x96, 0x026c) + blow_mine2(1320, 0x87, '3','4', 0x97, 0x026b) + + wait_until(1355, 0x8f) + close_door(0xb5) + close_door(0xb6) + + blow_mine2(1360, 0x88, '3','5', 0x98, 0x026a) + blow_mine2(1390, 0x89, '3','6', 0x99, 0x0269) + blow_mine2(1412, 0x8a, '3','7', 0x9a, 0x0268) + + wait_until(1416, 0x90) + close_door(0xb3) + close_door(0xb4) + + blow_mine2(1424, 0x8b, '3','8', 0x9b, 0x0267) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x57) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x57) + label(0x2e) + endloop(0x08) + + label(0x57) + if_all_objectives_complete(/*goto*/ 0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_INVINCIBLE) + explosions_around_chr(CHR_BOND) + label(0x2e) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) + enter_firstperson + grant_control(CHR_BOND) + restart_timer + + beginloop(0x0d) + if_timer_gt(120, /*goto*/ 0x2f) + endloop(0x0d) + + label(0x2f) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) + explosions_around_chr(CHR_COOP) + label(0x2e) + + beginloop(0x0e) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2e) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_intro[] = { + set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_EYESFROWNING) + chr_draw_weapon_in_cutscene(CHR_BOND, WEAPON_FALCON2_SCOPE) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_DEEPSEA_INTRO) + camera_movement(ANIM_CUT_PAM_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_INTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + set_object_flag(0x07, OBJFLAG_DEACTIVATED) + set_object_flag2(0x07, OBJFLAG2_04000000) + set_object_flag3(0x07, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_PAM_INTRO_LIFT, 0x07, 0x04, 0xffff) + set_chr_chrflag(0x40, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x40, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x40, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x40, 4) + restart_timer + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + + wait_until(0, 0x63) + play_sound_from_object2(CHANNEL_5, 0x07, SFX_DOOR_81AA, 0x00, 0x00) + + wait_until(260, 0x8a) + play_sound(SFX_FOOTSTEP_80D5, CHANNEL_10) + + wait_until(280, 0x8b) + play_sound(SFX_FOOTSTEP_80D4, CHANNEL_10) + + wait_until(300, 0x89) + play_sound(SFX_CLOAK_ON, CHANNEL_7) + set_chr_hiddenflag(0x40, CHRHFLAG_CLOAKED) + play_sound(SFX_FOOTSTEP_80D7, CHANNEL_10) + + wait_until(320, 0x8c) + play_sound(SFX_FOOTSTEP_80D6, CHANNEL_10) + + wait_until(852, 0x64) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(1210, 0x65) + speak(CHR_BOND, L_PAM_031, MP3_0469, CHANNEL_10, COLOR_04_ORANGE) // "This doesn't seem normal. No one's around." + + wait_until(1266, 0x66) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(1300, 0x6a) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(1430, 0x6b) + mute_channel(CHANNEL_5) + play_sound_from_object2(CHANNEL_5, 0x07, SFX_81A9, 0x00, 0x00) + + wait_until(1522, 0x6c) + speak(CHR_BOND, L_PAM_032, MP3_046A, CHANNEL_10, COLOR_09_BLUE) // "No signs of conflict. No spent ammo cases or bulle..." + + wait_until(1548, 0x6d) + play_sound(SFX_0174, CHANNEL_7) + + wait_until(1594, 0x6e) + play_sound(SFX_0175, CHANNEL_7) + + wait_until(1662, 0x6f) + play_sound(SFX_0176, CHANNEL_7) + + wait_until(1762, 0x70) + play_sound(SFX_0177, CHANNEL_7) + + wait_until(1945, 0x71) + speak(CHR_BOND, L_PAM_033, MP3_046B, CHANNEL_10, COLOR_04_ORANGE) // "But there ought to be a rear guard at least. It ma..." + + wait_until(1958, 0x72) + play_sound(SFX_0178, CHANNEL_7) + + wait_until(2066, 0x73) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(2118, 0x74) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(2167, 0x75) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(2213, 0x76) + play_sound(SFX_0174, CHANNEL_7) + + wait_until(2346, 0x77) + play_sound(SFX_0175, CHANNEL_7) + + wait_until(2362, 0x78) + play_sound(SFX_0176, CHANNEL_7) + + wait_until(2376, 0x79) + play_sound(SFX_0177, CHANNEL_7) + + wait_until(2390, 0x7a) + play_sound(SFX_0178, CHANNEL_7) + + wait_until(2420, 0x7b) + speak(CHR_BOND, L_PAM_034, MP3_046C, CHANNEL_10, COLOR_09_BLUE) // "There has to be someone farther inside. Cover me." + + wait_until(2426, 0x7c) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(2470, 0x7d) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(2485, 0x7e) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(2520, 0x7f) + play_sound(SFX_0174, CHANNEL_7) + + wait_until(2545, 0x80) + play_sound(SFX_0175, CHANNEL_7) + + wait_until(2582, 0x81) + play_sound(SFX_0171, CHANNEL_7) + + wait_until(2585, 0x82) + play_sound(SFX_0176, CHANNEL_6) + + wait_until(2720, 0x83) + play_sound(SFX_0172, CHANNEL_7) + + wait_until(2842, 0x84) + play_sound(SFX_0173, CHANNEL_7) + + wait_until(2880, 0x85) + play_sound(SFX_0174, CHANNEL_7) + + wait_until(2898, 0x86) + play_sound(SFX_0175, CHANNEL_7) + + wait_until(3040, 0x87) + play_sound(SFX_0176, CHANNEL_7) + + wait_until(3042, 0x88) + play_sound(SFX_0177, CHANNEL_6) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2e) + goto_next(0x57) + + label(0x2e) + if_controller_button_pressed(/*goto*/ 0x57) + label(0x2e) + endloop(0x08) + + label(0x57) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_10) + remove_chr(0x40) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PAM_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) + if_coop_mode(/*goto*/ 0x45) + unset_object_flag(0x07, OBJFLAG_DEACTIVATED) + unset_object_flag2(0x07, OBJFLAG2_04000000) + set_object_flag3(0x07, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_PAM_INTRO_LIFT, 0x07, 0x01, 0xfffe) + goto_next(0x46) + + label(0x45) + disable_object(0x07) + label(0x46) + stop_cutscene_track + stop_ambient_track + label(0x0d) + enter_firstperson + yield + set_ailist(CHR_ELVIS, AILIST_INIT_ELVIS) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042f_init_pelagic_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(20) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 70) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0430_unused[] = { + set_accuracy(20) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(70) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1006_msg_thiswillhelpus[] = { + beginloop(0x04) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) + if_objective_complete(0, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x08) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) + if_timer_gt(180, /*goto*/ 0x2e) + endloop(0x08) + + label(0x2e) + speak(CHR_P1P2, L_PAM_010, MP3_03D4, CHANNEL_6, COLOR_04_ORANGE) // "This will help us to get round the ship quicker." + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_msg_antibodymasking[] = { + restart_timer + + beginloop(0x04) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) + endloop(0x04) + + // Unreachable + label(0x2e) + speak(CHR_BOND, L_PAM_011, MP3_03D5, CHANNEL_6, COLOR_09_BLUE) // "This antibody masking will protect us from the aut..." + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_msg_theresdrcaroll[] = { + beginloop(0x04) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) + + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x0d) + + if_door_state(0xae, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_chr_in_room(CHR_ELVIS, 0x00, 0x004c, /*goto*/ 0x2e) + goto_next(0x0d) + + label(0x2e) + if_chr_not_talking(CHR_ELVIS, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + speak(CHR_BOND, L_PAM_012, MP3_03D6, CHANNEL_6, COLOR_04_ORANGE) // "There's Dr. Caroll. Let's see if we can reverse wh..." + + // Elvis dead, Dr Caroll dead, or Elvis didn't get teleported + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_msg_getoutofhere[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x08) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) + if_timer_gt(120, /*goto*/ 0x2e) + endloop(0x08) + + label(0x2e) + speak(CHR_BOND, L_PAM_013, MP3_03D7, CHANNEL_6, COLOR_04_ORANGE) // "We have to get out of here!" + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Entry point for all of Joanna's teleports. + * + * Map of how these ailists call each other: + * + * 100a func100a_bond_teleports + * - calls 0414 teleport_bond_to_sapa + * - calls 0416 teleport_bond_to_a_pa_drcaroll + * - calls 0415 teleport_bond_to_drcaroll + * - calls 0415 teleport_bond_to_drcaroll + */ +u8 func100a_bond_teleports[] = { + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x04) + endloop(0x1f) + + beginloop(0x04) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_STARTAREA_TELEPORT, /*goto*/ 0x59) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x09) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_DONE_FIRST_TELEPORT, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + // Done first teleport + label(0x2e) + if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) + goto_first(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + goto_first(0x04) + + // Done first teleport and difficulty is SA + label(0x2e) + set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + if_objective_complete(1, /*goto*/ 0x2e) + goto_first(0x04) + + // Done first teleport, difficult is SA and megaweapon is disabled + label(0x2e) + unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + goto_first(0x04) + + // + // At start area teleport + // + label(0x59) + set_stage_flag(STAGEFLAG_DONE_FIRST_TELEPORT) + revoke_control(CHR_BOND, 0) + teleport_to_pad(PAD_STARTAREA_TELEPORT, CHR_BOND) + + label(0x5b) + if_teleport_full_white(/*goto*/ 0x5e, CHR_BOND) + yield + goto_first(0x5b) + + label(0x5e) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x64) + set_ailist(CHR_BOND, AILIST_TELEPORT_BOND_TO_SAPA) + unset_stage_flag(STAGEFLAG_TELEPORT_DONE) + + beginloop(0x31) + if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) + endloop(0x31) + + label(0x2e) + grant_control(CHR_BOND) + teleport_to_pad(PAD_PAM_0000, CHR_BOND) + goto_first(0x04) + + // + // At SA/PA area teleport + // + beginloop(0x09) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + if_objective_complete(1, /*goto*/ 0x2e) + reloop(0x09) + + // Teleport is active + label(0x2e) + unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x59) + endloop(0x09) + + label(0x59) + teleport_to_pad(PAD_PAM_00C0, CHR_BOND) + revoke_control(CHR_BOND, 0) + + label(0x5c) + if_teleport_full_white(/*goto*/ 0x5e, CHR_BOND) + yield + goto_first(0x5c) + + label(0x5e) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x64) + goto_next(0x2e) + + // + // At start area teleport on Agent, or SA/PA area teleport on SA + // + label(0x64) + goto_next(0x2e) + + label(0x2e) + set_ailist(CHR_BOND, AILIST_TELEPORT_BOND_TO_A_PA_DRCAROLL) + unset_stage_flag(STAGEFLAG_TELEPORT_DONE) + + beginloop(0x32) + if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) + endloop(0x32) + + label(0x2e) + grant_control(CHR_BOND) + teleport_to_pad(PAD_PAM_0000, CHR_BOND) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + label(0x06) + goto_first(0x04) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // + // At Agent or PA teleport + // + beginloop(0x08) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x59) + if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x5a) + endloop(0x08) + + // Agent teleport + label(0x59) + revoke_control(CHR_BOND, 0) + teleport_to_pad(PAD_PAM_0054, CHR_BOND) + goto_next(0x5d) + + // PA teleport + label(0x5a) + revoke_control(CHR_BOND, 0) + teleport_to_pad(PAD_PAM_0111, CHR_BOND) + + label(0x5d) + if_teleport_full_white(/*goto*/ 0x5e, CHR_BOND) + yield + goto_first(0x5d) + + label(0x5e) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + set_ailist(CHR_BOND, AILIST_TELEPORT_BOND_TO_DRCAROLL) + unset_stage_flag(STAGEFLAG_TELEPORT_DONE) + + beginloop(0x33) + if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) + endloop(0x33) + + label(0x2e) + grant_control(CHR_BOND) + teleport_to_pad(PAD_PAM_0000, CHR_BOND) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0414_teleport_bond_to_sapa[] = { + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + + label(0x08) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) + + beginloop(0x63) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01C6, 0x01, /*goto*/ 0x06) + endloop(0x63) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + label(0x62) + + beginloop(0x64) + chr_move_to_pad(CHR_SELF, PAD_SAPAAREA_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x64) + + label(0x06) + yield + stop_chr + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) + label(0x62) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_teleport_bond_to_drcaroll[] = { + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + + beginloop(0x65) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BF, 0x01, /*goto*/ 0x06) + endloop(0x65) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + goto_next(0x63) + label(0x07) + show_hudmsg(CHR_BOND, L_PAM_014) // "Elvis has been killed." + + label(0x62) + + beginloop(0x63) + chr_move_to_pad(CHR_SELF, PAD_DRCAROLLROOM_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x63) + + label(0x06) + stop_chr + yield + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + + label(0x62) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * If Agent: Warp to Agent area + * If SA: Warp to Dr Caroll Area + * If PA: Warp to PA area + */ +u8 func0416_teleport_bond_to_a_pa_drcaroll[] = { + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + + label(0x62) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) + + // PA + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + + beginloop(0x66) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BE, 0x01, /*goto*/ 0x06) + endloop(0x66) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + label(0x62) + label(0x07) + + beginloop(0x67) + chr_move_to_pad(CHR_SELF, PAD_PAAREA_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x67) + + label(0x06) + label(0x2e) + stop_chr + yield + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + + label(0x62) + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA + label(0x08) + set_ailist(CHR_SELF, AILIST_TELEPORT_BOND_TO_DRCAROLL) + + // Agent + label(0x09) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + + beginloop(0x6b) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_0040, 0x01, /*goto*/ 0x06) + endloop(0x6b) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + label(0x62) + label(0x07) + + beginloop(0x68) + chr_move_to_pad(CHR_SELF, PAD_AGENTAREA_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x68) + + label(0x06) + label(0x2e) + stop_chr + yield + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) + if_chr_deadish(CHR_COOP, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) + label(0x62) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Entry point for all of Velvet's teleports. + * + * Map of how these ailists call each other: + * + * 100b func100b_coop_teleports + * - calls 0417 teleport_coop_to_sapa + * - calls 0419 teleport_coop_to_a_pa_drcaroll + * - calls 0418 teleport_coop_to_drcaroll + * - calls 0418 teleport_coop_to_drcaroll + */ +u8 func100b_coop_teleports[] = { + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) + goto_next(0x1f) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x1f) + if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x04) + endloop(0x1f) + + beginloop(0x04) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_STARTAREA_TELEPORT, /*goto*/ 0x59) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x09) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x08) + endloop(0x04) + + // + // At start area teleport + // + label(0x59) + revoke_control(CHR_COOP, 0) + teleport_to_pad(PAD_STARTAREA_TELEPORT, CHR_COOP) + + label(0x5b) + if_teleport_full_white(/*goto*/ 0x5e, CHR_COOP) + yield + goto_first(0x5b) + + label(0x5e) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + label(0x62) + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x64) + set_ailist(CHR_COOP, AILIST_TELEPORT_COOP_TO_SAPA) + unset_stage_flag(STAGEFLAG_TELEPORT_DONE) + + beginloop(0x31) + if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) + endloop(0x31) + + label(0x2e) + grant_control(CHR_COOP) + teleport_to_pad(PAD_PAM_0000, CHR_COOP) + goto_first(0x04) + + // + // At SA/PA area teleport + // + beginloop(0x09) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2e) + set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + if_objective_complete(1, /*goto*/ 0x2e) + reloop(0x09) + + label(0x2e) + unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x59) + endloop(0x09) + + label(0x59) + teleport_to_pad(PAD_PAM_00C0, CHR_COOP) + revoke_control(CHR_COOP, 0) + + label(0x5c) + if_teleport_full_white(/*goto*/ 0x5e, CHR_COOP) + yield + goto_first(0x5c) + + label(0x5e) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + label(0x62) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x64) + goto_next(0x2e) + + label(0x64) + goto_next(0x2e) + + label(0x2e) + set_ailist(CHR_COOP, AILIST_TELEPORT_COOP_TO_A_PA_DRCAROLL) + unset_stage_flag(STAGEFLAG_TELEPORT_DONE) + + beginloop(0x32) + if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) + endloop(0x32) + + label(0x2e) + grant_control(CHR_COOP) + teleport_to_pad(PAD_PAM_0000, CHR_COOP) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + label(0x06) + goto_first(0x04) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // + // At Agent or PA area teleport + // + beginloop(0x08) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x59) + if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x5a) + endloop(0x08) + + // Agent teleport + label(0x59) + revoke_control(CHR_COOP, 0) + teleport_to_pad(PAD_PAM_0054, CHR_COOP) + goto_next(0x5d) + + // PA teleport + label(0x5a) + revoke_control(CHR_COOP, 0) + teleport_to_pad(PAD_PAM_0111, CHR_COOP) + + label(0x5d) + if_teleport_full_white(/*goto*/ 0x5e, CHR_COOP) + yield + goto_first(0x5d) + + label(0x5e) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + label(0x62) + set_ailist(CHR_COOP, AILIST_TELEPORT_COOP_TO_DRCAROLL) + unset_stage_flag(STAGEFLAG_TELEPORT_DONE) + + beginloop(0x33) + if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) + endloop(0x33) + + label(0x2e) + grant_control(CHR_COOP) + teleport_to_pad(PAD_PAM_0000, CHR_COOP) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0417_teleport_coop_to_sapa[] = { + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + + label(0x08) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) + + beginloop(0x63) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01C6, 0x01, /*goto*/ 0x06) + endloop(0x63) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + label(0x62) + + beginloop(0x64) + chr_move_to_pad(CHR_SELF, PAD_SAPAAREA_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x64) + + label(0x06) + yield + stop_chr + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) + + label(0x62) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0418_teleport_coop_to_drcaroll[] = { + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + + beginloop(0x65) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BF, 0x01, /*goto*/ 0x06) + endloop(0x65) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + goto_next(0x63) + + label(0x07) + show_hudmsg(CHR_BOND, L_PAM_014) // "Elvis has been killed." + label(0x62) + + beginloop(0x63) + chr_move_to_pad(CHR_SELF, PAD_DRCAROLLROOM_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x63) + + label(0x06) + stop_chr + yield + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + label(0x62) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * If Agent: Warp to Agent area + * If SA: Warp to Dr Caroll Area + * If PA: Warp to PA area + */ +u8 func0419_teleport_coop_to_a_pa_drcaroll[] = { + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) + label(0x62) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) + + // PA + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + + beginloop(0x66) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BE, 0x01, /*goto*/ 0x06) + endloop(0x66) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + label(0x62) + label(0x07) + + beginloop(0x67) + chr_move_to_pad(CHR_SELF, PAD_PAAREA_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x67) + + label(0x06) + label(0x2e) + stop_chr + yield + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + label(0x62) + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA + label(0x08) + set_ailist(CHR_SELF, AILIST_TELEPORT_COOP_TO_DRCAROLL) + + // Agent + label(0x09) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + label(0x61) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) + + beginloop(0x6b) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_0040, 0x01, /*goto*/ 0x06) + endloop(0x6b) + + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + label(0x62) + label(0x07) + + beginloop(0x68) + chr_move_to_pad(CHR_SELF, PAD_AGENTAREA_ENTRY, 0x01, /*goto*/ 0x06) + endloop(0x68) + + label(0x06) + label(0x2e) + stop_chr + yield + set_stage_flag(STAGEFLAG_TELEPORT_DONE) + if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) + if_chr_deadish(CHR_BOND, /*goto*/ 0x61) + goto_next(0x62) + + label(0x61) + set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) + label(0x62) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Wait until not in sight of player (usually immediately), then unhide. + * + * Once the teleportals are activated, this is assigned to 3 guards at the + * entrance to the grotto thing. + */ +u8 func041c_teleport_activation_responder[] = { + beginloop(0x04) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2e) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2e) + unset_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, AILIST_INIT_SNIPER) + label(0x2e) + endloop(0x04) + + endlist +}; + +u8 func041a_init_sniper[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + + // SA and PA + set_accuracy(30) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(70) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_SNIPER_WAIT_FOR_DETECTION) + + // Agent + label(0x2e) + set_accuracy(20) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(70) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_SNIPER_WAIT_FOR_DETECTION) + endlist +}; + +u8 func041b_sniper_wait_for_detection[] = { + unset_self_chrflag(CHRCFLAG_UNEXPLODABLE) + yield + set_shotlist(AILIST_SNIPER) + label(0x06) + set_reaction_speed(100) + set_shotlist(AILIST_SNIPER) + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x2e) + if_enemy_distance_lt_and_los(1000, /*goto*/ 0x2e) + if_saw_death(0x00, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_distance_to_target_lt(400, /*goto*/ 0x06) + if_target_in_fov(30, /*goto*/ 0x06) + if_chr_in_view(/*goto*/ 0x06) + if_saw_death(0x00, /*goto*/ 0x06) + if_alertness(100, OPERATOR_GREATER_THAN, /*goto*/ 0x06) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + if_timer_gt(180, /*goto*/ 0x06) + label(0x2e) + endloop(0x04) + + label(0x06) + increase_squadron_alertness(100) + set_self_chrflag(CHRCFLAG_00040000) + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + set_ailist(CHR_SELF, AILIST_SNIPER) + endlist +}; + +u8 func041d_sniper[] = { + set_self_chrflag(CHRCFLAG_00000040) + set_shotlist(AILIST_SNIPER) + set_chr_cloaked(CHR_SELF, TRUE, FALSE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x03) + + // Dying + label(0x06) + goto_next(0x10) + + // Alive + label(0x03) + restart_timer + cmd0139(70, 0x02, TRUE) + + beginloop(0x63) + chr_toggle_p1p2(CHR_SELF) + if_can_see_target(/*goto*/ 0x2e) + if_enemy_distance_lt_and_los(1000, /*goto*/ 0x2f) + goto_next(0x2f) + + label(0x2e) + set_target_chr(CHR_P1P2) + label(0x2f) + if_target_is_player(/*goto*/ 0x2f) + goto_next(0x2e) + + label(0x2f) + if_timer_gt(180, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x63) + + label(0x06) + stop_chr + call_rng + if_rand_gt(128, /*goto*/ 0x06) + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + set_chrpreset(CHR_TARGET) + goto_next(0x06) + + // Unreachable + if_target_is_player(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_within_targets_fovx_by_angle(20, /*goto*/ 0x0d) + label(0x06) + if_can_see_target(/*goto*/ 0x2e) + goto_next(0x0d) + + label(0x2e) + restart_timer + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + label(0x0a) + label(0x2e) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2e) + label(0x2e) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x0c) + endloop(0x0b) + + label(0x0c) + if_target_is_player(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_chr_injured_target(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + set_stage_flag(STAGEFLAG_PURPLE_GUARD_SHOT_JO_OR_ELVIS) + label(0x06) + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + label(0x0d) + set_target_chr(CHR_PRESET) + goto_first(0x03) + + label(0x10) + if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_blonde[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unset_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_shotlist(GAILIST_ALERTED) + + beginloop(0x08) + if_saw_injury(0x00, /*goto*/ 0x06) + if_saw_death(0x00, /*goto*/ 0x06) + if_can_see_target(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func100c_countdown_timer[] = { + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x2e) + endloop(0x03) + + label(0x2e) + set_countdown_timer(60) + show_countdown_timer + start_countdown_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_countdown_timer_lt(1, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x000c, /*goto*/ 0x2e) + endloop(0x04) + + // Timer expired + label(0x06) + set_stage_flag(STAGEFLAG_TIMER_EXPIRED) + yield + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Player escaped + label(0x2e) + show_hudmsg(CHR_P1P2, L_PAM_016) // "Cetan ship evacuation successful." + set_stage_flag(STAGEFLAG_ESCAPED) + restart_timer + stop_countdown_timer + hide_countdown_timer + + label(0x09) + yield + label(0x2e) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) + goto_next(0x06) + + // Both players dead + label(0x2e) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x06) + set_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_check_elvis_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + show_hudmsg(CHR_BOND, L_PAM_014) // "Elvis has been killed." + set_stage_flag(STAGEFLAG_ALLY_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_check_drcaroll_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + show_hudmsg(CHR_BOND, L_PAM_015) // "Dr. Caroll has been killed." + set_stage_flag(STAGEFLAG_ALLY_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040f_miniskedar_send_clones[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x04) + goto_next(0x52) + reloop(0x04) + + label(0x52) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x52) + reloop(0x04) + + label(0x52) + try_spawn_clone2(CHR_SELF, AILIST_INIT_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + yield + endloop(0x04) + + endlist +}; + +u8 func040e_init_miniskedar[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_accuracy(0) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 20) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_MINISKEDAR) + endlist +}; + +u8 func040f_miniskedar[] = { + set_shotlist(AILIST_MINISKEDAR) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + yield + restart_timer + + beginloop(0x10) + if_timer_gt(30, /*goto*/ 0x2e) + endloop(0x10) + + label(0x2e) + say_quip(CHR_BOND, QUIP_GRENADE2, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + + beginloop(0x03) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2e) + label(0x2e) + if_can_see_target(/*goto*/ 0x2e) + goto_next(0x1e) + + label(0x2e) + if_distance_to_target_lt(400, /*goto*/ 0x30) + label(0x1e) + restart_timer + + label(0x09) + restart_timer + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) + label(0x06) + try_run_to_target(/*goto*/ 0x0a) + + beginloop(0x0a) + if_can_see_target(/*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_distance_to_target_lt(400, /*goto*/ 0x30) + label(0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + goto_first(0x09) + + label(0x30) + restart_timer + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + beginloop(0x0b) + if_timer_gt(30, /*goto*/ 0x06) + reloop(0x0b) + + label(0x2e) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + say_quip(CHR_BOND, QUIP_RETREAT1, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00) + if_distance_to_target_lt(200, /*goto*/ 0x2f) + miniskedar_try_pounce(0x04, 0x000e, /*goto*/ 0x34) + reloop(0x03) + + beginloop(0x34) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x34) + + label(0x2e) + restart_timer + if_chr_injured_target(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + label(0x2f) + retreat(GOPOSFLAG_RUN, 1) + + beginloop(0x0c) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + endloop(0x03) + + endlist +}; + +u8 func1010_agent_hallway_spawner[] = { + // This flag is also set when Elvis gives you the Farsight, so perhaps that + // used to be the trigger for miniskedar spawning but was changed so they + // spawn immediately. + set_stage_flag(STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING) + + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING, TRUE, /*goto*/ 0x2e) + endloop(0x03) + + label(0x2e) + set_ailist(0x25, AILIST_MINISKEDAR_SEND_CLONES) + set_ailist(0x26, AILIST_MINISKEDAR_SEND_CLONES) + + // Wait until player in a certain room + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0054, /*goto*/ 0x2e) + endloop(0x04) + + // Activate a different set of miniskedar + label(0x2e) + remove_chr(0x25) + remove_chr(0x26) + set_ailist(0x27, AILIST_MINISKEDAR_SEND_CLONES) + set_ailist(0x28, AILIST_MINISKEDAR_SEND_CLONES) + + // Wait until player in a certain room + beginloop(0x08) + chr_toggle_p1p2(CHR_P1P2) + if_chr_in_room(CHR_P1P2, 0x00, 0x005a, /*goto*/ 0x2e) + endloop(0x08) + + // Activate a different set of miniskedar + label(0x2e) + remove_chr(0x27) + remove_chr(0x28) + set_ailist(0x2b, AILIST_MINISKEDAR_SEND_CLONES) + set_ailist(0x2a, AILIST_MINISKEDAR_SEND_CLONES) + + // Wait until player in a certain room + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0067, /*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0411_hide[] = { +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_INVINCIBLE) +#endif + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_unused[] = { + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to 3 guards who appear after teleports activated. + */ +u8 func0413_cloak_and_hide[] = { + set_chr_cloaked(CHR_SELF, TRUE, FALSE) + stop_chr + yield + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_sa_megaweapon_spawner[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON, TRUE, /*goto*/ 0x1f) + endloop(0x04) + + label(0x1f) + restart_timer + + beginloop(0x20) + if_stage_flag_eq(STAGEFLAG_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x06) + + // Megaweapon not disabled yet - spawn every 8 seconds + if_timer_lt(480, /*goto*/ 0x21) + goto_next(0x2e) + + // Megaweapon disabled - spawn every 48 seconds + label(0x06) + if_timer_lt(2880, /*goto*/ 0x21) + + // Consider spawn + label(0x2e) + if_num_chrs_in_squadron_gt(5, 0x0e, /*goto*/ 0x21) + call_rng + if_rand_gt(86, /*goto*/ 0x63) + if_rand_gt(172, /*goto*/ 0x64) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01F4, AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x22) + goto_next(0x21) + + label(0x63) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01F5, AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x22) + goto_next(0x21) + + label(0x64) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01F6, AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x22) + goto_next(0x21) + + label(0x21) + endloop(0x20) + + label(0x22) + yield + rebuild_teams + rebuild_squadrons + goto_first(0x1f) + + endlist +}; + +// SA megaweapon miniskedar +u8 func041e_init_sa_megaweapon_miniskedar[] = { + set_squadron(SQUADRON_0E) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) + endlist +}; + +/** + * On PA, in the room with 5 cylinders that must be destroyed to open the door. + */ +#define doorcylinder_logic(glass1, glass2, glass3, mine, stageflag) \ + beginloop(0x04) \ + if_object_in_good_condition(glass1, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass2, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass3, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + endloop(0x04) \ + \ + label(0x06) \ + assign_sound(SFX_8147, CHANNEL_7) \ + control_sound_from_object(CHANNEL_7, mine, TRUE) \ + yield \ + destroy_object(mine) \ + destroy_object(glass1) \ + destroy_object(glass2) \ + destroy_object(glass3) \ + set_stage_flag(stageflag) \ + set_ailist(CHR_SELF, 0x0408) + +u8 func1013_pa_doorcylinder1[] = { + set_lights_state(0x00a1, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00a9, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00ac, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00b4, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00b7, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00bf, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00c0, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00c1, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00c2, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x00c3, LIGHTOP_4, 0x00, 0xff, 0xb4) + set_lights_state(0x006c, LIGHTOP_4, 0x00, 0xff, 0xf0) + + doorcylinder_logic(0x11, 0x12, 0x13, 0x9c, STAGEFLAG_PA_EARLYDOORCYLINDER1_DESTROYED) + endlist +}; + +u8 func1014_pa_doorcylinder2[] = { + doorcylinder_logic(0x14, 0x15, 0x16, 0x9d, STAGEFLAG_PA_EARLYDOORCYLINDER2_DESTROYED) + endlist +}; + +u8 func1015_pa_doorcylinder3[] = { + doorcylinder_logic(0x17, 0x18, 0x19, 0x9e, STAGEFLAG_PA_EARLYDOORCYLINDER3_DESTROYED) + endlist +}; + +u8 func1016_pa_doorcylinder4[] = { + doorcylinder_logic(0x1a, 0x1b, 0x1c, 0x9f, STAGEFLAG_PA_EARLYDOORCYLINDER4_DESTROYED) + endlist +}; + +u8 func1017_pa_doorcylinder5[] = { + doorcylinder_logic(0x1d, 0x1e, 0x1f, 0xa0, STAGEFLAG_PA_EARLYDOORCYLINDER5_DESTROYED) + endlist +}; + +u8 func0408_check_pa_earlydoorcylinders_destroyed[] = { + label(0x04) + yield + if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER1_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER2_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER3_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER4_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER5_DESTROYED, TRUE, /*goto*/ 0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x08) + if_door_state(0x09, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_lights_state(0x008b, LIGHTOP_3, 0xff, 0x0a, 0x78) + set_lights_state(0x00bf, LIGHTOP_3, 0xff, 0x0a, 0x78) + set_lights_state(0x00c0, LIGHTOP_3, 0xff, 0x0a, 0x78) + set_lights_state(0x00c1, LIGHTOP_3, 0xff, 0x0a, 0x78) + set_lights_state(0x00c2, LIGHTOP_3, 0xff, 0x0a, 0x78) + set_lights_state(0x00c3, LIGHTOP_3, 0xff, 0x0a, 0x78) + open_door(0x09) + open_door(0x0a) + goto_first(0x08) + + endlist +}; + +#define pa_cylinder(glass, mine) \ + /* Wait until any object destroyed */ \ + beginloop(0x04) \ + if_object_in_good_condition(glass, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 1, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 2, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 3, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 4, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 5, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 6, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 7, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 8, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 9, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 10, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + if_object_in_good_condition(glass + 11, /*goto*/ 0x2e) \ + goto_next(0x06) \ + label(0x2e) \ + endloop(0x04) \ + \ + label(0x06) \ + destroy_object(mine) \ + destroy_object(glass) \ + destroy_object(glass + 1) \ + destroy_object(glass + 2) \ + destroy_object(glass + 3) \ + destroy_object(glass + 4) \ + destroy_object(glass + 5) \ + destroy_object(glass + 6) \ + destroy_object(glass + 7) \ + destroy_object(glass + 8) \ + destroy_object(glass + 9) \ + destroy_object(glass + 10) \ + destroy_object(glass + 11) + +u8 func1018_pa_door1[] = { + pa_cylinder(0x20, 0xa1) + set_stage_flag(STAGEFLAG_PA_MIDDOORCYLINDER_DESTROYED) + set_lights_state(0x00a1, LIGHTOP_3, 0xff, 0x0a, 0x78) + + beginloop(0x08) + if_door_state(0x0b, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + reloop(0x08) + + label(0x06) + open_door(0x0b) + open_door(0x0c) + endloop(0x08) + + endlist +}; + +/** + * The 4 cylinders in the tunnels that must be destroyed before the door to the + * final room opens. + */ +u8 func0409_check_pa_latedoorcylinders_destroyed[] = { + label(0x04) + yield + if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER1_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER2_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER3_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER4_DESTROYED, TRUE, /*goto*/ 0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x08) + if_door_state(0x0d, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + open_door(0x0d) + open_door(0x0e) + goto_first(0x08) + + endlist +}; + +u8 func1019_pa_door2[] = { + pa_cylinder(0x2c, 0xa2) + set_lights_state(0x00a9, LIGHTOP_3, 0xff, 0x0a, 0x78) + label(0x08) + set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER1_DESTROYED) + set_ailist(CHR_SELF, 0x0409) + endlist +}; + +u8 func101a_pa_door3[] = { + pa_cylinder(0x38, 0xa3) + set_lights_state(0x00ac, LIGHTOP_3, 0xff, 0x0a, 0x78) + label(0x08) + set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER2_DESTROYED) + set_ailist(CHR_SELF, 0x0409) + endlist +}; + +u8 func101b_pa_door4[] = { + pa_cylinder(0x44, 0xa4) + set_lights_state(0x00b4, LIGHTOP_3, 0xff, 0x0a, 0x78) + label(0x08) + set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER3_DESTROYED) + set_ailist(CHR_SELF, 0x0409) + endlist +}; + +u8 func101c_pa_door5[] = { + // @bug: One of the PA door glasses is checked twice, and one is not + // checked at all, hence why this doesn't use the pa_cylinder macro. + + // Wait until any object destroyed + beginloop(0x04) + if_object_in_good_condition(0x50, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x51, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x52, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x52, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x53, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x54, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x55, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x56, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x57, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x58, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x59, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + if_object_in_good_condition(0x5a, /*goto*/ 0x2e) + goto_next(0x06) + label(0x2e) + endloop(0x04) + + label(0x06) + destroy_object(0xa5) + destroy_object(0x50) + destroy_object(0x51) + destroy_object(0x52) + destroy_object(0x52) + destroy_object(0x53) + destroy_object(0x54) + destroy_object(0x55) + destroy_object(0x56) + destroy_object(0x57) + destroy_object(0x58) + destroy_object(0x59) + destroy_object(0x5a) + + set_lights_state(0x00b7, LIGHTOP_3, 0xff, 0x0a, 0x78) + label(0x08) + set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER4_DESTROYED) + set_ailist(CHR_SELF, 0x0409) + endlist +}; + +u8 func101d_pa_canister1[] = { + pa_cylinder(0x5b, 0xa6) + label(0x08) + set_stage_flag(STAGEFLAG_PA_CANISTER1_DESTROYED) + set_ailist(CHR_SELF, 0x040a) + endlist +}; + +u8 func101e_pa_canister2[] = { + pa_cylinder(0x67, 0xa7) + label(0x08) + set_stage_flag(STAGEFLAG_PA_CANISDER2_DESTROYED) + set_ailist(CHR_SELF, 0x040a) + endlist +}; + +u8 func040a_check_pa_canisters_destroyed[] = { + label(0x04) + yield + if_stage_flag_eq(STAGEFLAG_PA_CANISTER1_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PA_CANISDER2_DESTROYED, TRUE, /*goto*/ 0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Both canisters destroyed + label(0x2e) + set_object_flag(0x0f, OBJFLAG_DOOR_KEEPOPEN) + set_lights_state(0x00bc, LIGHTOP_3, 0xff, 0x0a, 0x78) + + beginloop(0x08) + if_door_state(0x0f, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) + show_hudmsg(CHR_BOND, L_PAM_043) // "Cetan megaweapon has been disabled." + set_stage_flag(STAGEFLAG_MEGAWEAPON_DISABLED) + label(0x2e) + open_door(0x0f) + open_door(0x10) + goto_first(0x08) + + endlist +}; + +/** + * The room with 5 cylinders that open a door. + */ +u8 func101f_pa_circleroom_spawner[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_door_state(0x09, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x008b, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + restart_timer + + beginloop(0x0d) + if_door_state(0x09, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x1f) + if_timer_gt(300, /*goto*/ 0x1f) + endloop(0x0d) + + label(0x1f) + restart_timer + + beginloop(0x20) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x008c, /*goto*/ 0x58) + if_timer_lt(300, /*goto*/ 0x21) + label(0x2e) + if_num_chrs_in_squadron_gt(3, 0x0d, /*goto*/ 0x21) + call_rng + if_rand_gt(128, /*goto*/ 0x63) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_00DD, AILIST_INIT_PA_CIRCLEROOM_MINISKEDAR, 0, /*goto*/ 0x22) + goto_next(0x21) + label(0x63) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_00DD, AILIST_INIT_PA_CIRCLEROOM_MINISKEDAR, 0, /*goto*/ 0x22) + goto_next(0x21) + label(0x21) + endloop(0x20) + + label(0x22) + yield + rebuild_teams + rebuild_squadrons + goto_first(0x1f) + + label(0x58) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041f_init_pa_circleroom_miniskedar[] = { + set_squadron(SQUADRON_0D) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) + endlist +}; + +u8 func1020_pa_deadendroom_spawner[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b4, /*goto*/ 0x2e) + if_chr_in_room(CHR_P1P2, 0x00, 0x00b8, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_ailist(0x38, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) + set_ailist(0x39, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) + set_ailist(0x3a, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) + set_ailist(0x3b, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) + label(0x1f) + restart_timer + + beginloop(0x20) + if_timer_lt(300, /*goto*/ 0x21) + label(0x2e) + if_num_chrs_in_squadron_gt(3, 0x0b, /*goto*/ 0x21) + call_rng + if_rand_gt(64, /*goto*/ 0x63) + if_rand_gt(128, /*goto*/ 0x64) + if_rand_gt(196, /*goto*/ 0x65) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01AF, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) + goto_next(0x21) + label(0x63) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01B0, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) + goto_next(0x21) + label(0x64) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01B1, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) + goto_next(0x21) + label(0x65) + try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01B2, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) + goto_next(0x21) + label(0x21) + endloop(0x20) + + label(0x22) + yield + rebuild_teams + rebuild_squadrons + goto_first(0x1f) + + endlist +}; + +u8 func0420_init_pa_deadendroom_miniskedar[] = { + set_squadron(SQUADRON_0B) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) + endlist +}; + +u8 func1021_c6c4[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_PA_MIDDOORCYLINDER_DESTROYED, TRUE, /*goto*/ 0x2e) + if_chr_dead(0x30, /*goto*/ 0x2e) + if_chr_dead(0x31, /*goto*/ 0x2e) + if_chr_dead(0x32, /*goto*/ 0x2e) + if_chr_dead(0x33, /*goto*/ 0x2e) + if_chr_dead(0x34, /*goto*/ 0x2e) + if_chr_dead(0x35, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_ailist(0x30, AILIST_INIT_MINISKEDAR) + set_ailist(0x31, AILIST_INIT_MINISKEDAR) + set_ailist(0x32, AILIST_INIT_MINISKEDAR) + set_ailist(0x33, AILIST_INIT_MINISKEDAR) + set_ailist(0x34, AILIST_INIT_MINISKEDAR) + set_ailist(0x35, AILIST_INIT_MINISKEDAR) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_path(pathid, function) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(20) \ + set_reaction_speed(65) \ + set_chr_maxdamage(CHR_SELF, 70) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + set_returnlist(CHR_SELF, function) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + +u8 func0421_start_path02[] = { + init_path(2, 0x0421) + endlist +}; + +u8 func0422_start_path03[] = { + init_path(3, 0x0422) + endlist +}; + +u8 func0423_start_path04[] = { + init_path(4, 0x0423) + endlist +}; + +u8 func0424_start_path05[] = { + init_path(5, 0x0424) + endlist +}; + +u8 func0425_start_path06[] = { + init_path(6, 0x0425) + endlist +}; + +u8 func0426_start_path07[] = { + init_path(7, 0x0426) + endlist +}; + +u8 func0427_start_path08[] = { + init_path(8, 0x0427) + endlist +}; + +u8 func0428_start_path09[] = { + init_path(9, 0x0428) + endlist +}; + +u8 func0429_start_path10[] = { + init_path(10, 0x0429) + endlist +}; + +u8 func1022_control_room[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) + goto_next(0x04) + + // Agent + label(0x2e) + remove_chr(CHR_BLONDE1) + remove_chr(CHR_BLONDE2) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA and PA + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + if_chr_deadish(CHR_BLONDE1, /*goto*/ 0x2e) + goto_first(0x04) + + label(0x2e) + if_chr_deadish(CHR_BLONDE2, /*goto*/ 0x2e) + goto_first(0x04) + + label(0x2e) + show_hudmsg(CHR_P1P2, L_PAM_021) // "Control Room has been secured." + set_stage_flag(STAGEFLAG_BLONDES_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1023_check_drcaroll_restored[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x04) + yield + give_object_to_chr(OBJ_BACKUPDISK, CHR_BOND) + + beginloop(0x04) + if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x0d) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_PAM_0193, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_BLONDES_DEAD, TRUE, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_PAM_0193, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_BACKUPDISK, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_stage_flag(STAGEFLAG_DRCAROLL_RESTORED) + label(0x08) + set_ailist(CHR_SELF, AILIST_MIDCUTSCENE) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1024_update_elvis_target_chr[] = { + beginloop(0x04) + if_chr_deadish(CHR_BOND, /*goto*/ 0x08) + set_chr_target_chr(CHR_ELVIS, CHR_BOND) + unset_stage_flag(STAGEFLAG_ELVIS_FOLLOWING_COOP) + endloop(0x04) + + beginloop(0x08) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) + set_chr_target_chr(CHR_ELVIS, CHR_COOP) + set_stage_flag(STAGEFLAG_ELVIS_FOLLOWING_COOP) + endloop(0x08) + + label(0x2e) + goto_first(0x04) + + endlist +}; + +u8 unregistered_function1[] = { + label(0x04) + chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BF, 0x01, /*goto*/ 0x06) + label(0x06) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1026_setup_autoguns[] = { + yield + set_autogun_target_team(0xa8, TEAM_ENEMY | TEAM_ALLY) + set_autogun_target_team(0xa9, TEAM_ENEMY | TEAM_ALLY) + set_autogun_target_team(0xaa, TEAM_ENEMY | TEAM_ALLY) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042e_elvis_run_to_exit[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_shotlist(AILIST_ELVIS_RUN_TO_EXIT) + set_returnlist(CHR_SELF, AILIST_ELVIS_RUN_TO_EXIT) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x06) + + // Dying + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2e) + goto_next(0x5f) + + // Injured + label(0x2e) + say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + + beginloop(0x12) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x12) + + // Healthy + label(0x1f) + label(0x06) + set_target_chr(CHR_PRESET) + label(0x5f) + restart_timer + if_distance_to_target_lt(1400, /*goto*/ 0x2e) + jog_to_pad(PAD_PAM_0004) + goto_next(0x0f) + + label(0x2e) + run_to_pad(PAD_PAM_0004) + + beginloop(0x0f) + if_enemy_distance_lt_and_los(800, /*goto*/ 0x08) + if_timer_gt(300, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x2e) + endloop(0x0f) + + label(0x06) + goto_first(0x5f) + + label(0x2e) + stop_chr + goto_first(0x1f) + + label(0x06) + restart_timer + label(0x08) + if_target_is_player(/*goto*/ 0x06) + goto_next(0x2e) + label(0x06) + goto_first(0x1f) + + label(0x2e) + call_rng + if_rand_lt(85, /*goto*/ 0x63) + if_rand_lt(170, /*goto*/ 0x64) + say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + label(0x63) + say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + goto_next(0x2e) + label(0x64) + say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) + label(0x2e) + set_shotlist(AILIST_ELVIS_RUN_TO_EXIT) + set_returnlist(CHR_SELF, AILIST_ELVIS_RUN_TO_EXIT) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func1027_powernode_illumination[] = { + beginloop(0x04) + if_door_state(0x03, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + unset_object_flag(OBJ_POWERNODE1, OBJFLAG_IGNOREFLOORCOLOUR) + goto_next(0x06) + label(0x2e) + set_object_flag(OBJ_POWERNODE1, OBJFLAG_IGNOREFLOORCOLOUR) + + label(0x06) + if_door_state(0x04, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + unset_object_flag(OBJ_POWERNODE2, OBJFLAG_IGNOREFLOORCOLOUR) + goto_next(0x06) + label(0x2e) + set_object_flag(OBJ_POWERNODE2, OBJFLAG_IGNOREFLOORCOLOUR) + + label(0x06) + if_door_state(0x05, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + unset_object_flag(OBJ_POWERNODE3, OBJFLAG_IGNOREFLOORCOLOUR) + goto_next(0x06) + label(0x2e) + set_object_flag(OBJ_POWERNODE3, OBJFLAG_IGNOREFLOORCOLOUR) + label(0x06) + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Enables 3 guards near the grotto entrance during the escape timer. + */ +u8 func1028_enable_last_3_guards[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x2e) + reloop(0x04) + + label(0x2e) + if_door_state(0xab, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + unset_chr_chrflag(0x3c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x3d, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x3e, CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(0x3c, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x3d, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(0x3e, CHRCFLAG_INVINCIBLE) +#endif + set_ailist(0x3c, AILIST_RUN_TO_EXIT) + set_ailist(0x3d, AILIST_RUN_TO_EXIT) + set_ailist(0x3e, AILIST_RUN_TO_EXIT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func042b_run_to_exit[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(40) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 10) + add_health_or_armor(70) + set_recovery_speed(0) + set_shield(0) + label(0x04) + run_to_pad(PAD_PAM_0000) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1429_start_lift[] = { + if_coop_mode(/*goto*/ 0x45) + activate_lift(1, 0x07) + label(0x45) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102a_kill_pelagic_guard[] = { + yield + damage_chr(0x3f, WEAPON_SUPERDRAGON) + yield + damage_chr(0x3f, WEAPON_SUPERDRAGON) + yield + damage_chr(0x3f, WEAPON_SUPERDRAGON) + yield + damage_chr(0x3f, WEAPON_SUPERDRAGON) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102b_proxymines[] = { + beginloop(0x04) + if_chr_deadish(0x08, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_PURPLE_GUARD_SHOT_JO_OR_ELVIS, TRUE, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_object_flag(OBJ_PROXYMINES, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_PROXYMINES, OBJFLAG2_INVISIBLE) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102c_lock_doors[] = { + label(0x04) + yield + if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) + + // PA + lock_door(0xb1, 0x80) + lock_door(0xb2, 0x80) + set_object_flag2(0xb1, OBJFLAG2_AICANNOTUSE) + set_object_flag2(0xb2, OBJFLAG2_AICANNOTUSE) + + // A and SA + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040f_miniskedar_unalerted[] = { + set_shotlist(AILIST_MINISKEDAR) + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_accuracy(0) + set_reaction_speed(65) + set_chr_maxdamage(CHR_SELF, 20) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + set_ailist(CHR_SELF, AILIST_MINISKEDAR) + endlist +}; + +u8 func0432_dead_skedar[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + + label(0x08) + yield + chr_do_animation(ANIM_SKEDAR_COLLAPSE, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x21, 2) + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function2[] = { + set_lights_state(0x0009, LIGHTOP_4, 0x00, 0xff, 0xfa) + + beginloop(0x08) + endloop(0x08) + + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102e_open_powernode_doors_on_agent[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Agent + label(0x08) + open_door(0x03) + set_object_flag(0x03, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x04) + set_object_flag(0x04, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x05) + set_object_flag(0x05, OBJFLAG_DOOR_KEEPOPEN) + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Stop whatever Elvis is doing in preparation for teleporting. + */ +u8 func042c_elvis_stop[] = { + label(0x08) + stop_chr + + // @bug: This needs to set the onshot function to GAILIST_IDLE too, otherwise + // his function will be reassigned if he takes damage between here and the + // teleport. This causes him to not teleport. + label(0x2e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102f_unlock_drcaroll_door[] = { + // Wait until player in Dr Caroll room + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2e) + endloop(0x08) + + // Unlock exit door + label(0x2e) + unlock_door(0x75, 0x02) + unlock_door(0x76, 0x02) + unset_object_flag2(0x75, OBJFLAG2_AICANNOTUSE) + unset_object_flag2(0x76, OBJFLAG2_AICANNOTUSE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1030_unlock_agent_teleport_door[] = { + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) + endloop(0x08) + + // Agent area, near megaweapon. Door that leads to exit teleport. + label(0x2e) + unlock_door(0xb7, 0x02) + unlock_door(0xb8, 0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Wait until Jo has the trigger buddy warp flag set, then unset it 30 seconds + * later. + */ +u8 func1031_unset_trigger_buddy_warp[] = { + beginloop(0x08) + if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x2e) + reloop(0x08) + + label(0x2e) + restart_timer + + beginloop(0x09) + if_timer_gt(1800, /*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + endloop(0x08) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Toggle a stage flag every 5 seconds. + * + * There's a good chance that this flag had a different meaning back when this + * was working. + */ +u8 unregistered_function3[] = { + label(0x1f) + restart_timer + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x2e) + endloop(0x08) + + label(0x2e) + unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + restart_timer + + beginloop(0x09) + if_timer_gt(300, /*goto*/ 0x2e) + endloop(0x09) + + label(0x2e) + set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) + goto_first(0x1f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1032_setup_rtracker[] = { + yield + set_object_flag3(OBJ_PROXYMINES, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1433_setup_environment[] = { + yield +#if VERSION >= VERSION_NTSC_1_0 + configure_environment(0x0000, AIENVCMD_SETAMBIENT, TRUE) + configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, FALSE) + configure_environment(0x000d, AIENVCMD_ROOM_SETAMBIENT, FALSE) +#else + configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0051, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0052, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0053, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0054, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0055, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0060, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0061, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0069, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x006c, AIENVCMD_ROOM_SETAMBIENT, TRUE) +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1034_enable_blondes[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + yield + disable_chr(CHR_BLONDE1) + disable_chr(CHR_BLONDE2) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2e) + endloop(0x04) + + label(0x2e) + enable_chr(CHR_BLONDE1) + enable_chr(CHR_BLONDE2) + set_ailist(CHR_BLONDE1, AILIST_BLONDE) + set_ailist(CHR_BLONDE2, AILIST_BLONDE) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102d_check_farsight_ammo_wasted[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + + // Probable @bug: Looks like the objective will fail if one buddy uses all + // their ammo but the other is still stocked. + beginloop(0x1f) + if_chr_weapon_equipped(CHR_BOND, WEAPON_FARSIGHT, /*goto*/ 0x2e) + if_chr_weapon_equipped(CHR_COOP, WEAPON_FARSIGHT, /*goto*/ 0x2f) + endloop(0x1f) + + label(0x2e) + set_target_chr(CHR_BOND) + goto_next(0x63) + + label(0x2f) + set_target_chr(CHR_COOP) + + beginloop(0x63) + if_objective_complete(1, /*goto*/ 0x0d) + if_ammo_quantity_lt(CHR_TARGET, AMMOTYPE_FARSIGHT, 1, /*goto*/ 0x2e) + endloop(0x63) + + label(0x2e) + show_hudmsg(CHR_BOND, L_PAM_044) // "Ammo wasted - unable to disable megaweapon." + set_stage_flag(STAGEFLAG_FARSIGHT_AMMO_WASTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function4[] = { + mp_init_simulants + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_unused, 0x0401 }, + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_powernode1, 0x1003 }, + { func1004_powernode2, 0x1004 }, + { func1005_powernode3, 0x1005 }, + { func1006_msg_thiswillhelpus, 0x1006 }, + { func1007_msg_antibodymasking, 0x1007 }, + { func1008_msg_theresdrcaroll, 0x1008 }, + { func1009_msg_getoutofhere, 0x1009 }, + { func100a_bond_teleports, 0x100a }, + { func100b_coop_teleports, 0x100b }, + { func100c_countdown_timer, 0x100c }, + { func100e_check_elvis_dead, 0x100e }, + { func100f_check_drcaroll_dead, 0x100f }, + { func1010_agent_hallway_spawner, 0x1010 }, + { func1012_sa_megaweapon_spawner, 0x1012 }, + { func1013_pa_doorcylinder1, 0x1013 }, + { func1014_pa_doorcylinder2, 0x1014 }, + { func1015_pa_doorcylinder3, 0x1015 }, + { func1016_pa_doorcylinder4, 0x1016 }, + { func1017_pa_doorcylinder5, 0x1017 }, + { func1018_pa_door1, 0x1018 }, + { func1019_pa_door2, 0x1019 }, + { func101a_pa_door3, 0x101a }, + { func101b_pa_door4, 0x101b }, + { func101c_pa_door5, 0x101c }, + { func101d_pa_canister1, 0x101d }, + { func101e_pa_canister2, 0x101e }, + { func101f_pa_circleroom_spawner, 0x101f }, + { func1020_pa_deadendroom_spawner, 0x1020 }, + { func1021_c6c4, 0x1021 }, + { func1022_control_room, 0x1022 }, + { func1023_check_drcaroll_restored, 0x1023 }, + { func1024_update_elvis_target_chr, 0x1024 }, + { func1026_setup_autoguns, 0x1026 }, + { func1027_powernode_illumination, 0x1027 }, + { func1028_enable_last_3_guards, 0x1028 }, + { func1429_start_lift, 0x1429 }, + { func102a_kill_pelagic_guard, 0x102a }, + { func102b_proxymines, 0x102b }, + { func102c_lock_doors, 0x102c }, + { func102d_check_farsight_ammo_wasted, 0x102d }, + { func102e_open_powernode_doors_on_agent, 0x102e }, + { func102f_unlock_drcaroll_door, 0x102f }, + { func1030_unlock_agent_teleport_door, 0x1030 }, + { func1031_unset_trigger_buddy_warp, 0x1031 }, + { func1032_setup_rtracker, 0x1032 }, + { func1433_setup_environment, 0x1433 }, + { func1034_enable_blondes, 0x1034 }, + { func1002_intro, 0x0c00 }, + { func0c01_midcutscene, 0x0c01 }, + { func0c02_outro, 0x0c02 }, + { func0411_hide, 0x0411 }, + { func0412_unused, 0x0412 }, + { func040e_init_miniskedar, 0x040e }, + { func040f_miniskedar, 0x040f }, + { func0c02_outro, 0x0410 }, + { func040f_miniskedar_send_clones, 0x040d }, + { func040c_blonde, 0x040c }, + { func040b_init_elvis, 0x040b }, + { func0402_elvis_follow_and_reactive_teleportals, 0x0402 }, + { func0403_elvis_give_farsight, 0x0403 }, + { func0404_elvis_follow_and_do_agent_megaweapon, 0x0404 }, + { func0405_elvis_follow_nocombat, 0x0405 }, + { func0406_elvis_follow_and_do_sa_megaweapon, 0x0406 }, + { func0407_elvis_go_to_sa_teleport, 0x0407 }, + { func0408_check_pa_earlydoorcylinders_destroyed, 0x0408 }, + { func0409_check_pa_latedoorcylinders_destroyed, 0x0409 }, + { func040a_check_pa_canisters_destroyed, 0x040a }, + { func0414_teleport_bond_to_sapa, 0x0414 }, + { func0415_teleport_bond_to_drcaroll, 0x0415 }, + { func0416_teleport_bond_to_a_pa_drcaroll, 0x0416 }, + { func0417_teleport_coop_to_sapa, 0x0417 }, + { func0418_teleport_coop_to_drcaroll, 0x0418 }, + { func0419_teleport_coop_to_a_pa_drcaroll, 0x0419 }, + { func041a_init_sniper, 0x041a }, + { func041b_sniper_wait_for_detection, 0x041b }, + { func041c_teleport_activation_responder, 0x041c }, + { func041d_sniper, 0x041d }, + { func041e_init_sa_megaweapon_miniskedar, 0x041e }, + { func041f_init_pa_circleroom_miniskedar, 0x041f }, + { func0420_init_pa_deadendroom_miniskedar, 0x0420 }, + { func0421_start_path02, 0x0421 }, + { func0422_start_path03, 0x0422 }, + { func0423_start_path04, 0x0423 }, + { func0424_start_path05, 0x0424 }, + { func0425_start_path06, 0x0425 }, + { func0426_start_path07, 0x0426 }, + { func0427_start_path08, 0x0427 }, + { func0428_start_path09, 0x0428 }, + { func0429_start_path10, 0x0429 }, + { func042b_run_to_exit, 0x042b }, + { func042d_elvis_warp_to_outside_drcaroll, 0x042d }, + { func042e_elvis_run_to_exit, 0x042e }, + { func0c01_midcutscene, 0x042a }, + { func0413_cloak_and_hide, 0x0413 }, + { func042f_init_pelagic_guard, 0x042f }, + { func0430_unused, 0x0430 }, + { func040f_miniskedar_unalerted, 0x0431 }, + { func0432_dead_skedar, 0x0432 }, + { func0433_unused, 0x0433 }, + { func042c_elvis_stop, 0x042c }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, + { path10, 10, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setuppete.c b/src/ailists/setuppete.c new file mode 100644 index 000000000..b9d1387d5 --- /dev/null +++ b/src/ailists/setuppete.c @@ -0,0 +1,3305 @@ +// +// Chicago +// + +#include "stagesetup.h" + +// Characters +#define CHR_TOPSTAIRS 0x07 +#define CHR_SEALER1 0x0d +#define CHR_SEALER2 0x0e +#define CHR_SEALER3 0x0f +#define CHR_SEALER4 0x10 +#define CHR_FBI1 0x17 +#define CHR_FBI2 0x18 +#define CHR_FBI3 0x19 +#define CHR_CIA1 0x1a +#define CHR_CIA2 0x1b // bug spotter +#define CHR_CIA3 0x1c +#define CHR_CIA4 0x1d +#define CHR_HIDDENGUY 0x1e // positioned just behind Jo's starting place, never unhidden, and used for distance checks and something related to the robot +#define CHR_ROBOT 0x1f + +// Objects +#define OBJ_CAR1 0x00 +#define OBJ_CAR2 0x01 +#define OBJ_CAR3 0x02 +#define OBJ_CAR4 0x03 +#define OBJ_CAR5 0x05 +#define OBJ_BRIEFCASE1 0x06 +#define OBJ_BRIEFCASE2 0x07 +#define OBJ_FIREDOORTOP 0x08 +#define OBJ_FIREDOORBOTTOM 0x09 +#define OBJ_TAXI 0x0a +#define OBJ_LIMO 0x0c +#define OBJ_SWITCH 0x0e +#define OBJ_BRIEFCASE3 0x0f +#define OBJ_MINE1 0x12 +#define OBJ_MINE2 0x13 +#define OBJ_BRIEFCASE4 0x1b +#define OBJ_BRIEFCASE5 0x1d +#define OBJ_BRIEFCASE6 0x1e +#define OBJ_WIREFENCE 0x21 +#define OBJ_FALCON2 0x22 +#define OBJ_DUMPSTER 0x25 + +// Stage flags +#define STAGEFLAG_ALARM_GROUP1_DEAD 0x00000001 +#define STAGEFLAG_ALARM_GROUP2_DEAD 0x00000002 +#define STAGEFLAG_ALARM_GROUP3_DEAD 0x00000004 +#define STAGEFLAG_TRACERBUG_SPOTTED 0x00000008 +#define STAGEFLAG_CRASH_FINISHED 0x00000010 +#define STAGEFLAG_TRIGGER_CRASH 0x00000020 +#define STAGEFLAG_ROBOT_NEAR_CORNER 0x00000040 +#define STAGEFLAG_TRACERBUG_SAFE 0x00000080 +#define STAGEFLAG_ONE_BUG_REMAINING 0x00000100 +#define STAGEFLAG_MINE_PLACED 0x00000200 +#define STAGEFLAG_MINE_WASTED 0x00000400 +#define STAGEFLAG_TAXI_REPROGRAMMED 0x00000800 +#define STAGEFLAG_TRACERBUG_PLACED 0x00001000 +#define STAGEFLAG_TRACERBUG_WASTED 0x00002000 +#define STAGEFLAG_LIMO_DESTROYED 0x00004000 +#define STAGEFLAG_TAXI_DESTROYED 0x00008000 +#define STAGEFLAG_ROBOT_DESTROYED 0x00010000 +#define STAGEFLAG_IN_ELEVATOR 0x00020000 +#define STAGEFLAG_LIMO_READY_TO_LEAVE 0x00040000 +#define STAGEFLAG_LIMO_READY_15SEC_AGO 0x00080000 +#define STAGEFLAG_TRIGGER_TAXI_LEAVE 0x00100000 +#define STAGEFLAG_TAXI_ALMOST_READY_TO_CRASH 0x00200000 +#define STAGEFLAG_ALARM_SOUNDED 0x00400000 +#define STAGEFLAG_ROBOT_NEAR_HOME 0x00800000 +#define STAGEFLAG_ROBOT_ON_DRAIN_STREET 0x01000000 +#define STAGEFLAG_TRIGGER_INTRO 0x02000000 +#define STAGEFLAG_LIMO_ESCAPED 0x04000000 +#define STAGEFLAG_CIVILIAN_DEAD 0x08000000 +#define STAGEFLAG_ELEVATOR_SEALED 0x10000000 +#define STAGEFLAG_INTRO_FINISHED 0x20000000 +#define STAGEFLAG_DIVERSION_CREATED 0x40000000 +#define STAGEFLAG_TAXI_READY_TO_CRASH 0x80000000 + +// AI Lists +#define AILIST_OUTRO 0x040b +#define AILIST_CIA 0x0412 +#define AILIST_BUGSPOTTER 0x0413 +#define AILIST_INIT_CIA1 0x0419 +#define AILIST_ROBOT 0x041a +#define AILIST_INIT_ROBOT 0x041b +#define AILIST_HIDDENGUY 0x041c +#define AILIST_FBI 0x041d +#define AILIST_SEALER1 0x041e +#define AILIST_ALARM_RESPONDER 0x041f +#define AILIST_JOG_TO_ACCIDENT 0x0420 + +// Other +#define GROUP_ALARM_RESPONDER 0x09 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_PETE_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_PETE_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_PETE_002) + briefing(BRIEFINGTYPE_TEXT_A, L_PETE_003) + + beginobjective(0, L_PETE_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Retrieve drop point equipment" + require_object_collected(OBJ_BRIEFCASE1) + require_object_collected(OBJ_BRIEFCASE2) + endobjective + + beginobjective(1, L_PETE_010, (DIFFBIT_PA | DIFFBIT_PD)) // "Attach tracer to limousine" + complete_flags(STAGEFLAG_TRACERBUG_PLACED) + fail_flags(STAGEFLAG_TRACERBUG_WASTED) + fail_flags(STAGEFLAG_LIMO_DESTROYED) + fail_flags(STAGEFLAG_LIMO_ESCAPED) + fail_flags(STAGEFLAG_TRACERBUG_SPOTTED) + endobjective + + beginobjective(2, L_PETE_011, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Prepare escape route" + complete_flags(STAGEFLAG_MINE_PLACED) + fail_flags(STAGEFLAG_MINE_WASTED) + endobjective + + beginobjective(3, L_PETE_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Create vehicular diversion" + complete_flags(STAGEFLAG_DIVERSION_CREATED) + fail_flags(STAGEFLAG_TAXI_DESTROYED) + fail_flags(STAGEFLAG_ROBOT_DESTROYED) + endobjective + + beginobjective(4, L_PETE_014, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Gain entry to G5 building" + complete_flags(STAGEFLAG_IN_ELEVATOR) + fail_flags(STAGEFLAG_CIVILIAN_DEAD) + fail_flags(STAGEFLAG_ELEVATOR_SEALED) + endobjective + + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_BLUESIGHT, 0x1a, PAD_PETE_00A9, BODY_CIAGUY, HEAD_RANDOM, AILIST_INIT_CIA1, -1, -1, 1000, 6, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x00, PAD_PETE_00AA, BODY_G5_GUARD, HEAD_RANDOM, 0x0414, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA, 0x17, PAD_PETE_00AB, BODY_FBIGUY, HEAD_RANDOM, 0x0411, -1, -1, 800, 30, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x01, PAD_PETE_00AC, BODY_G5_GUARD, HEAD_RANDOM, 0x0415, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONPA, 0x18, PAD_PETE_00AF, BODY_FBIGUY, HEAD_RANDOM, 0x0411, -1, -1, 500, 30, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 1, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x02, PAD_PETE_00AD, BODY_G5_GUARD, HEAD_RANDOM, 0x0416, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x03, PAD_PETE_00AE, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, -1, -1, 1000, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x04, PAD_PETE_00B0, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, -1, -1, 1000, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x05, PAD_PETE_00B1, BODY_G5_GUARD, HEAD_RANDOM, 0x0417, -1, -1, 1000, 50, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x19, PAD_PETE_00B3, BODY_FBIGUY, HEAD_RANDOM, 0x0411, -1, -1, 500, 20, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x06, PAD_PETE_00B4, BODY_G5_GUARD, HEAD_RANDOM, 0x040f, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, 0x0a, PAD_PETE_00B6, BODY_G5_GUARD, HEAD_RANDOM, 0x040f, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x07, PAD_PETE_00B5, BODY_G5_GUARD, HEAD_RANDOM, 0x040f, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0b, PAD_PETE_00B7, BODY_G5_GUARD, HEAD_RANDOM, 0x040f, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_00000200, 0x08, PAD_PETE_00CB, BODY_G5_GUARD, HEAD_RANDOM, 0x040f, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x09, PAD_PETE_00CC, BODY_G5_GUARD, HEAD_RANDOM, 0x040f, -1, -1, 1000, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CAMP | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0c, PAD_PETE_00B8, BODY_G5_GUARD, HEAD_RANDOM, 0x0418, -1, -1, 500, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_BLUESIGHT, 0x1c, PAD_PETE_00B9, BODY_CIAGUY, HEAD_RANDOM, AILIST_CIA, -1, -1, 1000, 6, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_05, -1, 0, 1, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_BLUESIGHT, 0x1d, PAD_PETE_0042, BODY_CIAGUY, HEAD_RANDOM, AILIST_CIA, -1, -1, 1000, 6, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_05, -1, 0, 2, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x0d, PAD_PETE_00BF, BODY_G5_GUARD, HEAD_RANDOM, AILIST_SEALER1, -1, -1, 1000, 15, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0e, PAD_PETE_00BC, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, 0x00c5, -1, 1000, 15, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0f, PAD_PETE_00BD, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, 0x00c6, -1, 1000, 15, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x10, PAD_PETE_00BE, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, 0x00c7, -1, 1000, 15, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_DONTSHOOTME | SPAWNFLAG_BLUESIGHT, 0x1b, PAD_PETE_00B2, BODY_CIAGUY, HEAD_RANDOM, AILIST_BUGSPOTTER, -1, -1, 1000, 6, CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x11, PAD_PETE_00C9, BODY_G5_GUARD, HEAD_RANDOM, GAILIST_IDLE, 0x00c9, -1, 1000, 30, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(0, 0x12, PAD_PETE_00CA, BODY_G5_GUARD, HEAD_RANDOM, GAILIST_IDLE, 0x00ca, -1, 1000, 30, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOACCURACYAFTERJAM | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x1f, PAD_PETE_0020, BODY_CHICROB, 0x00, AILIST_INIT_ROBOT, -1, -1, 1000, 15, 0, 0, TEAM_20, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(0, 0x1e, PAD_PETE_0063, BODY_G5_GUARD, HEAD_RANDOM, AILIST_HIDDENGUY, 0x00c8, -1, 1000, 15, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR, 0, TEAM_20, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x13, PAD_PETE_00CD, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, -1, -1, 500, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x14, PAD_PETE_00CE, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, -1, -1, 500, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x15, PAD_PETE_00CF, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, -1, -1, 500, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x16, PAD_PETE_00D1, BODY_G5_GUARD, HEAD_RANDOM, 0x040e, -1, -1, 1, 10, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_20, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + tag(0x00, 1) + stdobject(0x0100, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x01, 1) + stdobject(0x0100, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x02, 1) + stdobject(0x0100, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x03, 1) + stdobject(0x0100, MODEL_POLICECAR, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x05, 1) + stdobject(0x0100, MODEL_POLICECAR, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x06, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_PETE_00A6, OBJFLAG_00000001 | OBJFLAG_AIUNDROPPABLE | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PLAYERUNDROPPABLE | OBJFLAG3_ONSHELF, WEAPON_REMOTEMINE) + rename_object(-1, WEAPON_REMOTEMINE, L_PETE_038, L_PETE_039, L_PETE_040, L_PETE_041, L_PETE_042) // "Obtain Remote Mine." + tag(0x0f, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, -1, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_ONSHELF, WEAPON_TRACERBUG) + rename_object(-1, WEAPON_TRACERBUG, L_PETE_043, L_PETE_044, L_PETE_045, L_PETE_046, L_PETE_047) // "Obtain Tracer Bug." + tag(0x1d, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, -1, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_ONSHELF, WEAPON_TRACERBUG) + rename_object(-1, WEAPON_TRACERBUG, L_PETE_043, L_PETE_044, L_PETE_045, L_PETE_046, L_PETE_047) // "Obtain Tracer Bug." + tag(0x0e, 1) + singlemonitor(0x0019, MODEL_G5_LASER_SWITCH, PAD_PETE_00EB, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED, OBJFLAG3_INTERACTABLE, 1000, 19) + tag(0x07, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_PETE_00A6, OBJFLAG_00000001 | OBJFLAG_AIUNDROPPABLE | OBJFLAG_INVINCIBLE | OBJFLAG_COLLECTABLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_PLAYERUNDROPPABLE | OBJFLAG3_ONSHELF, WEAPON_DATAUPLINK) + rename_object(-1, WEAPON_DATAUPLINK, L_PETE_049, L_PETE_050, L_PETE_051, L_PETE_052, L_PETE_053) // "Obtain Reprogrammer." + tag(0x1b, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_PETE_001C, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_FALCON2_SCOPE) + rename_object(-1, WEAPON_FALCON2_SCOPE, L_PETE_055, L_PETE_056, L_PETE_057, L_PETE_058, L_PETE_059) // "Obtain Remote Mine." + tag(0x1e, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_PETE_001C, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_FALCON2_SCOPE) + rename_object(-1, WEAPON_FALCON2_SCOPE, L_PETE_055, L_PETE_056, L_PETE_057, L_PETE_058, L_PETE_059) // "Obtain Remote Mine." + tag(0x1f, 1) + stdobject(0x0100, MODEL_CHRBRIEFCASE, PAD_PETE_009C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x0a, 1) + hovercar(0x0100, MODEL_TAXICAB, PAD_PETE_00A3, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_20000000, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE | OBJFLAG3_10000000, 700, 0x0000040c) + tag(0x0c, 1) + hovercar(0x00cc, MODEL_LIMO, PAD_PETE_00A4, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_20000000, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_10000000, 700, 0x0000040d) + tag(0x21, 1) + stdobject(0x0100, MODEL_WIREFENCE, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_SHOOTTHROUGH, 0, 1000) + tag(0x08, 1) + door(0x0100, MODEL_G5_ESCDOORUP, PAD_PETE_00FB, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + tag(0x09, 1) + door(0x0100, MODEL_G5_ESCDOORDOWN, PAD_PETE_00FC, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + tag(0x10, 2) + tag(0x11, 2) + door(0x0100, MODEL_G5CARLIFTDOOR, PAD_PETE_00EC, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000e666, 0x00010000, 0x00003333, 0x00014000, 0x00001333, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_G5CARLIFTDOOR, PAD_PETE_00ED, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x14, 1) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00EE, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + tag(0x1a, 1) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00EF, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000708, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F0, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + tag(0x15, 2) + tag(0x16, 2) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + tag(0x19, 1) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + tag(0x17, 2) + tag(0x18, 2) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F5, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F6, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + door(0x0100, MODEL_CH_SHUTTER1, PAD_PETE_00F7, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f5c2, 0x0000f333, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000a00) + tag(0x12, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PETE_0067, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x13, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_PETE_0067, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + door(0x0100, MODEL_DOOR2A_G5, PAD_PETE_00FD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DOOR2A_G5, PAD_PETE_00FE, OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_PETE_0104, 0, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000001, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_PETE_0105, OBJFLAG_20000000, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000001, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + tag(0x25, 1) + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_011E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE | OBJFLAG3_RTRACKED_BLUE, 1000) +#else + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_011E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) +#endif + weapon(0x0100, MODEL_CHRBRIEFCASE, -1, OBJFLAG_INSIDEANOTHEROBJ | OBJFLAG_WEAPON_40000000, 0, 0, WEAPON_EYESPY) + tag(0x24, -1) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_010B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_010C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_010E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_010F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0110, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0111, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0112, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0113, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0114, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0115, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0116, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0117, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0119, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_011D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_011C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_011B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_0118, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_PETE_011A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_0106, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_0107, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_0108, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_0109, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DUMPSTER, PAD_PETE_010A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + door(0x0100, MODEL_DD_GRATE, PAD_PETE_00F8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000fd70, 0x00010000, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DD_GRATE, PAD_PETE_00F9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000fd70, 0x00010000, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_DD_GRATE, PAD_PETE_00FA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_80000000, 0, 1000, 0x0000fd70, 0x00010000, 0x00003333, 0x00014000, 0x00001333, DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x22, 2) + tag(0x23, 2) + weapon(0x0100, MODEL_CHRFALCON2, PAD_PETE_011F, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, WEAPON_FALCON2_SCOPE) + weapon(0x0100, MODEL_CHRFALCON2, PAD_PETE_011F, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, WEAPON_FALCON2_SCOPE) + link_guns(-1, -2) + tag(0x1c, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_PETE_0121, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x20, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_PETE_0122, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_PETE_0123, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_PETE_0124, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_PETE_0125, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + pad_effect(PADEFFECT_SPLASH, 0x009b) + pad_effect(PADEFFECT_SPLASH, 0x009c) + pad_effect(PADEFFECT_SPLASH, 0x009d) + pad_effect(PADEFFECT_SPLASH, 0x009e) + endprops +}; + +s32 intro[] = { + ammo(AMMOTYPE_PISTOL, 50) + outfit(OUTFIT_TRENCH) + spawn(PAD_PETE_0063) + endintro +}; + +s32 path00[] = { + PAD_PETE_00D3, + PAD_PETE_00D4, + PAD_PETE_00D9, + PAD_PETE_00D6, + PAD_PETE_00D7, + PAD_PETE_0036, + PAD_PETE_00D7, + PAD_PETE_00D6, + PAD_PETE_00D9, + PAD_PETE_00D4, + PAD_PETE_00D3, + -1, +}; + +s32 path01[] = { + PAD_PETE_00DA, + PAD_PETE_00D7, + PAD_PETE_00D7, + PAD_PETE_00D6, + PAD_PETE_00D9, + PAD_PETE_00D5, + PAD_PETE_00D4, + PAD_PETE_00DB, + PAD_PETE_00DE, + PAD_PETE_00D3, + -1, +}; + +s32 path02[] = { + PAD_PETE_00A4, + PAD_PETE_00A4, + PAD_PETE_00A4, + PAD_PETE_00A4, + PAD_PETE_00A4, + -1, +}; + +s32 path03[] = { + PAD_PETE_00E3, + -1, +}; + +s32 path04[] = { + PAD_PETE_00A3, + PAD_PETE_00A3, + PAD_PETE_00A3, + PAD_PETE_00A3, + PAD_PETE_00A3, + -1, +}; + +s32 path05[] = { + PAD_PETE_00E8, + -1, +}; + +s32 path06[] = { + PAD_PETE_00EA, + PAD_PETE_00EA, + PAD_PETE_00EA, + PAD_PETE_00E8, + -1, +}; + +s32 path07[] = { + PAD_PETE_0061, + PAD_PETE_0060, + PAD_PETE_0065, + PAD_PETE_005F, + PAD_PETE_005E, + PAD_PETE_005D, + PAD_PETE_005E, + PAD_PETE_005F, + PAD_PETE_0065, + PAD_PETE_0060, + -1, +}; + +s32 path08[] = { + PAD_PETE_0038, + PAD_PETE_002E, + PAD_PETE_000C, + PAD_PETE_002E, + PAD_PETE_0038, + PAD_PETE_0037, + -1, +}; + +s32 path09[] = { + PAD_PETE_0033, + PAD_PETE_0035, + PAD_PETE_0034, + PAD_PETE_002D, + PAD_PETE_0028, + PAD_PETE_002A, + PAD_PETE_001D, + PAD_PETE_002A, + PAD_PETE_0028, + PAD_PETE_002D, + PAD_PETE_0034, + PAD_PETE_0035, + -1, +}; + +s32 path10[] = { + PAD_PETE_0047, + PAD_PETE_0046, + PAD_PETE_0047, + -1, +}; + +s32 path11[] = { + PAD_PETE_0034, + PAD_PETE_0043, + PAD_PETE_0041, + PAD_PETE_0051, + PAD_PETE_0041, + PAD_PETE_0043, + PAD_PETE_0034, + -1, +}; + +s32 path12[] = { + PAD_PETE_0061, + PAD_PETE_0060, + PAD_PETE_0066, + PAD_PETE_0062, + PAD_PETE_0063, + PAD_PETE_0064, + PAD_PETE_0063, + PAD_PETE_0062, + PAD_PETE_0066, + PAD_PETE_0060, + -1, +}; + +s32 path13[] = { + PAD_PETE_00DA, + PAD_PETE_00D7, + PAD_PETE_00D7, + PAD_PETE_00D6, + PAD_PETE_00D9, + PAD_PETE_00D5, + PAD_PETE_00D4, + PAD_PETE_00DB, + PAD_PETE_00DE, + PAD_PETE_00D3, + -1, +}; + +#define chicago_car_do_animation(object, animation) \ + enable_object(object) \ + set_object_flag2(object, OBJFLAG2_04000000) \ + set_object_flag3(object, OBJFLAG3_00000010) \ + object_do_animation(animation, object, 0x04, 0xffff) + +#define chicago_wait_for_camera \ + beginloop(0x05) \ + if_camera_animating(/*goto*/ 0x03) \ + goto_next(0x04) \ + label(0x03) \ + if_controller_button_pressed(/*goto*/ 0x04) \ + goto_first(0x05) \ + label(0x04) + +u8 func0401_3ae8[] = { + set_stage_flag(STAGEFLAG_TRIGGER_INTRO) + if_controller_button_pressed(/*goto*/ 0x00) + camera_movement(ANIM_CUT_PETE_INTRO_CAM_01) + play_cutscene_track(MUSIC_CHICAGO_INTRO) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + + chicago_car_do_animation(OBJ_CAR1, ANIM_CUT_PETE_INTRO_VEHICLE_01) + chicago_car_do_animation(OBJ_CAR2, ANIM_CUT_PETE_INTRO_VEHICLE_02) + chicago_car_do_animation(OBJ_CAR3, ANIM_CUT_PETE_INTRO_VEHICLE_03) + chicago_car_do_animation(OBJ_CAR4, ANIM_CUT_PETE_INTRO_VEHICLE_04) + + set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + + chicago_wait_for_camera + + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + disable_object(OBJ_CAR1) + disable_object(OBJ_CAR2) + disable_object(OBJ_CAR3) + disable_object(OBJ_CAR4) + unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + label(0x00) + return + endlist +}; + +u8 func0402_3bb4[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + if_controller_button_pressed(/*goto*/ 0x00) + camera_movement(ANIM_CUT_PETE_INTRO_CAM_02) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + + chicago_car_do_animation(OBJ_CAR1, ANIM_CUT_PETE_INTRO_VEHICLE_05) + chicago_car_do_animation(OBJ_CAR2, ANIM_CUT_PETE_INTRO_VEHICLE_06) + chicago_car_do_animation(OBJ_CAR4, ANIM_CUT_PETE_INTRO_VEHICLE_07) + chicago_car_do_animation(OBJ_CAR5, ANIM_CUT_PETE_INTRO_VEHICLE_08) + + set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + + chicago_wait_for_camera + + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + disable_object(OBJ_CAR1) + disable_object(OBJ_CAR2) + disable_object(OBJ_CAR4) + disable_object(OBJ_CAR5) + unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + label(0x00) + return + endlist +}; + +u8 func0403_3c74[] = { + if_controller_button_pressed(/*goto*/ 0x00) + camera_movement(ANIM_CUT_PETE_INTRO_CAM_03) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + enable_object(OBJ_CAR4) + set_object_flag2(OBJ_CAR4, OBJFLAG2_04000000) + set_object_flag3(OBJ_CAR4, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_PETE_INTRO_VEHICLE_09, OBJ_CAR4, 0x04, 0xffff) + set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + + chicago_wait_for_camera + + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + disable_object(OBJ_CAR4) + unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + label(0x00) + return + endlist +}; + +u8 func0404_3ce0[] = { + enable_object(OBJ_WIREFENCE) + set_object_flag2(OBJ_WIREFENCE, OBJFLAG2_04000000) + set_object_flag3(OBJ_WIREFENCE, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_PETE_INTRO_FENCE, OBJ_WIREFENCE, 0x01, 0xffff) + + if_controller_button_pressed(/*goto*/ 0x00) + camera_movement(ANIM_CUT_PETE_INTRO_CAM_04) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PETE_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + + chicago_wait_for_camera + + unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + label(0x00) + return + endlist +}; + +u8 func0405_3d50[] = { + camera_movement(ANIM_CUT_PETE_INTRO_CAM_05) + cmd0175(60) + if_controller_button_pressed(/*goto*/ 0x00) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PETE_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + + restart_timer + + beginloop(0x2d) + if_controller_button_pressed(/*goto*/ 0x2f) + if_timer_gt(480, /*goto*/ 0x04) + endloop(0x2d) + + label(0x04) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + beginloop(0x2f) + if_controller_button_pressed(/*goto*/ 0x04) + if_timer_gt(910, /*goto*/ 0x04) + endloop(0x2f) + + label(0x04) + chicago_wait_for_camera + + label(0x00) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + mute_channel(CHANNEL_7) + unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) + + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PETE_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + stop_cutscene_track + stop_ambient_track + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function1[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, 0x0401) + endlist +}; + +u8 unregistered_function2[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, 0x0402) + endlist +}; + +u8 unregistered_function3[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, 0x0403) + endlist +}; + +u8 unregistered_function4[] = { + set_returnlist(CHR_SELF, GAILIST_END_CINEMA) + set_ailist(CHR_SELF, 0x0404) + endlist +}; + +u8 unregistered_function5[] = { + set_ailist(CHR_SELF, 0x0405) + endlist +}; + +u8 func040a_intro[] = { + set_returnlist(CHR_SELF, 0x0406) + set_ailist(CHR_SELF, 0x0401) + endlist +}; + +u8 func0406_3e54[] = { + set_returnlist(CHR_SELF, 0x0407) + set_ailist(CHR_SELF, 0x0402) + endlist +}; + +u8 func0407_3e60[] = { + set_returnlist(CHR_SELF, 0x0408) + set_ailist(CHR_SELF, 0x0403) + endlist +}; + +u8 func0408_3e6c[] = { + set_returnlist(CHR_SELF, 0x0409) + set_ailist(CHR_SELF, 0x0404) + endlist +}; + +u8 func0409_3e78[] = { + set_ailist(CHR_SELF, 0x0405) + endlist +}; + +u8 func100f_check_mine[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) + + // SA and PA + yield + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_BRIEFCASE1, /*goto*/ 0x03) + reloop(0x08) + + label(0x03) + set_target_chr(CHR_P1P2) + + beginloop(0x11) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x29) + if_ammo_quantity_lt(CHR_TARGET, AMMOTYPE_REMOTE_MINE, 1, /*goto*/ 0x03) + endloop(0x11) + + label(0x29) + label(0x54) + yield + if_chr_deadish(CHR_TARGET, /*goto*/ 0x28) + yield + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_REMOTE_MINE, 1, /*goto*/ 0x29) + reloop(0x08) + + label(0x29) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_REMOTE_MINE, 1, /*goto*/ 0x29) + endloop(0x08) + + label(0x29) + label(0x28) + goto_first(0x54) + + label(0x03) + yield + yield + yield + yield + yield + if_weapon_thrown(WEAPON_REMOTEMINE, /*goto*/ 0x04) + goto_first(0x11) + + label(0x04) + restart_timer + + beginloop(0x05) + if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORTOP, /*goto*/ 0x06) + if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORBOTTOM, /*goto*/ 0x08) + if_timer_gt(120, /*goto*/ 0x07) + endloop(0x05) + + label(0x08) + unset_savefile_flag(GAMEFILEFLAG_G5_MINE) + goto_next(0x03) + label(0x06) + set_savefile_flag(GAMEFILEFLAG_G5_MINE) + + label(0x03) + set_stage_flag(STAGEFLAG_MINE_PLACED) + show_hudmsg(CHR_P1P2, L_PETE_015) // "Mine placed correctly." + + // Check that the player hasn't detonated the mine + beginloop(0x2d) + if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORTOP, /*goto*/ 0x03) + if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORBOTTOM, /*goto*/ 0x03) + goto_next(0x04) + label(0x03) + endloop(0x2d) + + label(0x04) + set_stage_flag(STAGEFLAG_MINE_WASTED) + show_hudmsg(CHR_P1P2, L_PETE_072) // "Remote Mine has been wasted." + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x07) + set_stage_flag(STAGEFLAG_MINE_WASTED) + show_hudmsg(CHR_P1P2, L_PETE_016) // "Mine placed incorrectly." + + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1026_uplink[] = { + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_TAXI, /*goto*/ 0x03) + reloop(0x10) + + label(0x03) + if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, FALSE, /*goto*/ 0x04) + show_hudmsg(CHR_P1P2, L_PETE_017) // "Virus already downloaded into NavComp." + reloop(0x10) + + label(0x04) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ 0x03) + show_hudmsg(CHR_P1P2, L_PETE_018) // "Hovcab is unresponsive - need Reprogrammer." + reloop(0x10) + + // Uplinking + label(0x03) + show_hudmsg(CHR_P1P2, L_PETE_019) // "Accessing hovercab navigation systems." + assign_sound(SFX_0456, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_TAXI, TRUE) + restart_timer + + beginloop(0x05) + if_timer_gt(300, /*goto*/ 0x04) + if_chr_distance_to_pad_gt(CHR_P1P2, 350, PAD_PETE_00A3, /*goto*/ 0x06) + endloop(0x05) + + label(0x04) + show_hudmsg(CHR_P1P2, L_PETE_020) // "Virus downloaded successfully." + yield + show_hudmsg(CHR_P1P2, L_PETE_021) // "Hovercab navigation systems reprogrammed." + mute_channel(CHANNEL_7) + assign_sound(SFX_01C1, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_TAXI, TRUE) + yield + set_stage_flag(STAGEFLAG_TAXI_REPROGRAMMED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Moved away while uplinking + label(0x06) + show_hudmsg(CHR_P1P2, L_PETE_022) // "Connection to hovercab broken." + mute_channel(CHANNEL_7) + yield + yield + yield + assign_sound(SFX_0457, CHANNEL_4) + play_sound_from_object(CHANNEL_4, OBJ_TAXI, 1, 300, 400) + restart_timer + + beginloop(0x1d) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x1d) + + label(0x04) + mute_channel(CHANNEL_4) + endloop(0x10) + + endlist +}; + +u8 func040d_limo[] = { + begin_hovercar_path(0x02) + set_vehicle_speed(GOPOSFLAG_WALK, 0) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) + + // SA and PA + set_chr_maxdamage(CHR_SELF, 34464) + goto_next(0x04) + + // A + label(0x03) + set_chr_maxdamage(CHR_SELF, 65456) + + // All difficulties + label(0x04) + + // Wait for flag set, provided limo not destroyed + beginloop(0x05) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ 0x04) + endloop(0x05) + + label(0x04) + + // Wait until not in room + beginloop(0x2d) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0002, /*goto*/ 0x03) + if_chr_in_room(CHR_P1P2, 0x00, 0x0010, /*goto*/ 0x03) + if_chr_in_room(CHR_P1P2, 0x00, 0x0012, /*goto*/ 0x03) + goto_next(0x04) + label(0x03) + endloop(0x2d) + + label(0x04) + set_object_flag2(OBJ_LIMO, OBJFLAG2_04000000) + set_object_flag3(OBJ_LIMO, OBJFLAG3_00000010) + object_do_animation(ANIM_02D6, OBJ_LIMO, 0x04, 0xffff) + + assign_sound(SFX_BIKE_ENGINE, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_LIMO, 1, 2400, 3200) + if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ 0x03) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x03) + set_stage_flag(STAGEFLAG_LIMO_ESCAPED) + show_hudmsg(CHR_BOND, L_PETE_028) // "DataDyne limo has escaped." + label(0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_taxi[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) + + // SA and PA + set_chr_maxdamage(CHR_SELF, 34464) + goto_next(0x04) + + // A + label(0x03) + set_chr_maxdamage(CHR_SELF, 65456) + begin_hovercar_path(0x04) + set_vehicle_speed(GOPOSFLAG_WALK, 0) + + // All difficulties + label(0x04) + + beginloop(0x05) + if_stage_flag_eq(STAGEFLAG_TRIGGER_TAXI_LEAVE, TRUE, /*goto*/ 0x04) + label(0x03) + endloop(0x05) + + // Check taxi healthy + label(0x04) + if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Take off + label(0x03) + assign_sound(SFX_8000, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_TAXI, 1, 2400, 3200) + object_do_animation(ANIM_0168, OBJ_TAXI, 0x04, 0xffff) + set_object_flag2(OBJ_TAXI, OBJFLAG2_04000000) + + // Wait for flag + beginloop(0x06) + if_stage_flag_eq(STAGEFLAG_TAXI_ALMOST_READY_TO_CRASH, TRUE, /*goto*/ 0x04) + endloop(0x06) + + // Check taxi healthy + label(0x04) + if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + set_stage_flag(STAGEFLAG_TAXI_READY_TO_CRASH) + + // Wait for another flag + beginloop(0x07) + if_stage_flag_eq(STAGEFLAG_ROBOT_NEAR_CORNER, TRUE, /*goto*/ 0x04) + endloop(0x07) + + label(0x04) + label(0x38) + set_stage_flag(STAGEFLAG_TRIGGER_CRASH) + yield + mute_channel(CHANNEL_0) + object_do_animation(ANIM_0169, OBJ_TAXI, 0x04, 0xffff) + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define tracerbug_logic(chr, chr2) \ + set_chrpreset(chr) \ + if_difficulty_lt(DIFF_PA, /*goto*/ 0x54) \ + goto_next(0x04) \ + \ + /* A or SA */ \ + label(0x54) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + /* PA */ \ + label(0x04) \ + yield \ + \ + beginloop(0x11) \ + set_target_chr(chr2) \ + if_chr_deadish(chr, /*goto*/ 0x2f) \ + if_ammo_quantity_lt(chr, AMMOTYPE_BUG, 1, /*goto*/ 0x03) \ + label(0x04) \ + endloop(0x11) \ + \ + /* Dead - not sure why it checks this a second time */ \ + beginloop(0x2f) \ + set_target_chr(chr2) \ + if_chr_deadish(chr, /*goto*/ 0x30) \ + label(0x31) \ + yield \ + yield \ + yield \ + yield \ + yield \ + goto_first(0x11) \ + \ + label(0x30) \ + endloop(0x2f) \ + \ + /* Alive but has no bug */ \ + label(0x03) \ + yield \ + if_weapon_thrown(WEAPON_TRACERBUG, /*goto*/ 0x04) \ + goto_first(0x03) \ + \ + /* Check limo healthy */ \ + label(0x04) \ + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x04) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + label(0x04) \ + restart_timer \ + \ + beginloop(0x05) \ + if_weapon_thrown_on_object(WEAPON_TRACERBUG, OBJ_LIMO, /*goto*/ 0x06) \ + if_timer_gt(120, /*goto*/ 0x07) \ + endloop(0x05) \ + \ + label(0x06) \ + set_stage_flag(STAGEFLAG_TRACERBUG_PLACED) \ + unset_stage_flag(STAGEFLAG_TRACERBUG_WASTED) \ + show_hudmsg(chr, 0x3217) /* "Tracer Bug placed correctly." */ \ + restart_timer \ + \ + beginloop(0x08) \ + if_timer_gt(300, /*goto*/ 0x04) \ + goto_first(0x08) \ + \ + label(0x04) \ + set_stage_flag(STAGEFLAG_TRACERBUG_SAFE) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + /* Bug wasted */ \ + label(0x07) \ + if_stage_flag_eq(STAGEFLAG_ONE_BUG_REMAINING, TRUE, /*goto*/ 0x03) \ + set_stage_flag(STAGEFLAG_ONE_BUG_REMAINING) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + label(0x03) \ + set_stage_flag(STAGEFLAG_TRACERBUG_WASTED) \ + show_hudmsg(chr, 0x3218) /* "Tracer Bug placed incorrectly." */ \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 func1004_tracerbug_bond[] = { + tracerbug_logic(CHR_BOND, CHR_BOND) + endlist +}; + +u8 func1011_trackerbug_coop[] = { + yield + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x03) + goto_next(0x04) + + label(0x03) + set_stage_flag(STAGEFLAG_ONE_BUG_REMAINING) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x04) + tracerbug_logic(CHR_COOP, CHR_PRESET) + endlist +}; + +u8 func1005_check_things_destroyed[] = { + beginloop(0x10) + // Check limo + if_stage_flag_eq(STAGEFLAG_LIMO_DESTROYED, TRUE, /*goto*/ 0x03) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + set_stage_flag(STAGEFLAG_LIMO_DESTROYED) + mute_channel(CHANNEL_1) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) + show_hudmsg(CHR_BOND, L_PETE_025) // "Mission critical vehicle destroyed." + + // Check taxi + label(0x03) + if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) + if_stage_flag_eq(STAGEFLAG_TAXI_DESTROYED, TRUE, /*goto*/ 0x03) + if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) + mute_channel(CHANNEL_0) + set_stage_flag(STAGEFLAG_TAXI_DESTROYED) + show_hudmsg(CHR_BOND, L_PETE_025) // "Mission critical vehicle destroyed." + + // Check robot + label(0x03) + if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) + if_stage_flag_eq(STAGEFLAG_ROBOT_DESTROYED, TRUE, /*goto*/ 0x03) + if_chr_dead(CHR_ROBOT, /*goto*/ 0x04) + goto_next(0x03) + + label(0x04) + restart_timer + + beginloop(0x05) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x05) + + label(0x04) + set_stage_flag(STAGEFLAG_ROBOT_DESTROYED) + show_hudmsg(CHR_BOND, L_PETE_025) // "Mission critical vehicle destroyed." + label(0x03) + endloop(0x10) + + endlist +}; + +u8 func1006_check_for_end[] = { + beginloop(0x05) + chr_toggle_p1p2(CHR_SELF) + if_objective_complete(0, /*goto*/ 0x03) + reloop(0x05) + + label(0x03) + if_objective_complete(3, /*goto*/ 0x03) + reloop(0x05) + + label(0x03) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) + if_objective_complete(2, /*goto*/ 0x03) + reloop(0x05) + + label(0x03) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0a) + if_objective_complete(1, /*goto*/ 0x0a) + reloop(0x05) + + label(0x0a) + if_chr_distance_to_pad_lt(CHR_P1P2, 350, PAD_PETE_00A7, /*goto*/ 0x04) + endloop(0x05) + + label(0x04) + set_stage_flag(STAGEFLAG_IN_ELEVATOR) + yield + yield + set_invincible(CHR_BOND) + revoke_control(CHR_BOND, 4) + + // But there is no countdown timer... + hide_countdown_timer + stop_countdown_timer + + if_all_objectives_complete(/*goto*/ 0x05) + + // Objectives failed + show_hudmsg(CHR_P1P2, L_PETE_026) // "MISSION FAILED" + label(0x03) + restart_timer + + beginloop(0x13) + if_timer_gt(280, /*goto*/ 0x12) + endloop(0x13) + + label(0x12) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Objectives complete + label(0x05) + if_chr_deadish(CHR_BOND, /*goto*/ 0x03) + goto_next(0x04) + + label(0x03) + if_chr_deadish(CHR_COOP, /*goto*/ 0x03) + goto_next(0x04) + + label(0x03) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x04) + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_limo_timing[] = { + // Wait for any of the following: + // - Taxi reprogrammed + // - Tracer bug placed and robot on drain street + // - 2 minutes elapsed and robot on drain street (3 mins on Agent) + restart_timer + + beginloop(0x05) + if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, TRUE, /*goto*/ 0x04) + if_stage_flag_eq(STAGEFLAG_ROBOT_ON_DRAIN_STREET, TRUE, /*goto*/ 0x03) + reloop(0x05) + + label(0x03) + if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ 0x04) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x07) + if_difficulty_gt(DIFF_A, /*goto*/ 0x06) + + // A - 3 minute timer + if_timer_gt(10800, /*goto*/ 0x04) + reloop(0x05) + + // SA - 2 minute timer + label(0x06) + if_timer_gt(7200, /*goto*/ 0x04) + reloop(0x05) + + // PA - 2 minute timer + label(0x07) + if_timer_gt(7200, /*goto*/ 0x04) + endloop(0x05) + + // Ready to leave + label(0x04) + set_stage_flag(STAGEFLAG_LIMO_READY_TO_LEAVE) + restart_timer + + // Wait 15 seconds + beginloop(0x0a) + if_timer_gt(900, /*goto*/ 0x04) + endloop(0x0a) + + label(0x04) + set_stage_flag(STAGEFLAG_LIMO_READY_15SEC_AGO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_taxi_timing[] = { + // Wait for both conditions + beginloop(0x07) + if_stage_flag_eq(STAGEFLAG_ROBOT_ON_DRAIN_STREET, TRUE, /*goto*/ 0x03) + reloop(0x07) + + label(0x03) + if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, TRUE, /*goto*/ 0x03) + endloop(0x07) + + // Wait 3.3 seconds + label(0x03) + restart_timer + + beginloop(0x05) + if_timer_gt(200, /*goto*/ 0x04) + endloop(0x05) + + label(0x04) + set_stage_flag(STAGEFLAG_TRIGGER_TAXI_LEAVE) + restart_timer + + // Wait 10 seconds + beginloop(0x06) + if_timer_gt(600, /*goto*/ 0x04) + endloop(0x06) + + label(0x04) + set_stage_flag(STAGEFLAG_TAXI_ALMOST_READY_TO_CRASH) + unset_object_flag2(OBJ_TAXI, OBJFLAG2_04000000) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_cia[] = { + set_returnlist(CHR_SELF, AILIST_CIA) + set_shotlist(AILIST_CIA) + if_chr_deadish(CHR_SELF, /*goto*/ 0x04) + goto_next(0x03) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + if_chr_idle(/*goto*/ 0x43) + if_num_times_shot_lt(1, /*goto*/ 0x10) + + // Has been shot + beginloop(0x0d) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x0d) + + label(0x04) + goto_next(0x0c) + + // Unreachable + restart_timer + + // Chr is idle + beginloop(0x43) + if_saw_death(0x00, /*goto*/ 0x1d) + if_saw_injury(0x00, /*goto*/ 0x1e) + if_timer_gt(180, /*goto*/ 0x04) + endloop(0x43) + + // Idle + 3 seconds + label(0x04) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x54) + stop_chr + goto_next(0x10) + + // Patroller + label(0x54) + start_patrol + + // Not shot, not a patroller, or patroller who has started his path + label(0x10) + yield + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x37) + call_rng + if_rand_gt(128, /*goto*/ 0x37) + label(0x2d) + restart_timer + label(0x08) + stop_chr + if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x03) + call_rng + if_rand_gt(128, /*goto*/ 0x03) + call_rng + if_rand_lt(64, /*goto*/ 0x50) + if_rand_lt(128, /*goto*/ 0x51) + if_rand_lt(196, /*goto*/ 0x52) + set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + chr_do_animation(ANIM_SMOKE_CIGARETTE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x36) + + label(0x50) + chr_do_animation(ANIM_SCRATCH_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x36) + + label(0x51) + chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x36) + + label(0x52) + chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x36) + + label(0x53) + chr_do_animation(ANIM_TWO_GUN_HOLD, 0, 100, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x36) + + label(0x03) + unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) + if_room_onscreen(0x003e, /*goto*/ 0x04) + set_padpreset(PAD_PETE_00BA) + goto_next(0x03) + + label(0x04) + call_rng + if_rand_lt(64, /*goto*/ 0x50) + if_rand_lt(128, /*goto*/ 0x51) + if_rand_lt(196, /*goto*/ 0x52) + try_set_target_pad_to_something(0x08, /*goto*/ 0x03) + label(0x50) + try_set_target_pad_to_something(0x02, /*goto*/ 0x03) + label(0x51) + try_set_target_pad_to_something(0x04, /*goto*/ 0x03) + label(0x52) + try_set_target_pad_to_something(0x08, /*goto*/ 0x03) + goto_next(0x36) + + label(0x03) + go_to_target_pad(GOPOSFLAG_WALK) + + beginloop(0x36) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_saw_death(0x00, /*goto*/ 0x1d) + if_saw_injury(0x00, /*goto*/ 0x1e) + if_target_in_sight(/*goto*/ 0x04) + if_chr_stopped(/*goto*/ 0x35) + endloop(0x36) + + label(0x35) + goto_first(0x10) + + label(0x37) + if_saw_death(0x00, /*goto*/ 0x1d) + if_saw_injury(0x00, /*goto*/ 0x1e) + if_target_in_sight(/*goto*/ 0x04) + goto_first(0x10) + + label(0x04) + restart_timer + label(0x05) + yield + if_saw_death(0x00, /*goto*/ 0x1d) + if_saw_injury(0x00, /*goto*/ 0x1e) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_UNARMED, /*goto*/ 0x03) + goto_next(0x04) + + label(0x03) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x03) + if_distance_to_target_gt(450, /*goto*/ 0x03) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_returnlist(CHR_SELF, AILIST_CIA) + set_ailist(CHR_SELF, GAILIST_CIVILIAN_SAY_COMMENT) + + label(0x03) + if_timer_lt(600, /*goto*/ 0x03) + unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + label(0x03) + goto_first(0x10) + + label(0x1e) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x04) + if_timer_gt(40, /*goto*/ 0x04) + endloop(0x09) + + // Saw a death + label(0x1d) + restart_timer + chr_do_animation(ANIM_LOOK_AROUND_FRANTIC, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + // Shot near chr, or follow through from above + beginloop(0x1e) + if_timer_gt(90, /*goto*/ 0x0c) + endloop(0x1e) + + label(0x04) + increase_squadron_alertness(100) + + beginloop(0x38) + if_chr_in_squadron_doing_action(MA_TALKING, /*goto*/ 0x04) + goto_next(0x03) + + // A civilian is cowering + label(0x04) + restart_timer + + beginloop(0x3a) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x3a) + + label(0x04) + set_self_flag_bankx(CHRFLAG0_CHUCKNORRIS, BANK_0) + set_squadron(SQUADRON_03) + endloop(0x38) + + label(0x03) + rebuild_teams + rebuild_squadrons + set_action(MA_TALKING, FALSE) + say_quip(CHR_BOND, 0x18, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) + chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x0c) + endloop(0x0a) + + // Alerted + label(0x0c) + set_action(MA_NORMAL, FALSE) + if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, FALSE, BANK_0, /*goto*/ 0x03) + set_squadron(SQUADRON_04) + rebuild_teams + rebuild_squadrons + label(0x03) + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x04) + goto_next(0x0b) + + label(0x03) + goto_first(0x05) + + label(0x04) + set_chr_team(CHR_SELF, TEAM_NONCOMBAT) + rebuild_teams + rebuild_squadrons + try_run_to_chr(CHR_PRESET, /*goto*/ 0x06) + + beginloop(0x06) + if_distance_to_chr_lt(2520, CHR_HIDDENGUY, /*goto*/ 0x03) + reloop(0x06) + + label(0x03) + if_detected_chr(CHR_PRESET, /*goto*/ 0x04) + endloop(0x06) + + label(0x04) + increase_squadron_alertness(100) + say_quip(CHR_BOND, 0x19, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) + label(0x0b) + set_chr_team(CHR_SELF, TEAM_NONCOMBAT) + rebuild_teams + rebuild_squadrons + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2d) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) + run_to_pad(PAD_PETE_00C8) + goto_next(0x07) + + label(0x2d) + run_to_pad(PAD_PETE_005A) + goto_next(0x07) + + label(0x2f) + run_to_pad(PAD_PETE_0026) + label(0x07) + yield + if_chr_stopped(/*goto*/ 0x04) + label(0x03) + goto_first(0x07) + + label(0x04) + + label(0x0e) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x03) + endloop(0x0f) + + label(0x03) + goto_first(0x0e) + + endlist +}; + +u8 func0413_bugspotter[] = { +#define LABEL_RUN_AWAY 0x0d + + set_alertness(255) + set_shotlist(AILIST_BUGSPOTTER) + if_chr_deadish(CHR_SELF, /*goto*/ 0x04) + goto_next(0x03) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + + // Wait until player in sight (mainly) + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x04) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + goto_next(LABEL_RUN_AWAY) + label(0x03) + endloop(0x10) + + // Player in sight - face them + label(0x04) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x04) + if_timer_gt(40, /*goto*/ 0x04) + endloop(0x09) + + // Make a comment + label(0x04) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_UNARMED, /*goto*/ 0x03) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_NONE, /*goto*/ 0x03) + say_quip(CHR_BOND, 0x1a, 0xff, 0x0a, 0xff, 0x81, 0x00, 0x00) + goto_next(0x04) + label(0x03) + say_quip(CHR_BOND, 0x17, 0xff, 0x0a, 0xff, 0x81, 0x00, 0x00) + label(0x04) + chr_do_animation(ANIM_TALKING_00A3, 0, -1, 0, 16, CHR_SELF, 2) + + // Looks like he spots if the tracer bug if he sees Jo within 8.3 seconds of + // the bug landing on the limo. + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + goto_next(LABEL_RUN_AWAY) + + label(0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x03) + goto_next(0x0a) + label(0x03) + if_stage_flag_eq(STAGEFLAG_TRACERBUG_SAFE, TRUE, /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ 0x04) + label(0x0a) + if_timer_gt(500, /*goto*/ 0x03) + endloop(0x08) + + label(0x03) + if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ LABEL_RUN_AWAY) + goto_first(0x10) + + // Bug was thrown recently + label(0x04) + chr_do_animation(ANIM_TALKING_00A3, 0, -1, 0, 16, CHR_SELF, 2) + assign_sound(SFX_044A, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + set_stage_flag(STAGEFLAG_TRACERBUG_SPOTTED) + show_hudmsg(CHR_BOND, L_PETE_067) // "Tracer Bug has been spotted." + + // Wait for talking animation to finish + beginloop(0x05) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + goto_next(LABEL_RUN_AWAY) + label(0x03) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x05) + + // Find another guard and run to them + label(0x04) + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x04) + goto_next(0x0b) + + label(0x04) + try_run_to_chr(CHR_PRESET, /*goto*/ 0x06) + + // Wait until detected target guard + beginloop(0x06) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + goto_next(LABEL_RUN_AWAY) + label(0x03) + if_detected_chr(CHR_PRESET, /*goto*/ 0x04) + endloop(0x06) + + // Alert everyone in group + label(0x04) + increase_squadron_alertness(100) + assign_sound(SFX_0467, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + + // No other guard to run to + label(0x0b) + retreat(GOPOSFLAG_RUN, 2) + + beginloop(0x07) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + goto_next(LABEL_RUN_AWAY) + label(0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_nearly_in_targets_sight(30, /*goto*/ 0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_nearly_in_targets_sight(30, /*goto*/ 0x03) + goto_next(0x04) + label(0x03) + goto_first(0x07) + + label(0x04) + restart_timer + + beginloop(0x0e) + if_timer_gt(10, /*goto*/ 0x03) + endloop(0x0e) + + label(0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_nearly_in_targets_sight(30, /*goto*/ 0x03) + goto_next(0x04) + label(0x03) + goto_first(0x07) + + label(0x04) + unset_self_chrflag(CHRCFLAG_KILLCOUNTABLE) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + yield + drop_gun_and_fade_out + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(LABEL_RUN_AWAY) + jog_to_pad(PAD_PETE_004F) + + beginloop(0x0e) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x0e) + + label(0x04) + stop_chr + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define init_patroller(pathid) \ + set_chr_dodge_rating(2, 10) \ + set_accuracy(4) \ + set_reaction_speed(30) \ + set_chr_maxdamage(CHR_SELF, 40) \ + add_health_or_armor(0) \ + set_recovery_speed(0) \ + set_shield(0) \ + assign_path(pathid) \ + start_patrol \ + set_ailist(CHR_SELF, GAILIST_UNALERTED) \ + \ + beginloop(0x04) \ + endloop(0x04) + +u8 func0414_start_path07[] = { + init_patroller(0x07) + endlist +}; + +u8 func0415_start_path08[] = { + init_patroller(0x08) + endlist +}; + +u8 func0416_start_path09[] = { + init_patroller(0x09) + endlist +}; + +u8 func0417_start_path10[] = { + init_patroller(0x0a) + endlist +}; + +u8 func0418_start_path11[] = { + init_patroller(0x0b) + endlist +}; + +/** + * This chr waits 2 seconds before starting his path. + */ +u8 func0419_init_cia1[] = { + restart_timer + + beginloop(0x05) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x05) + + label(0x04) + assign_path(12) + start_patrol + set_ailist(CHR_SELF, AILIST_CIA) + + beginloop(0x04) + endloop(0x04) + + endlist +}; + +u8 func041d_fbi[] = { + set_shotlist(AILIST_FBI) + if_chr_deadish(CHR_SELF, /*goto*/ 0x04) + goto_next(0x03) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + if_num_times_shot_lt(1, /*goto*/ 0x19) + + // Shot - wait for animation to finish + beginloop(0x05) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x05) + + label(0x04) + goto_next(0x17) + + // Unreachable + label(0x04) + say_quip(CHR_BOND, 0x1b, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) + increase_squadron_alertness(100) + goto_next(0x16) + + // Not shot + label(0x19) + set_action(MA_NORMAL, TRUE) + yield + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0x04) + goto_next(0x16) + + label(0x04) + if_target_in_sight(/*goto*/ 0x18) + if_near_miss(/*goto*/ 0x18) + if_num_times_shot_gt(0, /*goto*/ 0x18) + if_hears_target(/*goto*/ 0x16) + if_saw_injury(0x00, /*goto*/ 0x16) + if_saw_death(0x00, /*goto*/ 0x16) + if_sees_suspicious_item(/*goto*/ 0x16) + endloop(0x19) + + label(0x16) + if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, FALSE, /*goto*/ 0x04) + + // Draw magnum and go after player + label(0x17) + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x03) + label(0x03) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(0x04) + try_jog_to_target(/*goto*/ 0x06) + + beginloop(0x06) + if_distance_to_target_lt(500, /*goto*/ 0x18) + if_target_in_sight(/*goto*/ 0x18) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x18) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + endloop(0x06) + + label(0x18) + if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, FALSE, /*goto*/ 0x04) + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x03) + label(0x03) + set_ailist(CHR_SELF, GAILIST_ALERTED) + + label(0x04) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0d) + + beginloop(0x0d) + if_target_in_fov_left(10, /*goto*/ 0x04) + if_timer_gt(40, /*goto*/ 0x04) + endloop(0x0d) + + label(0x04) + say_quip(CHR_BOND, 0x1b, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) + chr_do_animation(ANIM_0266, 0, 193, 0, 16, CHR_SELF, 2) + + beginloop(0x0e) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) + if_chr_not_talking(CHR_SELF, /*goto*/ 0x04) + label(0x03) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x0e) + + label(0x04) + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x04) + label(0x04) + yield + set_stage_flag(STAGEFLAG_ALARM_SOUNDED) + activate_alarm + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +#define check_cia_dead(chr) \ + beginloop(0x10) \ + if_chr_dead(chr, /*goto*/ 0x05) \ + endloop(0x10) \ + \ + /* Unreachable */ \ + label(0x03) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + label(0x05) \ + set_stage_flag(STAGEFLAG_CIVILIAN_DEAD) \ + show_hudmsg(CHR_BOND, 0x321d) /* "Mission failed - unacceptable civilian casualties." */ \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 func1009_check_cia1_dead[] = { + check_cia_dead(CHR_CIA1) + endlist +}; + +/** + * This guy is allowed to be killed once he has a certain flag. + */ +u8 func100a_check_cia2_dead[] = { + beginloop(0x10) + if_chr_has_flag_bankx(CHR_CIA2, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0, /*goto*/ 0x03) + if_chr_dead(CHR_CIA2, /*goto*/ 0x05) + endloop(0x10) + + // Stop checking this chr + label(0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x05) + set_stage_flag(STAGEFLAG_CIVILIAN_DEAD) + show_hudmsg(CHR_BOND, L_PETE_029) // "Mission failed - unacceptable civilian casualties." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_cia3_dead[] = { + check_cia_dead(CHR_CIA3) + endlist +}; + +u8 func100c_check_cia4_dead[] = { + check_cia_dead(CHR_CIA4) + endlist +}; + +u8 func041b_init_robot[] = { + set_accuracy(40) + set_shield(100) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) + set_ailist(CHR_SELF, AILIST_ROBOT) + endlist +}; + +u8 func041a_robot[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_chr_maxdamage(CHR_SELF, VERSION >= VERSION_NTSC_1_0 ? 1 : 40) + if_chr_dead(CHR_SELF, /*goto*/ 0x0c) + assign_path(0) + start_patrol + + beginloop(0x02) + set_target_chr(CHR_HIDDENGUY) + if_target_moving_closer(/*goto*/ 0x03) + unset_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) + goto_next(0x04) + + label(0x03) + set_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) + + label(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x01) + if_target_in_sight(/*goto*/ 0x08) + call_rng + if_rand_gt(5, /*goto*/ 0x03) + if_sound_finished(CHANNEL_5, /*goto*/ 0x04) + goto_next(0x03) + + label(0x04) + call_rng + if_rand_lt(86, /*goto*/ 0x06) + if_rand_lt(172, /*goto*/ 0x07) + assign_sound(SFX_046A, CHANNEL_5) + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) + goto_next(0x03) + + label(0x06) + assign_sound(SFX_046B, CHANNEL_5) + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) + goto_next(0x03) + + label(0x07) + assign_sound(SFX_046C, CHANNEL_5) + play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) + label(0x03) + + if_patrolling(/*goto*/ 0x03) + start_patrol + label(0x03) + reloop(0x02) + + label(0x08) + restart_timer + stop_chr + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x05) + play_sound(MP3_ROBOT_STOP_WHERE_YOU_ARE, -1) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + label(0x05) + if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x03) + goto_next(0x05) + + label(0x03) + if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x05) + play_sound(MP3_ROBOT_ALERT_UNDER_ATTACK, -1) + set_self_flag_bankx(CHRFLAG0_FORCESAFETYCHECKS, BANK_0) + + beginloop(0x05) + set_target_chr(CHR_HIDDENGUY) + if_target_moving_closer(/*goto*/ 0x03) + unset_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) + goto_next(0x04) + label(0x03) + set_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) + label(0x04) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x01) + if_timer_gt(120, /*goto*/ 0x04) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ 0x2a) + if_target_in_sight(/*goto*/ 0x03) + label(0x2a) + endloop(0x05) + + label(0x03) + set_target_chr(CHR_P1P2) + restart_timer + try_attack_stand(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + reloop(0x02) + + beginloop(0x09) + unset_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x01) + if_timer_gt(60, /*goto*/ 0x04) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x09) + + label(0x04) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + start_patrol + endloop(0x02) + + label(0x0c) + assign_sound(MP3_ROBOT_ALERT_UNDER_ATTACK, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x01) + label(0x04) + label(0x38) + set_chr_chrflag(CHR_ROBOT, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ROBOT, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ROBOT, CHRHFLAG_00020000) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) +#if VERSION >= VERSION_NTSC_1_0 + set_ailist(CHR_ROBOT, GAILIST_IDLE) +#endif + set_shield(0) + chr_do_animation(ANIM_016A, 0, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SELF, 4) + + beginloop(0x2d) + if_chr_stopped(/*goto*/ 0x04) + goto_first(0x2d) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041e_sealer1[] = { +#define LABEL_ALERTED 0x18 + + set_chr_dodge_rating(2, 10) + set_accuracy(4) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_shotlist(GAILIST_IDLE) + + beginloop(0x19) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_stage_flag_eq(STAGEFLAG_CRASH_FINISHED, TRUE, /*goto*/ 0x03) + if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0x04) + goto_next(LABEL_ALERTED) + + label(0x04) + if_target_in_sight(/*goto*/ LABEL_ALERTED) + if_near_miss(/*goto*/ LABEL_ALERTED) + if_num_times_shot_gt(0, /*goto*/ LABEL_ALERTED) + if_hears_target(/*goto*/ LABEL_ALERTED) + if_saw_injury(0x00, /*goto*/ LABEL_ALERTED) + if_saw_death(0x00, /*goto*/ LABEL_ALERTED) + if_sees_suspicious_item(/*goto*/ LABEL_ALERTED) + endloop(0x19) + + // Crash happened + label(0x03) + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE) + jog_to_pad(PAD_PETE_00C4) + set_ailist(CHR_SEALER2, AILIST_JOG_TO_ACCIDENT) + set_ailist(CHR_SEALER3, AILIST_JOG_TO_ACCIDENT) + set_ailist(CHR_SEALER4, AILIST_JOG_TO_ACCIDENT) + + beginloop(0x0d) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) + if_chr_stopped(/*goto*/ 0x04) + endloop(0x0d) + + // At crash site + label(0x04) + restart_timer + + beginloop(0x0c) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) + if_timer_gt(120, /*goto*/ 0x04) + endloop(0x0c) + + label(0x03) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + // Conversation + label(0x04) + assign_sound(SFX_814B, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + chr_do_animation(ANIM_TALKING_0098, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SELF, 2) + restart_timer + + beginloop(0x07) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + if_timer_gt(120, /*goto*/ 0x03) + endloop(0x07) + + label(0x03) + assign_sound(SFX_044F, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + chr_do_animation(ANIM_TALKING_0231, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SELF, 2) + + beginloop(0x08) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + if_sound_finished(CHANNEL_6, /*goto*/ 0x03) + goto_first(0x08) + + label(0x03) + assign_sound(SFX_0450, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + chr_do_animation(ANIM_TALKING_0233, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER3, 2) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) + restart_timer + + beginloop(0x09) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + if_timer_gt(180, /*goto*/ 0x03) + goto_first(0x09) + + label(0x03) + assign_sound(SFX_0451, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + chr_do_animation(ANIM_TALKING_0232, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER3, 2) + restart_timer + + beginloop(0x0a) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + if_timer_gt(120, /*goto*/ 0x03) + goto_first(0x0a) + + label(0x03) + assign_sound(SFX_0452, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + chr_do_animation(ANIM_TALKING_0234, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER3, 2) + chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) + + beginloop(0x0b) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) + if_saw_injury(0x00, /*goto*/ 0x04) + if_sound_finished(CHANNEL_6, /*goto*/ 0x04) + endloop(0x0b) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + // Alerted - seal elevator + label(LABEL_ALERTED) + label(0x04) + close_door(0x10) + close_door(0x11) + lock_door(0x10, 0x02) + lock_door(0x11, 0x02) + set_stage_flag(STAGEFLAG_ELEVATOR_SEALED) + assign_sound(SFX_0469, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + show_hudmsg(CHR_BOND, L_PETE_033) // "Elevator access sealed." + chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x06) + if_chr_stopped(/*goto*/ 0x04) + goto_first(0x06) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func100d_spawn_alarm_responders[] = { + restart_timer + beginloop(0x05) + if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, TRUE, /*goto*/ 0x03) + endloop(0x05) + + label(0x03) + restart_timer + play_sound(MP3_02F0, -1) // "Attention all personnel" + + beginloop(0x1d) + if_timer_gt(200, /*goto*/ 0x03) + endloop(0x1d) + + label(0x03) + restart_timer + play_sound(MP3_02F1, -1) // "Locate and apprehend fugitive" + + beginloop(0x1e) + if_timer_gt(120, /*goto*/ 0x03) + endloop(0x1e) + + label(0x03) + play_x_track(XREASON_DEFAULT, 10, 60) + goto_next(0x04) + + // When the alarm sounds, there are 4 groups of people who respond. + // Each group has 4 guards, and the entire group must be dead before the + // next group is spawned. There is a 15 second delay between groups. + // Each group spawns at a different location. + + #define spawn_group(pad) \ + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ + label(0x04) \ + yield \ + yield \ + yield \ + yield \ + yield \ + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ + label(0x04) \ + yield \ + yield \ + yield \ + yield \ + yield \ + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ + label(0x04) \ + yield \ + yield \ + yield \ + yield \ + yield \ + try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ + label(0x04) + + label(0x07) + unlock_door(0x14, 0x04) + restart_timer + if_stage_flag_eq(STAGEFLAG_ALARM_GROUP1_DEAD, TRUE, /*goto*/ 0x08) + + // Spawn group 1 + spawn_group(0x0067) + goto_next(0x06) + + // Group 1 is already done + label(0x08) + unlock_door(0x15, 0x04) + unlock_door(0x16, 0x04) + if_stage_flag_eq(STAGEFLAG_ALARM_GROUP2_DEAD, TRUE, /*goto*/ 0x09) + + // Spawn group 2 + spawn_group(0x00c2) + goto_next(0x06) + + // Groups 1 and 2 are done + label(0x09) + unlock_door(0x17, 0x04) + unlock_door(0x18, 0x04) + if_stage_flag_eq(STAGEFLAG_ALARM_GROUP3_DEAD, TRUE, /*goto*/ 0x0a) + + // Spawn group 3 + spawn_group(0x00c3) + goto_next(0x06) + + // Groups 1, 2 and 3 are done + // Spawn group 3 + label(0x0a) + unlock_door(0x19, 0x04) + spawn_group(0x00c1) + goto_next(0x06) + + // Wait until group is dead + beginloop(0x06) + if_all_chrs_in_squadron_are_dead(GROUP_ALARM_RESPONDER, /*goto*/ 0x04) + endloop(0x06) + + // Set this group as dead + label(0x04) + if_stage_flag_eq(STAGEFLAG_ALARM_GROUP1_DEAD, TRUE, /*goto*/ 0x04) + set_stage_flag(STAGEFLAG_ALARM_GROUP1_DEAD) + goto_next(0x03) + + label(0x04) + if_stage_flag_eq(STAGEFLAG_ALARM_GROUP2_DEAD, TRUE, /*goto*/ 0x04) + set_stage_flag(STAGEFLAG_ALARM_GROUP2_DEAD) + goto_next(0x03) + + label(0x04) + if_stage_flag_eq(STAGEFLAG_ALARM_GROUP3_DEAD, TRUE, /*goto*/ 0x04) + set_stage_flag(STAGEFLAG_ALARM_GROUP3_DEAD) + goto_next(0x03) + + label(0x04) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Wait 15 seconds + label(0x03) + restart_timer + + beginloop(0x2d) + if_timer_gt(900, /*goto*/ 0x04) + endloop(0x2d) + + // Loop again to trigger next group + label(0x04) + goto_first(0x07) + + endlist +}; + +u8 func041f_alarm_responder[] = { + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) + set_chr_dodge_rating(2, 10) + set_accuracy(14) + set_reaction_speed(20) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x00000000, /*goto*/ 0x04) + label(0x04) + set_chr_team(CHR_SELF, TEAM_20) + set_squadron(GROUP_ALARM_RESPONDER) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) + set_alertness(90) + set_self_chrflag(CHRCFLAG_00000200) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +u8 func0420_jog_to_accident[] = { + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE) + label(0x03) + go_to_target_pad(GOPOSFLAG_JOG) + + // This is a bit weird. I'm pretty sure the set_ailist causes this + // function to stop. But because the guard has been issued the + // go_to_target_pad command, he'll continue to do so while running the + // unalerted function. + label(0x0d) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + yield + if_chr_stopped(/*goto*/ 0x04) + goto_first(0x0d) + + label(0x04) + endlist +}; + +u8 func040a_intro_from_gameplay[] = { + set_ailist(CHR_SELF, 0x040a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_setup_robot_noise[] = { +#if VERSION >= VERSION_NTSC_1_0 + play_sound_from_object2(CHANNEL_2, CHR_ROBOT, SFX_80B9, 0x00, 0x02) +#else + play_sound(SFX_80B9, CHANNEL_2) + play_sound_from_object(CHANNEL_2, CHR_ROBOT, 0, 900, 1500) +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Not sure why it would give briefcases to the players. + * Note this is a coop/counterop only function. + */ +u8 func1400_give_briefcases[] = { + yield + set_chr_team(CHR_ANTI, TEAM_20) + set_chr_chrflag(CHR_TOPSTAIRS, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + set_chr_chrflag(CHR_TOPSTAIRS, CHRCFLAG_LOSEXTRAHEIGHT) + set_chr_chrflag(0x0a, CHRCFLAG_LOSEXTRAHEIGHT) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x03) + + // PA + give_object_to_chr(OBJ_BRIEFCASE3, CHR_BOND) + + // All difficulties + label(0x03) + give_object_to_chr(OBJ_BRIEFCASE4, CHR_BOND) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x03) + + if_difficulty_lt(DIFF_PA, /*goto*/ 0x04) + + // PA + give_object_to_chr(OBJ_BRIEFCASE5, CHR_COOP) + + // All difficulties + label(0x04) + give_object_to_chr(OBJ_BRIEFCASE6, CHR_COOP) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + + // Velvet doesn't exist + label(0x03) + disable_object(OBJ_BRIEFCASE3) + disable_object(OBJ_BRIEFCASE5) + disable_object(OBJ_BRIEFCASE6) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1002_rebuild_groups[] = { + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1010_elevator_switch[] = { + yield + open_door(0x10) + open_door(0x11) + yield + + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_SWITCH, /*goto*/ 0x03) + if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x04) + label(0x04) + endloop(0x10) + + label(0x03) + close_door(0x10) + close_door(0x11) + lock_door(0x10, 0x02) + lock_door(0x11, 0x02) + if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x04) + show_hudmsg(CHR_P1P2, L_PETE_033) // "Elevator access sealed." + set_stage_flag(STAGEFLAG_ELEVATOR_SEALED) + goto_first(0x10) + + label(0x04) + show_hudmsg(CHR_P1P2, L_PETE_048) // "Elevator door cannot be reopened." + goto_first(0x10) + + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_CIA1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_CIA2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_CIA3, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_CIA4, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1014_crash[] = { + beginloop(0x02) + if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x04) + endloop(0x02) + + label(0x04) + restart_timer + + beginloop(0x09) + if_timer_gt(230, /*goto*/ 0x04) + endloop(0x09) + + label(0x04) + move_object_to_pad(OBJ_MINE1, PAD_PETE_0029) + destroy_object(OBJ_MINE1) + set_stage_flag(STAGEFLAG_DIVERSION_CREATED) + show_hudmsg(CHR_BOND, L_PETE_054) // "Diversion has been created." + destroy_object(OBJ_TAXI) + restart_timer + + beginloop(0x0a) + if_timer_gt(180, /*goto*/ 0x04) + endloop(0x0a) + + label(0x04) + move_object_to_pad(OBJ_MINE2, PAD_PETE_001C) + destroy_object(OBJ_MINE2) + set_stage_flag(STAGEFLAG_CRASH_FINISHED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040a_intro_sfx[] = { + // This flag is used to trigger the intro. Note that the entire function + // loops, so Rare could have tested the intro by setting the flag again. + label(0x2b) + if_stage_flag_eq(STAGEFLAG_TRIGGER_INTRO, TRUE, /*goto*/ 0x2c) + yield + goto_first(0x2b) + + label(0x2c) + unset_stage_flag(STAGEFLAG_TRIGGER_INTRO) + label(0x10) + yield + label(0x03) + restart_timer + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) \ + if_timer_gt(time, /*goto*/ 0x04) \ + endloop(loopid) \ + label(0x04) + + wait_until(30, 0x55) + speak(CHR_BOND, L_PETE_068, MP3_0408, CHANNEL_7, COLOR_05_GREEN) // "We suspect the G5 Corporation is just a front for ..." + + wait_until(1060, 0x56) + speak(CHR_BOND, L_PETE_069, MP3_0409, CHANNEL_7, COLOR_09_BLUE) // "Just who is this help you keep referring to?" + + wait_until(1260, 0x57) + speak(CHR_BOND, L_PETE_070, MP3_040A, CHANNEL_7, COLOR_05_GREEN) // "Not now, Joanna. Time for radio silence. Good luck..." + + wait_until(1488, 0x58) + speak(CHR_BOND, L_PETE_071, MP3_040B, CHANNEL_7, COLOR_09_BLUE) // "Thanks a lot." + + label(0x2d) + yield + label(0x03) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) + if_timer_gt(1468, /*goto*/ 0x04) + goto_first(0x2d) + + label(0x04) + play_sound(SFX_0161, CHANNEL_3) + + wait_until(1519, 0x2f) + play_sound(SFX_0162, CHANNEL_3) + + wait_until(1566, 0x30) + play_sound(SFX_046D, CHANNEL_4) + + wait_until(1649, 0x31) + play_sound(SFX_046D, CHANNEL_3) + + label(0x33) + wait_until(1758, 0x34) + play_sound(SFX_0164, CHANNEL_4) + + wait_until(1784, 0x35) + play_sound(SFX_0163, CHANNEL_3) + + wait_until(1814, 0x36) + play_sound(SFX_0162, CHANNEL_3) + + wait_until(1855, 0x37) + play_sound(SFX_0161, CHANNEL_3) + + wait_until(1897, 0x38) + play_sound(SFX_0470, CHANNEL_3) + + wait_until(2017, 0x3a) + play_sound(SFX_0165, CHANNEL_3) + + wait_until(2028, 0x3b) + play_sound(SFX_046E, CHANNEL_4) + + wait_until(2050, 0x3c) + play_sound(SFX_0472, CHANNEL_3) + + wait_until(2175, 0x3d) + play_sound(SFX_0473, CHANNEL_4) + + wait_until(2239, 0x3e) + play_sound(SFX_0474, CHANNEL_3) + + wait_until(2269, 0x3f) + play_sound(SFX_0475, CHANNEL_4) + + wait_until(2278, 0x41) + play_sound(SFX_0166, CHANNEL_3) + + wait_until(2280, 0x40) + play_sound(SFX_JO_LANDING_046F, CHANNEL_4) + + wait_until(2323, 0x42) + play_sound(SFX_0165, CHANNEL_3) + + wait_until(2339, 0x43) + play_sound(SFX_0166, CHANNEL_3) + + wait_until(2356, 0x44) + play_sound(SFX_0167, CHANNEL_3) + + wait_until(2373, 0x45) + play_sound(SFX_0168, CHANNEL_3) + + wait_until(2386, 0x46) + play_sound(SFX_0165, CHANNEL_3) + + wait_until(2388, 0x47) + + wait_until(2402, 0x48) + mute_channel(CHANNEL_4) + play_sound(SFX_0166, CHANNEL_3) + + wait_until(2404, 0x4a) + play_sound(SFX_0080, CHANNEL_4) + + wait_until(2424, 0x49) + play_sound(SFX_0167, CHANNEL_3) + + wait_until(2434, 0x4c) + play_sound(SFX_0476, CHANNEL_3) + + wait_until(2584, 0x4b) + play_sound(SFX_0161, CHANNEL_5) + + wait_until(2622, 0x4d) + mute_channel(CHANNEL_5) + + play_sound(SFX_0162, CHANNEL_4) + wait_until(2660, 0x4e) + mute_channel(CHANNEL_5) + + play_sound(SFX_0163, CHANNEL_6) + + label(0x2e) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_7) + goto_first(0x2b) + + endlist +}; + +u8 func040b_outro[] = { + camera_movement(ANIM_CUT_PETE_OUTRO_CAM) + play_cutscene_track(MUSIC_CHICAGO_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + set_door_open(0x10) + set_door_open(0x11) + disable_object(OBJ_TAXI) + disable_object(OBJ_LIMO) +#if VERSION >= VERSION_NTSC_1_0 + disable_chr(CHR_SEALER1) + disable_chr(CHR_SEALER2) + disable_chr(CHR_SEALER3) + disable_chr(CHR_SEALER4) +#endif + + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) +#if VERSION >= VERSION_NTSC_1_0 + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) +#endif + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_PETE_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + restart_timer + set_cutscene_weapon(CHR_P1P2, -1, -1) + yield + set_cutscene_weapon(CHR_P1P2, -1, 0x02) + show_nonessential_chrs(FALSE) + + #define func0c01_wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x2e) \ + if_timer_gt(time, /*goto*/ 0x04) \ + endloop(loopid) \ + label(0x04) + + func0c01_wait_until(30, 0x2d) + play_sound(SFX_0161, CHANNEL_7) + + func0c01_wait_until(70, 0x2f) + play_sound(SFX_0162, CHANNEL_7) + + func0c01_wait_until(120, 0x30) + play_sound(SFX_0163, CHANNEL_7) + + func0c01_wait_until(174, 0x31) + play_sound(SFX_0164, CHANNEL_7) + + func0c01_wait_until(208, 0x32) + play_sound(SFX_046D, CHANNEL_6) + + func0c01_wait_until(210, 0x33) + play_sound(SFX_0161, CHANNEL_7) + + func0c01_wait_until(238, 0x34) + play_sound(SFX_0162, CHANNEL_7) + + func0c01_wait_until(280, 0x35) + play_sound(SFX_0171, CHANNEL_7) + + func0c01_wait_until(350, 0x36) + play_sound(SFX_0173, CHANNEL_7) + + func0c01_wait_until(458, 0x37) + play_sound(SFX_0172, CHANNEL_7) + + func0c01_wait_until(506, 0x38) + play_sound(SFX_0171, CHANNEL_7) + + func0c01_wait_until(540, 0x39) + close_door(0x10) + close_door(0x11) + + func0c01_wait_until(545, 0x3a) + play_sound(SFX_0171, CHANNEL_7) + + func0c01_wait_until(588, 0x3b) + play_sound(SFX_0172, CHANNEL_7) + + beginloop(0x05) + if_camera_animating(/*goto*/ 0x03) + goto_next(0x2e) + label(0x03) + if_controller_button_pressed(/*goto*/ 0x2e) + label(0x03) + endloop(0x05) + + label(0x2e) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_10) + label(0x04) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_update_robot_prop_flags[] = { + // pad 0x00d4 = corner + // pad 0x00d9 = next to limo + + beginloop(0x02) + // Update ROBOT_NEAR_CORNER flag + if_stage_flag_eq(STAGEFLAG_ROBOT_NEAR_HOME, FALSE, /*goto*/ 0x03) + if_chr_distance_to_pad_lt(CHR_ROBOT, 200, PAD_PETE_00D4, /*goto*/ 0x04) + label(0x03) + unset_stage_flag(STAGEFLAG_ROBOT_NEAR_CORNER) + goto_next(0x03) + + label(0x04) + set_stage_flag(STAGEFLAG_ROBOT_NEAR_CORNER) + + // Update ROBOT_ON_DRAIN_STREET flag + label(0x03) + if_chr_distance_to_pad_gt(CHR_ROBOT, 1800, PAD_PETE_00D9, /*goto*/ 0x04) + unset_stage_flag(STAGEFLAG_ROBOT_ON_DRAIN_STREET) + goto_next(0x03) + + label(0x04) + set_stage_flag(STAGEFLAG_ROBOT_ON_DRAIN_STREET) + label(0x03) + endloop(0x02) + + endlist +}; + +u8 func1416_setup_rain[] = { + yield + yield + yield + enable_rain(2) + + label(0x05) + // Wait 1 second + restart_timer + + beginloop(0x06) + if_timer_gt(60, /*goto*/ 0x03) + endloop(0x06) + + // 12 in 256 chance of changing rain effect + label(0x03) + call_rng + if_rand_lt(12, /*goto*/ 0x03) + goto_first(0x05) + + label(0x03) + call_rng + if_rand_gt(192, /*goto*/ 0x0a) + if_rand_gt(128, /*goto*/ 0x09) + if_rand_gt(64, /*goto*/ 0x08) + enable_rain(2) + goto_first(0x05) + + label(0x08) + enable_rain(1) + goto_first(0x05) + + label(0x09) + enable_rain(2) + goto_first(0x05) + + label(0x0a) + enable_rain(3) + goto_first(0x05) + + endlist +}; + +u8 func041c_hiddenguy[] = { + set_chr_chrflag(CHR_HIDDENGUY, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_HIDDENGUY, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This function makes two guards unhide and persue Jo after she picks up the + * drain briefcase. + */ +u8 func1017_drain_guards[] = { + set_chr_chrflag(0x11, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x12, CHRCFLAG_HIDDEN) + + // Wait until drain briefcase collected + beginloop(0x05) + if_objective_complete(0, /*goto*/ 0x03) + endloop(0x05) + + label(0x03) + unset_chr_chrflag(0x11, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x12, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x11, CHRHFLAG_00400000) + set_chr_hiddenflag(0x12, CHRHFLAG_00400000) + set_ailist(0x11, GAILIST_ALERTED) + set_ailist(0x12, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_keep_door_open[] = { + beginloop(0x10) + if_door_state(0x1a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x03) + reloop(0x10) + + label(0x03) + open_door(0x1a) + endloop(0x10) + + endlist +}; + +u8 func1019_setup_topstairs_death_animation[] = { + set_chr_special_death_animation(CHR_TOPSTAIRS, SPECIALDIE_OVERRAILING) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040e_6064[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(4) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040f_6088[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) + set_chr_dodge_rating(2, 10) + set_accuracy(20) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + label(0x03) + set_chr_dodge_rating(2, 10) + set_accuracy(4) + set_reaction_speed(30) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0410_60d0[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(14) + set_reaction_speed(20) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0411_60f4[] = { + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_chr_dodge_rating(2, 10) + set_accuracy(14) + set_reaction_speed(20) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(40) + set_shield(0) + set_ailist(CHR_SELF, AILIST_FBI) + endlist +}; + +u8 func101a_msg_onlyplace[] = { + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0014, /*goto*/ 0x03) + if_chr_in_room(CHR_P1P2, 0x00, 0x0026, /*goto*/ 0x03) + endloop(0x10) + + label(0x03) + speak(CHR_P1P2, L_PETE_060, SFX_8179, CHANNEL_6, COLOR_09_BLUE) // "The only place we could secure the equipment was a..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101b_msg_blockedupdoors[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) + restart_timer + + // Wait for drain briefcase collected + beginloop(0x10) + if_objective_complete(0, /*goto*/ 0x05) + endloop(0x10) + + beginloop(0x05) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x003a, /*goto*/ 0x03) + endloop(0x05) + + label(0x03) + speak(CHR_P1P2, L_PETE_061, MP3_03B1, CHANNEL_6, COLOR_09_BLUE) // "Either of those blocked-up doors will do as an esc..." + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_msg_reprogramthattaxi[] = { + // Wait for drain briefcase collected + beginloop(0x10) + if_objective_complete(0, /*goto*/ 0x05) + endloop(0x10) + + beginloop(0x05) +#if VERSION >= VERSION_NTSC_1_0 + if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) + reloop(0x05) + + label(0x03) +#endif + if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, TRUE, /*goto*/ 0x0a) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x004a, /*goto*/ 0x03) + endloop(0x05) + + label(0x03) + speak(CHR_P1P2, L_PETE_062, SFX_817A, CHANNEL_6, COLOR_09_BLUE) // "Reprogram that taxi - it's a Mark 2 and should be ..." + label(0x0a) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_msg_pointofingress[] = { + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0059, /*goto*/ 0x03) + endloop(0x10) + + label(0x03) + speak(CHR_P1P2, L_PETE_063, SFX_817B, CHANNEL_6, COLOR_09_BLUE) // "That car park lift is your only point of ingress." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_check_sealer_guards_dead[] = { + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x06) + if_chr_dead(CHR_SEALER1, /*goto*/ 0x03) + if_chr_death_animation_finished(CHR_SEALER1, /*goto*/ 0x03) + endloop(0x10) + + label(0x03) + if_chr_dead(CHR_SEALER2, /*goto*/ 0x03) + if_chr_death_animation_finished(CHR_SEALER2, /*goto*/ 0x03) + goto_first(0x10) + + label(0x03) + if_chr_dead(CHR_SEALER3, /*goto*/ 0x03) + if_chr_death_animation_finished(CHR_SEALER3, /*goto*/ 0x03) + goto_first(0x10) + + label(0x03) + if_chr_dead(CHR_SEALER4, /*goto*/ 0x03) + if_chr_death_animation_finished(CHR_SEALER4, /*goto*/ 0x03) + goto_first(0x10) + + label(0x03) + if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) + show_hudmsg(CHR_BOND, L_PETE_066) // "An alternative diversion has been created!" +#if VERSION >= VERSION_NTSC_1_0 + unset_stage_flag(STAGEFLAG_TAXI_DESTROYED) + unset_stage_flag(STAGEFLAG_ROBOT_DESTROYED) +#endif + set_stage_flag(STAGEFLAG_DIVERSION_CREATED) + label(0x03) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_elevator_doors[] = { + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x03) + if_door_state(0x10, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x04) + reloop(0x10) + + label(0x04) + open_door(0x10) + open_door(0x11) + endloop(0x10) + + label(0x03) + close_door(0x10) + close_door(0x11) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Guard at top stairs: Turn off special death animation if he's moved away from + * his pad or if Jo has climbed the staircase. + */ +u8 func1021_check_topstairs_guy[] = { + beginloop(0x10) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 500, OPERATOR_LESS_THAN, /*goto*/ 0x03) + goto_next(0x04) + label(0x03) + if_chr_distance_to_pad_gt(CHR_TOPSTAIRS, 250, PAD_PETE_00B5, /*goto*/ 0x04) + endloop(0x10) + + label(0x04) + set_chr_special_death_animation(CHR_TOPSTAIRS, SPECIALDIE_NONE) + unset_chr_chrflag(CHR_TOPSTAIRS, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) + unset_chr_flag_bankx(CHR_TOPSTAIRS, CHRFLAG1_NOHANDCOMBAT, BANK_1) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_limo_flags[] = { + // Wait until limo ready + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ 0x2f) + endloop(0x10) + + // Wait until player not in certain rooms + beginloop(0x2f) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0002, /*goto*/ 0x03) + if_chr_in_room(CHR_P1P2, 0x00, 0x0010, /*goto*/ 0x03) + if_chr_in_room(CHR_P1P2, 0x00, 0x0012, /*goto*/ 0x03) + goto_next(0x04) + label(0x03) + endloop(0x2f) + + // Wait almost 10 seconds - provided limo not destroyed + label(0x04) + restart_timer + + beginloop(0x2d) + if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x03) + if_timer_gt(596, /*goto*/ 0x03) + endloop(0x2d) + + label(0x03) + disable_object(OBJ_LIMO) + set_object_flag(OBJ_LIMO, OBJFLAG_INVINCIBLE) + set_object_flag2(OBJ_LIMO, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1423_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0050, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0051, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0052, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0060, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0061, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0062, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_cia_invincibility[] = { + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_TRIGGER_TAXI_LEAVE, TRUE, /*goto*/ 0x03) + endloop(0x10) + + label(0x03) + set_chr_chrflag(CHR_CIA1, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CIA2, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CIA3, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_CIA4, CHRCFLAG_INVINCIBLE) + + beginloop(0x2d) + if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) + endloop(0x2d) + + label(0x03) + restart_timer + + beginloop(0x2f) + if_timer_gt(300, /*goto*/ 0x03) + endloop(0x2f) + + label(0x03) + unset_chr_chrflag(CHR_CIA1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_CIA2, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_CIA3, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_CIA4, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1025_rtracker[] = { + yield + set_object_flag3(OBJ_FALCON2, OBJFLAG3_RTRACKED_BLUE) +#if VERSION < VERSION_NTSC_1_0 + set_object_flag3(0x23, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(0x24, OBJFLAG3_RTRACKED_BLUE) +#endif + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#if VERSION >= VERSION_NTSC_1_0 +u8 func1027_untrack_dumpster[] = { + yield + + beginloop(0x10) + if_object_in_good_condition(OBJ_DUMPSTER, /*goto*/ 0x04) + goto_next(0x03) + label(0x04) + endloop(0x10) + + label(0x03) + unset_object_flag3(OBJ_DUMPSTER, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; +#endif + +struct ailist ailists[] = { + { func0401_3ae8, 0x0401 }, + { func0402_3bb4, 0x0402 }, + { func0403_3c74, 0x0403 }, + { func0404_3ce0, 0x0404 }, + { func0405_3d50, 0x0405 }, + { func0406_3e54, 0x0406 }, + { func0407_3e60, 0x0407 }, + { func0408_3e6c, 0x0408 }, + { func0409_3e78, 0x0409 }, + { func040a_intro, 0x040a }, + { func040b_outro, 0x040b }, + { func040c_taxi, 0x040c }, + { func040d_limo, 0x040d }, + { func040e_6064, 0x040e }, + { func040f_6088, 0x040f }, + { func0410_60d0, 0x0410 }, + { func0411_60f4, 0x0411 }, + { func0412_cia, 0x0412 }, + { func0413_bugspotter, 0x0413 }, + { func0414_start_path07, 0x0414 }, + { func0415_start_path08, 0x0415 }, + { func0416_start_path09, 0x0416 }, + { func0417_start_path10, 0x0417 }, + { func0418_start_path11, 0x0418 }, + { func0419_init_cia1, 0x0419 }, + { func041d_fbi, 0x041d }, + { func041c_hiddenguy, 0x041c }, + { func041e_sealer1, 0x041e }, + { func041f_alarm_responder, 0x041f }, + { func0420_jog_to_accident, 0x0420 }, + { func041a_robot, 0x041a }, + { func041b_init_robot, 0x041b }, + { func040a_intro, 0x0c00 }, + { func040b_outro, 0x0c01 }, + { func1400_give_briefcases, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_rebuild_groups, 0x1002 }, + { func040a_intro_from_gameplay, 0x1003 }, + { func1004_tracerbug_bond, 0x1004 }, + { func1005_check_things_destroyed, 0x1005 }, + { func1006_check_for_end, 0x1006 }, + { func040d_limo_timing, 0x1007 }, + { func040c_taxi_timing, 0x1008 }, + { func1009_check_cia1_dead, 0x1009 }, + { func100a_check_cia2_dead, 0x100a }, + { func100b_check_cia3_dead, 0x100b }, + { func100c_check_cia4_dead, 0x100c }, + { func100d_spawn_alarm_responders, 0x100d }, + { func100f_check_mine, 0x100f }, + { func1010_elevator_switch, 0x1010 }, + { func1011_trackerbug_coop, 0x1011 }, + { func1012_update_robot_prop_flags, 0x1012 }, + { func1014_crash, 0x1014 }, + { func040a_intro_sfx, 0x1415 }, + { func1416_setup_rain, 0x1416 }, + { func1017_drain_guards, 0x1017 }, + { func1018_keep_door_open, 0x1018 }, + { func1019_setup_topstairs_death_animation, 0x1019 }, + { func101a_msg_onlyplace, 0x101a }, + { func101b_msg_blockedupdoors, 0x101b }, + { func101c_msg_reprogramthattaxi, 0x101c }, + { func101d_msg_pointofingress, 0x101d }, + { func101e_check_sealer_guards_dead, 0x101e }, + { func101f_setup_robot_noise, 0x101f }, + { func1020_elevator_doors, 0x1020 }, + { func1021_check_topstairs_guy, 0x1021 }, + { func040d_limo_flags, 0x1022 }, + { func1423_setup_environment, 0x1423 }, + { func0412_cia_invincibility, 0x1024 }, + { func1025_rtracker, 0x1025 }, + { func1026_uplink, 0x1026 }, +#if VERSION >= VERSION_NTSC_1_0 + { func1027_untrack_dumpster, 0x1027 }, +#endif + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, + { path10, 10, 0 }, + { path11, 11, 0 }, + { path12, 12, 0 }, + { path13, 13, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupref.c b/src/ailists/setupref.c new file mode 100644 index 000000000..9b81b8e73 --- /dev/null +++ b/src/ailists/setupref.c @@ -0,0 +1,41 @@ +// +// Complex (MP) +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_PP9I, -1) + ammo(AMMOTYPE_PISTOL, 100) + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setuprit.c b/src/ailists/setuprit.c new file mode 100644 index 000000000..874f7f022 --- /dev/null +++ b/src/ailists/setuprit.c @@ -0,0 +1,4142 @@ +// +// Air Force One +// + +#include "stagesetup.h" + +// Characters +#define CHR_ELVIS 0x00 +#define CHR_PRESIDENT 0x18 +#define CHR_PILOT1 0x19 +#define CHR_PILOT2 0x1a +#define CHR_STEWARDESS 0x1b +#define CHR_STEWARD 0x1c +#define CHR_TAKER1 0x2a +#define CHR_TAKER2 0x2b +#define CHR_TRENT 0x32 +#define CHR_BLONDE1 0x33 +#define CHR_BLONDE2 0x34 + +// Objects +#define OBJ_EQUIPMENT 0x00 +#define OBJ_DATAUPLINK_BOND 0x01 +#define OBJ_COMMSHUB1 0x02 +#define OBJ_AUTOPILOT_SWITCH 0x03 +#define OBJ_REMOTEMINE_BOND 0x04 +#define OBJ_DUMBWAITER1 0x05 +#define OBJ_DUMBWAITER2 0x06 +#define OBJ_DUMBWAITER1_SWITCH 0x07 +#define OBJ_DUMBWAITER2_SWITCH 0x08 +#define OBJ_FLOORHATCH 0x0b +#define OBJ_COCKPITDOOR 0x0e +#define OBJ_DATAUPLINK_COOP 0x16 +#define OBJ_REMOTEMINE_COOP 0x17 +#define OBJ_EQUIPMENT_SWITCH 0x1e +#define OBJ_HOVERBIKE_SWITCH 0x21 +#define OBJ_KEYCARD 0x22 +#define OBJ_ESCAPE_POD 0x24 +#define OBJ_EXTERIOR_DOOR 0x25 +#define OBJ_EXTERIOR_DOOR_DETACHED 0x26 +#define OBJ_COMMSHUB2 0x27 +#define OBJ_COMMSHUB3 0x28 +#define OBJ_COMMSHUB4 0x29 +#define OBJ_COMMSHUB5 0x2a +#define OBJ_FLOOR_HATCH_DETACHED 0x2e +#define OBJ_EQUIPMENT_COOP 0x3a + +// Stage flags +#define STAGEFLAG_POD_DESTROYED 0x00000004 +#define STAGEFLAG_ALL_OBJECTIVES_COMPLETE 0x00000008 +#define STAGEFLAG_PLANE_NOSEDIVING 0x00000010 +#define STAGEFLAG_BOND_MINE_WASTED 0x00000020 +#define STAGEFLAG_COOP_MINE_WASTED 0x00000040 +#define STAGEFLAG_AI_BUDDY_EXISTS 0x00000080 +#define STAGEFLAG_PRESIDENT_STARTED_RUNNING 0x00000100 +#define STAGEFLAG_PRESIDENT_AT_POD 0x00000200 +#define STAGEFLAG_UFO_ATTACHMENT_DAMAGED 0x00000800 +#define STAGEFLAG_KILLED_NEUTRALS 0x00001000 +#define STAGEFLAG_PILOTS_DEAD 0x00002000 +#define STAGEFLAG_PLANE_STABILIZED 0x00004000 +#define STAGEFLAG_AUTOPILOT_DESTROYED 0x00008000 +#define STAGEFLAG_PRESIDENT_DEAD 0x00010000 +#define STAGEFLAG_BOTH_BLONDES_DEAD 0x00020000 +#define STAGEFLAG_ONE_BLONDE_DEAD 0x00040000 +#define STAGEFLAG_PRESIDENT_CALLED_SECURITY 0x00080000 +#define STAGEFLAG_00100000 0x00100000 +#define STAGEFLAG_INTRO_FINISHED 0x00200000 +#define STAGEFLAG_TRIGGER_MIDCUTSCENE 0x00400000 +#define STAGEFLAG_MIDCUTSCENE_FINISHED 0x00800000 +#define STAGEFLAG_EQUIPMENT_RAISED 0x01000000 +#define STAGEFLAG_EQUIPMENT_SWITCH_DESTROYED 0x02000000 +#define STAGEFLAG_BOTH_MINES_WASTED 0x04000000 +#define STAGEFLAG_PRESIDENT_INJURED 0x08000000 +#define STAGEFLAG_PLANE_CRASHED 0x10000000 +#define STAGEFLAG_MIDCUTSCENE_STARTED 0x20000000 + +// AI Lists +#define AILIST_INIT_STRIPES 0x0401 +#define AILIST_INIT_ELVIS 0x0402 +#define AILIST_STRIPES 0x0403 +#define AILIST_PRESIDENT_RUNNING 0x0404 +#define AILIST_PRESIDENT_IN_ROOM 0x0405 +#define AILIST_INIT_PRESIDENT 0x0406 +#define AILIST_STEWARD 0x0407 +#define AILIST_STEWARDESS 0x0408 +#define AILIST_DEFEND_PAD 0x040a +#define AILIST_DEFEND_PRESIDENT 0x040b +#define AILIST_INIT_DEFEND_PAD 0x040c +#define AILIST_TAKER1 0x040f +#define AILIST_TAKER2 0x0410 +#define AILIST_TYPING_GUY 0x0411 +#define AILIST_SITTING_GUY 0x0412 +#define AILIST_TAKER 0x0413 +#define AILIST_COCKPIT_STRIPES 0x0414 +#define AILIST_CLONER1 0x0415 +#define AILIST_INIT_CLONE1 0x0416 +#define AILIST_CLONE1 0x0417 +#define AILIST_CLONER2 0x0418 +#define AILIST_INIT_CLONE2 0x0419 +#define AILIST_CLONE2 0x041a +#define AILIST_CLONER3 0x041b +#define AILIST_INIT_CLONE3 0x041c +#define AILIST_CLONE3 0x041d +#define AILIST_BLONDE 0x041e +#define AILIST_INIT_BLONDE 0x041f +#define AILIST_TRENT_ATTACKING 0x0420 +#define AILIST_TRENT_WAITING 0x0421 +#define AILIST_TRENT_RUNNING 0x0422 +#define AILIST_OUTRO 0x0423 +#define AILIST_MIDCUTSCENE 0x0424 +#define AILIST_STEWARD_SHOT 0x0425 +#define AILIST_BE_UNALERT 0x0429 +#define AILIST_INIT_NEUTRAL 0x042a +#define AILIST_REINIT_STRIPES 0x042b +#define AILIST_REMOVE_IF_OFFSCREEN 0x042c + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_RIT_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_RIT_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_RIT_002) + briefing(BRIEFINGTYPE_TEXT_A, L_RIT_003) + + beginobjective(0, L_RIT_005, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate and retrieve equipment" + require_object_collected(OBJ_EQUIPMENT) + fail_flags(STAGEFLAG_EQUIPMENT_SWITCH_DESTROYED) + endobjective + + beginobjective(1, L_RIT_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate President" + complete_flags(STAGEFLAG_PRESIDENT_STARTED_RUNNING) + fail_flags(STAGEFLAG_PRESIDENT_CALLED_SECURITY) + endobjective + + beginobjective(2, L_RIT_007, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Get President to escape capsule" + complete_flags(STAGEFLAG_PRESIDENT_AT_POD) + fail_flags(STAGEFLAG_PRESIDENT_DEAD) + fail_flags(STAGEFLAG_KILLED_NEUTRALS) + fail_flags(STAGEFLAG_POD_DESTROYED) + endobjective + + beginobjective(3, L_RIT_008, (DIFFBIT_PA | DIFFBIT_PD)) // "Secure Air Force One flight path" + complete_flags(STAGEFLAG_PLANE_STABILIZED) + fail_flags(STAGEFLAG_AUTOPILOT_DESTROYED) + endobjective + + beginobjective(4, L_RIT_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Detach UFO from Air Force One" + complete_flags(STAGEFLAG_UFO_ATTACHMENT_DAMAGED) + fail_flags(STAGEFLAG_BOTH_MINES_WASTED) + fail_flags(STAGEFLAG_PLANE_CRASHED) + endobjective + + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x32, PAD_RIT_00BE, BODY_TRENT, HEAD_TRENT, GAILIST_IDLE, -1, -1, 200, 8, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_NONCOMBAT, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357TRENT, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357LX) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x33, PAD_RIT_00BC, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_NONCOMBAT, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x34, PAD_RIT_00BD, BODY_MRBLONDE, HEAD_MRBLONDE, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_NONCOMBAT, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x01, PAD_RIT_008B, BODY_OVERALL, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x008b, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x1b, PAD_RIT_008C, BODY_STEWARDESS, HEAD_RANDOM, AILIST_STEWARDESS, 0x00b2, -1, 2000, 5, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x1c, PAD_RIT_00C1, BODY_STEWARD, HEAD_RANDOM, AILIST_STEWARD, 0x001f, -1, 2000, 5, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 1, 0, 0) +#else + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x01, PAD_RIT_008B, BODY_OVERALL, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x008b, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x1b, PAD_RIT_008C, BODY_STEWARDESS, HEAD_RANDOM, AILIST_STEWARDESS, -1, -1, 2000, 5, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 1, 0, 0) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x1c, PAD_RIT_00C1, BODY_STEWARD, HEAD_RANDOM, AILIST_STEWARD, -1, -1, 2000, 5, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 1, 0, 0) +#endif + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x04, PAD_RIT_008E, BODY_OVERALL, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x008e, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x05, PAD_RIT_008F, BODY_OVERALL, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x008f, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_HANDCOMBATONLY | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x06, PAD_RIT_0090, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0090, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x07, PAD_RIT_0091, BODY_PRES_SECURITY, HEAD_RANDOM, 0x0426, 0x0091, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x08, PAD_RIT_0092, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0092, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x09, PAD_RIT_0093, BODY_PRES_SECURITY, HEAD_RANDOM, GAILIST_IDLE, 0x0093, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0a, PAD_RIT_0094, BODY_PRES_SECURITY, HEAD_RANDOM, GAILIST_IDLE, 0x0094, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0b, PAD_RIT_0095, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0002, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0c, PAD_RIT_0096, BODY_PRES_SECURITY, HEAD_RANDOM, GAILIST_IDLE, 0x0002, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0d, PAD_RIT_0097, BODY_PRES_SECURITY, HEAD_RANDOM, GAILIST_IDLE, 0x0097, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x0e, PAD_RIT_0098, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0003, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x0f, PAD_RIT_0099, BODY_PRES_SECURITY, HEAD_RANDOM, 0x0427, 0x0002, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0e, PAD_RIT_0098, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0003, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x0f, PAD_RIT_0099, BODY_PRES_SECURITY, HEAD_RANDOM, 0x0427, 0x0002, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) +#endif + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x10, PAD_RIT_009A, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x009a, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x11, PAD_RIT_009B, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0004, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x18, PAD_RIT_00A0, BODY_PRESIDENT, HEAD_PRESIDENT, GAILIST_IDLE, 0x00a0, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x12, PAD_RIT_009C, BODY_PRES_SECURITY, HEAD_RANDOM, 0x0428, 0x0003, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x13, PAD_RIT_009D, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0002, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x14, PAD_RIT_009E, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x0020, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200 | SPAWNFLAG_ANTINONINTERACTABLE, 0x15, PAD_RIT_009F, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_INIT_NEUTRAL, 0x00bb, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) +#if VERSION >= VERSION_NTSC_1_0 + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x16, PAD_RIT_00CA, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_TYPING_GUY, 0x00b2, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, 0x11, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x17, PAD_RIT_00C9, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_SITTING_GUY, 0x001f, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, 0x10, 0, 0, 0, 0, 0) +#else + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x16, PAD_RIT_00CA, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_TYPING_GUY, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, 0x10, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT, 0x17, PAD_RIT_00C9, BODY_PRES_SECURITY, HEAD_RANDOM, AILIST_SITTING_GUY, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0A, 0x11, 0, 0, 0, 0, 0) +#endif + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x19, PAD_RIT_00C7, BODY_PILOTAF1, HEAD_ROSS, AILIST_TYPING_GUY, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, 0x12, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FORCESUNGLASSES | SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_FIXEDHEIGHT | SPAWNFLAG_BLUESIGHT, 0x1a, PAD_RIT_00C8, BODY_PILOTAF1, HEAD_WONG, AILIST_SITTING_GUY, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0B, 0x13, 0, 0, 0, 0, 0) + chr(0, 0x1d, PAD_RIT_00A5, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x1e, PAD_RIT_00A6, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x1f, PAD_RIT_00A7, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x20, PAD_RIT_00A8, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x21, PAD_RIT_00A9, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x22, PAD_RIT_00AA, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x24, PAD_RIT_00AC, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x25, PAD_RIT_00AD, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x26, PAD_RIT_0006, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x27, PAD_RIT_0089, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x28, PAD_RIT_000D, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x29, PAD_RIT_00AE, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x2a, PAD_RIT_00AF, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x2b, PAD_RIT_00B0, BODY_STRIPES, HEAD_RANDOM, AILIST_INIT_STRIPES, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x30, PAD_RIT_006A, BODY_STRIPES, HEAD_RANDOM, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAVENGER, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_K7AVENGER) + chr(0, 0x31, PAD_RIT_0069, BODY_TRENT, HEAD_TRENT, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + chr(0, 0x00, PAD_RIT_008A, BODY_THEKING, HEAD_ELVIS, AILIST_INIT_ELVIS, -1, -1, 200, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR, CHRFLAG1_PREWARNED | CHRFLAG1_PUNCHAIEXTRADAMAGE | CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + chr(0, 0x35, PAD_RIT_0088, BODY_STRIPES, HEAD_RANDOM, AILIST_CLONER1, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_NOIDLEANIMS | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(0, 0x36, PAD_RIT_00B5, BODY_STRIPES, HEAD_RANDOM, AILIST_CLONER2, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_NOIDLEANIMS | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + chr(0, 0x37, PAD_RIT_00B6, BODY_STRIPES, HEAD_RANDOM, AILIST_CLONER3, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_NOIDLEANIMS | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + tag(0x1b, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_RIT_010B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_80000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x010b, 0x010a, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x15000000) + tag(0x1f, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_RIT_0110, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0110, 0x0111, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x15000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00D9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00DA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00DB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00DC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_AF1_DOORBIG2, PAD_RIT_00DD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AF1_DOORBIG2, PAD_RIT_00DE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00DF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_AF1_DOORBIG2, PAD_RIT_0100, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AF1_DOORBIG2, PAD_RIT_0101, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_AF1_DOORBIG2, PAD_RIT_0102, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x0000012c, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_AF1_DOORBIG2, PAD_RIT_0103, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) + key(0x0080, MODEL_KEYCARD, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 4) + rename_object(-1, WEAPON_KEYCARD49, L_RIT_055, L_RIT_056, L_RIT_057, L_RIT_058, L_RIT_059) // "" + key(0x0080, MODEL_KEYCARD, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 32) + rename_object(-1, WEAPON_KEYCARD49, L_RIT_055, L_RIT_056, L_RIT_057, L_RIT_058, L_RIT_059) // "" + tag(0x22, 1) + key(0x0080, MODEL_KEYCARD, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 0) + rename_object(-1, WEAPON_KEYCARD49, L_RIT_055, L_RIT_056, L_RIT_057, L_RIT_058, L_RIT_059) // "" + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00FA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00FB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00FC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00FD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x0c, 1) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x0e, 1) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000040, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00E9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x15, 1) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00EA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00EB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00EC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00ED, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00EE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00EF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00FE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x25, 1) + door(0x0100, MODEL_AF1ESCAPEDOOR, PAD_RIT_0105, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x26, 1) + door(0x0100, MODEL_AF1ESCAPEDOOR, PAD_RIT_0106, OBJFLAG_00000010 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_INVISIBLE, 0, 1000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800) + tag(0x20, 1) + door(0x0100, MODEL_DD_GRATE, PAD_RIT_00F1, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x0000ffff, 0x00014000, 0x00000ccc, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x0b, 1) + door(0x0100, MODEL_DD_GRATE, PAD_RIT_00F2, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_80000000, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x2e, 1) + stdobject(0x0100, MODEL_DD_GRATE, PAD_RIT_0108, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_INVINCIBLE, OBJFLAG2_INVISIBLE, 0, 1000) + door(0x0100, MODEL_DD_GRATE, PAD_RIT_0109, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + stdobject(0x00e6, MODEL_A51_CRATE2, PAD_RIT_011B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00a6, MODEL_A51_CRATE2, PAD_RIT_011C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_RIT_011E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x01, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, PAD_RIT_003F, OBJFLAG_00000001, 0, 0, WEAPON_LAPTOPGUN) + tag(0x16, 1) + weapon(0x0180, MODEL_CHRDATATHIEF, -1, OBJFLAG_00000001, 0, 0, WEAPON_LAPTOPGUN) + tag(0x04, 1) + weapon(0x0180, MODEL_CHRREMOTEMINE, PAD_RIT_003F, OBJFLAG_00000001, 0, 0, WEAPON_TIMEDMINE) + tag(0x17, 1) + weapon(0x0180, MODEL_CHRREMOTEMINE, -1, OBJFLAG_00000001, 0, 0, WEAPON_TIMEDMINE) + tag(0x02, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_0116, OBJFLAG_00000002 | OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3, 3, 3, 0) + tag(0x27, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_0117, OBJFLAG_00000002 | OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3, 3, 3, 0) + tag(0x28, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_0118, OBJFLAG_00000002 | OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3, 3, 3, 0) + tag(0x29, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_0119, OBJFLAG_00000002 | OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3, 3, 3, 0) + tag(0x2a, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_011A, OBJFLAG_00000002 | OBJFLAG_00000008 | OBJFLAG_INVINCIBLE | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_REMOVEWHENDESTROYED, 0, 1000, 3, 3, 3, 0) + tag(0x03, 1) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_RIT_0112, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x0f, 3) + tag(0x05, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_RIT_010C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x010c, 0x010d, -1, -1, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x1b000000) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00FF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + lift_door(-1, -2, 0) +#if VERSION >= VERSION_PAL_FINAL + tag(0x2b, 1) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_UNBLOCKABLEOPEN, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) +#elif VERSION >= VERSION_NTSC_1_0 + tag(0x2b, 1) + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) +#endif + door(0x0100, MODEL_DD_DR_NONREF, PAD_RIT_00F3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x06, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_RIT_010F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x010f, 0x010e, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x1b000000) + tag(0x07, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_0113, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x08, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_RIT_0114, OBJFLAG_00000002, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x12, 1) + stdobject(0x0100, MODEL_AF1_PILOTCHAIR, PAD_RIT_013A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PILOTCHAIR, PAD_RIT_013B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x13, 1) + stdobject(0x0100, MODEL_AF1_PILOTCHAIR, PAD_RIT_013C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x10, 1) + stdobject(0x0100, MODEL_AF1_PILOTCHAIR, PAD_RIT_013D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x11, 1) + stdobject(0x0100, MODEL_AF1_PILOTCHAIR, PAD_RIT_013E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_011F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0120, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0121, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0122, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0123, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0124, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0125, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0126, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0127, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0128, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0129, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_012A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_012B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_012D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_012E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_012F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0130, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0131, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0132, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0133, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0134, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0135, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0136, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0137, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0138, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_0139, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_016A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0160, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0161, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0162, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0163, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0164, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0165, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_RIT_0166, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_013F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0140, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0141, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0142, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0143, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0144, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0145, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0146, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0147, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0148, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0149, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_014A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_014B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_014C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_014D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_014E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_014F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0150, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0151, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0152, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TABLE, PAD_RIT_0169, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_AF1_TOILET, PAD_RIT_0153, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_TOILET, PAD_RIT_0154, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_LAMP, PAD_RIT_0156, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_LAMP, PAD_RIT_0157, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_LAMP, PAD_RIT_0158, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_LAMP, PAD_RIT_0159, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_LAMP, PAD_RIT_015A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_LAMP, PAD_RIT_015B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_AF1_PASSCHAIR, PAD_RIT_015E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x19, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x37, 1) + stdobject(0x0100, MODEL_AIRFORCE1, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x1a, 1) + stdobject(0x0100, MODEL_ELVIS_SAUCER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, 0, 0, 1000) + tag(0x23, 1) + stdobject(0x0019, MODEL_SAUCERINSIDE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_HOVBIKE, PAD_RIT_00C0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_DOOR2A_G5, PAD_RIT_0104, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_BULLETPROOF, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000000, 0x00000800) + tag(0x1c, 1) + door(0x0100, MODEL_DD_GRATE, PAD_RIT_00F0, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00010000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000000) + tag(0x1e, 1) + singlemonitor(0x0100, MODEL_GOODSTATION, PAD_RIT_0168, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x21, 1) + singlemonitor(0x0100, MODEL_GOODSTATION, PAD_RIT_0167, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x00, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, PAD_RIT_00B3, OBJFLAG_00000001 | OBJFLAG_00000100, 0, OBJFLAG3_PLAYERUNDROPPABLE, WEAPON_SUITCASE) + rename_object(-1, WEAPON_SUITCASE, L_RIT_010, L_RIT_011, L_RIT_012, L_RIT_013, L_RIT_014) // "Obtain Suitcase." + tag(0x3a, 1) + weapon(0x0180, MODEL_CHRBRIEFCASE, -1, OBJFLAG_00000001 | OBJFLAG_00000100, 0, OBJFLAG3_PLAYERUNDROPPABLE, WEAPON_SUITCASE) + rename_object(-1, WEAPON_SUITCASE, L_RIT_010, L_RIT_011, L_RIT_012, L_RIT_013, L_RIT_014) // "Obtain Suitcase." + tag(0x24, 1) + stdobject(0x0100, MODEL_PRESCAPSULE, PAD_RIT_0171, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 32000) + glass(0x0100, MODEL_WINDOW, PAD_RIT_016D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_RIT_016E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_RIT_016F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + glass(0x0100, MODEL_WINDOW, PAD_RIT_0170, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x2f, 5) + tag(0x30, 6) + tag(0x31, 7) + tag(0x32, 8) + conditional_scenery(1, 0, 0) + debris(0x0019, MODEL_AF1RUBBLE, PAD_RIT_00CE, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF, 0, 1) + conditional_scenery(1, 0, 0) + debris(0x0019, MODEL_AF1RUBBLE, PAD_RIT_00CF, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF, 0, 1) + conditional_scenery(1, 0, 0) + debris(0x0019, MODEL_AF1RUBBLE, PAD_RIT_00D0, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF, 0, 1) + conditional_scenery(1, 0, 0) + debris(0x0019, MODEL_AF1RUBBLE, PAD_RIT_00D1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF, 0, 1) + tag(0x33, 4) + tag(0x34, 4) + tag(0x35, 4) + tag(0x36, 4) + weapon(0x0100, MODEL_CHRREMOTEMINE, PAD_RIT_00CE, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_INVISIBLE, 0, WEAPON_REMOTEMINE) + weapon(0x0100, MODEL_CHRREMOTEMINE, PAD_RIT_00CF, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_INVISIBLE, 0, WEAPON_REMOTEMINE) + weapon(0x0100, MODEL_CHRREMOTEMINE, PAD_RIT_00D0, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_INVISIBLE, 0, WEAPON_REMOTEMINE) + weapon(0x0100, MODEL_CHRREMOTEMINE, PAD_RIT_00D1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_INVISIBLE, 0, WEAPON_REMOTEMINE) + tag(0x2c, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_RIT_016C, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x2d, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_RIT_016B, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x38, 2) + tag(0x39, 2) + weapon(0x0180, MODEL_CHRCYCLONE, PAD_RIT_00CB, OBJFLAG_00000001, 0, 0, WEAPON_CYCLONE) + weapon(0x0180, MODEL_CHRCYCLONE, PAD_RIT_00CC, OBJFLAG_00000001, 0, 0, WEAPON_CYCLONE) + link_guns(-1, -2) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_STEWARDESS) + ammo(AMMOTYPE_CROSSBOW, 10) + ammo(AMMOTYPE_SMG, 100) + intro_weapon(WEAPON_UNARMED, -1) + intro_weapon(WEAPON_COMBATBOOST, -1) + ammo(AMMOTYPE_BOOST, 2) + spawn(PAD_RIT_008A) + endintro +}; + +s32 path00[] = { + PAD_RIT_0034, + PAD_RIT_0033, + PAD_RIT_0031, + PAD_RIT_0030, + PAD_RIT_0031, + PAD_RIT_0033, + PAD_RIT_0034, + -1, +}; + +s32 path01[] = { + PAD_RIT_000D, + PAD_RIT_000E, + PAD_RIT_000B, + PAD_RIT_0012, + PAD_RIT_0007, + PAD_RIT_0006, + PAD_RIT_0010, + PAD_RIT_000C, + -1, +}; + +s32 path02[] = { + PAD_RIT_003E, + PAD_RIT_0044, + PAD_RIT_0042, + PAD_RIT_0040, + PAD_RIT_003F, + PAD_RIT_003D, + PAD_RIT_003E, + PAD_RIT_004D, + -1, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_STEWARD, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PILOT1, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(CHR_PILOT2, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x01, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x02, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x03, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x04, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x05, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x06, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x07, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x08, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x09, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0a, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0b, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0c, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0d, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0e, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x0f, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x10, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x11, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x12, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x13, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x14, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x15, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x16, CHRCFLAG_KEEPCORPSEKO) + set_chr_chrflag(0x17, CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + yield + yield + set_chr_team(CHR_ANTI, TEAM_04) + chr_draw_weapon(CHR_BOND, WEAPON_UNARMED) + chr_draw_weapon(CHR_COOP, WEAPON_UNARMED) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1003_rebuild_groups[] = { + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1024_give_objects[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x2d) + give_object_to_chr(OBJ_EQUIPMENT, CHR_BOND) + give_object_to_chr(OBJ_EQUIPMENT_COOP, CHR_COOP) + + label(0x2d) + set_object_flag2(OBJ_DATAUPLINK_BOND, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_DATAUPLINK_BOND, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_REMOTEMINE_BOND, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_REMOTEMINE_BOND, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_DATAUPLINK_COOP, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_DATAUPLINK_COOP, OBJFLAG_UNCOLLECTABLE) + set_object_flag2(OBJ_REMOTEMINE_COOP, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_REMOTEMINE_COOP, OBJFLAG_UNCOLLECTABLE) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_has_object(CHR_P1P2, OBJ_EQUIPMENT, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) + give_object_to_chr(OBJ_REMOTEMINE_BOND, CHR_BOND) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) + give_object_to_chr(OBJ_REMOTEMINE_COOP, CHR_COOP) + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_reassign_ailists_during_conversation[] = { + // Wait until player in president's room + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0055, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0056, /*goto*/ 0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x0057, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_00100000) + set_chr_target_chr(CHR_PRESIDENT, CHR_P1P2) + set_ailist(0x01, AILIST_BE_UNALERT) + set_ailist(CHR_STEWARDESS, AILIST_BE_UNALERT) + set_ailist(CHR_STEWARD, AILIST_BE_UNALERT) + set_ailist(0x04, AILIST_BE_UNALERT) + set_ailist(0x05, AILIST_BE_UNALERT) + set_ailist(0x06, AILIST_BE_UNALERT) + set_ailist(0x07, AILIST_BE_UNALERT) + set_ailist(0x08, AILIST_BE_UNALERT) + set_ailist(0x09, AILIST_BE_UNALERT) + set_ailist(0x0a, AILIST_BE_UNALERT) + set_ailist(0x0b, AILIST_BE_UNALERT) + set_ailist(0x0c, AILIST_BE_UNALERT) + set_ailist(0x0d, AILIST_BE_UNALERT) + set_ailist(0x0e, AILIST_BE_UNALERT) + set_ailist(0x0f, AILIST_BE_UNALERT) + set_ailist(0x10, AILIST_BE_UNALERT) + set_ailist(0x11, AILIST_BE_UNALERT) + set_ailist(0x12, AILIST_BE_UNALERT) + set_ailist(0x13, AILIST_BE_UNALERT) + set_ailist(0x14, AILIST_BE_UNALERT) + set_ailist(0x15, AILIST_BE_UNALERT) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_check_neutrals_killed[] = { + set_chr_chrflag(0x01, CHRCFLAG_KILLCOUNTABLE) +#if VERSION >= VERSION_JPN_FINAL + set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(CHR_STEWARD, CHRCFLAG_KILLCOUNTABLE) +#endif + set_chr_chrflag(0x04, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x05, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x06, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x07, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x08, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x09, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0a, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0b, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0c, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0d, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0e, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x0f, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x10, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x11, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x12, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x13, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x14, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x15, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x16, CHRCFLAG_KILLCOUNTABLE) + set_chr_chrflag(0x17, CHRCFLAG_KILLCOUNTABLE) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) + if_kill_count_gt(0, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + show_hudmsg(CHR_BOND, L_RIT_020) // "Too many neutral casualties inflicted." + set_stage_flag(STAGEFLAG_KILLED_NEUTRALS) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0401_init_stripes[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0402_init_elvis[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_hijack[] = { + yield + disable_chr(0x1d) + disable_chr(0x1e) + disable_chr(0x1f) + disable_chr(0x20) + disable_chr(0x21) + disable_chr(0x22) + disable_chr(0x23) + disable_chr(0x24) + disable_chr(0x25) + disable_chr(0x26) + disable_chr(0x27) + disable_chr(0x28) + disable_chr(0x29) + disable_chr(CHR_TAKER1) + disable_chr(CHR_TAKER2) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + play_music_continuously(MUSIC_AIRFORCEONE_X) + set_chr_maxdamage(0x01, 10) + set_chr_maxdamage(0x04, 10) + set_chr_maxdamage(0x05, 10) + set_chr_maxdamage(0x06, 10) + set_chr_maxdamage(0x07, 10) + set_chr_maxdamage(0x08, 10) + set_chr_maxdamage(0x09, 10) + set_chr_maxdamage(0x0a, 10) + set_chr_maxdamage(0x0b, 10) + set_chr_maxdamage(0x0c, 10) + set_chr_maxdamage(0x0d, 10) + set_chr_maxdamage(0x0e, 10) + set_chr_maxdamage(0x0f, 10) + set_chr_maxdamage(0x10, 10) + set_chr_maxdamage(0x16, 10) + set_chr_maxdamage(0x17, 10) + set_chr_maxdamage(CHR_PILOT1, 10) + set_chr_maxdamage(CHR_PILOT2, 10) + set_ailist(0x01, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(CHR_STEWARDESS, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(CHR_STEWARD, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x04, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x05, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x06, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x07, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x08, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x09, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x0a, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x0b, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x0c, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x0d, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x10, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x12, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x13, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x15, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x16, AILIST_REMOVE_IF_OFFSCREEN) + yield + set_ailist(0x17, AILIST_REMOVE_IF_OFFSCREEN) + set_ailist(0x0e, AILIST_INIT_DEFEND_PAD) + set_ailist(0x0f, AILIST_INIT_DEFEND_PAD) + set_ailist(0x11, AILIST_INIT_DEFEND_PAD) + set_ailist(0x14, AILIST_INIT_DEFEND_PAD) + yield + + #define enable_stripes_chr(chr, function) \ + enable_chr(chr) \ + set_ailist(chr, function) \ + unset_chr_chrflag(chr, CHRCFLAG_HIDDEN) \ + set_chr_hiddenflag(chr, CHRHFLAG_00400000) \ + yield + + enable_stripes_chr(0x1d, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x1e, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x1f, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x20, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x21, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x22, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x23, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x24, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x25, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x26, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x27, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x28, AILIST_REINIT_STRIPES) + enable_stripes_chr(0x29, AILIST_COCKPIT_STRIPES) + enable_stripes_chr(CHR_TAKER1, AILIST_TAKER2) + enable_stripes_chr(CHR_TAKER2, AILIST_TAKER1) + + set_chr_flag_bankx(0x01, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(CHR_STEWARDESS, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(CHR_STEWARD, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x04, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x05, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x06, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x07, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x08, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x09, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0a, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0b, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0c, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0d, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0e, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x0f, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x10, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x11, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x12, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x13, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x14, CHRFLAG0_AIVSAI, BANK_0) + set_chr_flag_bankx(0x15, CHRFLAG0_AIVSAI, BANK_0) + set_chr_team(CHR_TRENT, TEAM_04) + set_chr_team(CHR_BLONDE1, TEAM_04) + set_chr_team(CHR_BLONDE2, TEAM_04) + unset_chr_hiddenflag(CHR_TRENT, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_hiddenflag(CHR_BLONDE1, CHRHFLAG_ANTINONINTERACTABLE) + unset_chr_hiddenflag(CHR_BLONDE2, CHRHFLAG_ANTINONINTERACTABLE) +#if VERSION >= VERSION_NTSC_1_0 + unlock_door(OBJ_COCKPITDOOR, 0x40) +#endif + rebuild_teams + rebuild_squadrons + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + unset_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0403_stripes[] = { + set_returnlist(CHR_SELF, AILIST_STRIPES) + set_self_chrflag(CHRCFLAG_00000040) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) + + // No target nearby + yield + unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) + stop_chr + set_ailist(CHR_SELF, GAILIST_UNALERTED) + + // Got target + label(0x06) + if_target_is_player(/*goto*/ 0x06) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) + set_returnlist(CHR_SELF, AILIST_STRIPES) + set_shotlist(AILIST_STRIPES) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + label(0x06) + unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + + label(0x2d) + set_target_chr(-1) + stop_chr + endloop(0x04) + + endlist +}; + +u8 unregistered_function1[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#define check_mine_wasted(chr1, chr2, myflag, buddyflag) \ + set_object_flag(OBJ_COMMSHUB1, OBJFLAG_AIUNDROPPABLE) \ + set_object_flag(OBJ_COMMSHUB2, OBJFLAG_AIUNDROPPABLE) \ + set_object_flag(OBJ_COMMSHUB3, OBJFLAG_AIUNDROPPABLE) \ + set_object_flag(OBJ_COMMSHUB4, OBJFLAG_AIUNDROPPABLE) \ + set_object_flag(OBJ_COMMSHUB5, OBJFLAG_AIUNDROPPABLE) \ + yield \ + yield \ + if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) \ + \ + /* Wait until equipment collected */ \ + beginloop(0x93) \ + if_objective_complete(0, /*goto*/ 0x06) \ + endloop(0x93) \ + \ + label(0x06) \ + yield \ + yield \ + yield \ + yield \ + yield \ + label(0x08) \ + set_target_chr(chr1) \ + \ + /* Wait until mine thrown */ \ + beginloop(0x09) \ + if_ammo_quantity_lt(chr2, AMMOTYPE_TIMED_MINE, 1, /*goto*/ 0x2d) \ + endloop(0x09) \ + \ + label(0x2d) \ + if_stage_flag_eq(VERSION >= VERSION_NTSC_1_0 ? STAGEFLAG_MIDCUTSCENE_FINISHED : STAGEFLAG_PRESIDENT_STARTED_RUNNING, FALSE, /*goto*/ 0x0a) \ + label(0x2d) \ + unset_object_flag(OBJ_COMMSHUB1, OBJFLAG_INVINCIBLE) \ + unset_object_flag(OBJ_COMMSHUB2, OBJFLAG_INVINCIBLE) \ + unset_object_flag(OBJ_COMMSHUB3, OBJFLAG_INVINCIBLE) \ + unset_object_flag(OBJ_COMMSHUB4, OBJFLAG_INVINCIBLE) \ + unset_object_flag(OBJ_COMMSHUB5, OBJFLAG_INVINCIBLE) \ + restart_timer \ + \ + /* Wait 8.3 seconds or until commshub destroyed */ \ + beginloop(0x04) \ + if_timer_gt(500, /*goto*/ 0x0a) \ + if_object_in_good_condition(OBJ_COMMSHUB1, /*goto*/ 0x2d) \ + goto_next(0x06) \ + \ + label(0x2d) \ + if_object_in_good_condition(OBJ_COMMSHUB2, /*goto*/ 0x2d) \ + goto_next(0x06) \ + \ + label(0x2d) \ + if_object_in_good_condition(OBJ_COMMSHUB3, /*goto*/ 0x2d) \ + goto_next(0x06) \ + \ + label(0x2d) \ + if_object_in_good_condition(OBJ_COMMSHUB4, /*goto*/ 0x2d) \ + goto_next(0x06) \ + \ + label(0x2d) \ + if_object_in_good_condition(OBJ_COMMSHUB5, /*goto*/ 0x2d) \ + goto_next(0x06) \ + \ + label(0x2d) \ + endloop(0x04) \ + \ + /* Commshub damaged */ \ + label(0x06) \ + show_hudmsg(CHR_BOND, 0x3615) /* "UFO attachment damaged." */ \ + set_stage_flag(STAGEFLAG_UFO_ATTACHMENT_DAMAGED) \ + unset_stage_flag(STAGEFLAG_BOTH_MINES_WASTED) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + /* Mine wasted */ \ + label(0x0a) \ + set_stage_flag(myflag) \ + if_stage_flag_eq(buddyflag, TRUE, /*goto*/ 0x2d) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + \ + label(0x2d) \ + show_hudmsg(CHR_BOND, 0x3645) /* "Timed mine has been wasted." */ \ + set_stage_flag(STAGEFLAG_BOTH_MINES_WASTED) \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 func1008_check_mine_wasted_bond[] = { + check_mine_wasted(CHR_BOND, CHR_TARGET, STAGEFLAG_BOND_MINE_WASTED, STAGEFLAG_COOP_MINE_WASTED) + endlist +}; + +u8 func1021_check_mine_wasted_coop[] = { + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x06) + label(0x2d) + set_stage_flag(STAGEFLAG_COOP_MINE_WASTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + check_mine_wasted(CHR_COOP, CHR_COOP, STAGEFLAG_COOP_MINE_WASTED, STAGEFLAG_BOND_MINE_WASTED) + endlist +}; + +u8 func101e_blow_mines[] = { + // Wait for any commshub destroyed + beginloop(0x04) + if_object_in_good_condition(OBJ_COMMSHUB1, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_object_in_good_condition(OBJ_COMMSHUB2, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_object_in_good_condition(OBJ_COMMSHUB3, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_object_in_good_condition(OBJ_COMMSHUB4, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_object_in_good_condition(OBJ_COMMSHUB5, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + endloop(0x04) + + label(0x06) + + // 1 + unset_object_flag(0x2f, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x33, OBJFLAG2_INVISIBLE) + unset_object_flag(0x33, OBJFLAG_INVINCIBLE) + destroy_object(0x33) + restart_timer + + beginloop(0x60) + if_timer_gt(60, /*goto*/ 0x2d) + endloop(0x60) + + label(0x2d) + unset_object_flag2(0x2f, OBJFLAG2_INVISIBLE) + destroy_object(0x2f) + + // 2 + unset_object_flag(0x30, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x34, OBJFLAG2_INVISIBLE) + unset_object_flag(0x34, OBJFLAG_INVINCIBLE) + destroy_object(0x34) + restart_timer + + beginloop(0x77) + if_timer_gt(60, /*goto*/ 0x2d) + endloop(0x77) + + label(0x2d) + unset_object_flag2(0x30, OBJFLAG2_INVISIBLE) + destroy_object(0x30) + + // 3 + unset_object_flag(0x31, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x35, OBJFLAG2_INVISIBLE) + unset_object_flag(0x35, OBJFLAG_INVINCIBLE) + destroy_object(0x35) + restart_timer + + beginloop(0x78) + if_timer_gt(60, /*goto*/ 0x2d) + endloop(0x78) + + label(0x2d) + unset_object_flag2(0x31, OBJFLAG2_INVISIBLE) + destroy_object(0x31) + + // 4 + unset_object_flag(0x32, OBJFLAG_INVINCIBLE) + unset_object_flag2(0x36, OBJFLAG2_INVISIBLE) + unset_object_flag(0x36, OBJFLAG_INVINCIBLE) + destroy_object(0x36) + restart_timer + + beginloop(0x79) + if_timer_gt(60, /*goto*/ 0x2d) + endloop(0x79) + + label(0x2d) + unset_object_flag2(0x32, OBJFLAG2_INVISIBLE) + destroy_object(0x32) + + yield + disable_object(0x2f) + disable_object(0x30) + disable_object(0x31) + disable_object(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_check_end_level[] = { + beginloop(0x04) + if_all_objectives_complete(/*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_ALL_OBJECTIVES_COMPLETE) + restart_timer + label(0x08) + yield + label(0x06) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x06) + + // Both players dead + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Redundant check + label(0x06) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x06) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func100a_autopilot_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_AUTOPILOT_SWITCH, /*goto*/ 0x2d) + goto_next(0x08) + + label(0x2d) + if_chr_activated_object(CHR_P1P2, OBJ_AUTOPILOT_SWITCH, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + label(0x06) + if_stage_flag_eq(STAGEFLAG_PLANE_NOSEDIVING, TRUE, /*goto*/ 0x06) + endloop(0x04) + + // Switch pressed + label(0x06) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_AUTOPILOT_SWITCH, TRUE) + set_object_image(OBJ_AUTOPILOT_SWITCH, 0, TVCMDLIST_13) + set_stage_flag(STAGEFLAG_PLANE_STABILIZED) + yield + show_hudmsg(CHR_P1P2, L_RIT_024) // "Air Force One has been stabilized." + show_hudmsg(CHR_P1P2, L_RIT_023) // "Autopilot has been activated." + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Switch destroyed + label(0x08) + show_hudmsg(CHR_P1P2, L_RIT_025) // "Autopilot systems have been destroyed." + set_stage_flag(STAGEFLAG_AUTOPILOT_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0406_init_president[] = { + set_chr_maxdamage(CHR_SELF, 0) + set_ailist(CHR_SELF, AILIST_PRESIDENT_IN_ROOM) + endlist +}; + +u8 func0405_president_in_room[] = { + set_shotlist(AILIST_PRESIDENT_IN_ROOM) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + // Dying + label(0x2d) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + stop_chr + yield + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_00100000, TRUE, /*goto*/ 0x03) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) + endloop(0x04) + + // Dying + label(0x2d) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x03) + set_target_chr(CHR_PRESET) + restart_timer + label(0x08) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + // Wait for Carrington's "on this level" message to finish + if_sound_finished(CHANNEL_6, /*goto*/ 0x2d) + reloop(0x09) + + label(0x2d) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + do_preset_animation(PRESETANIM_TALK0) + speak(CHR_TARGET, L_RIT_035, MP3_02C5, CHANNEL_6, COLOR_08_RED) // "Who are you, young lady?" + restart_timer + + beginloop(0x60) + if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) + if_can_see_target(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_saw_injury(0x00, /*goto*/ 0x86) + if_hears_target(/*goto*/ 0x86) + if_timer_lt(120, /*goto*/ 0x2d) + if_chr_in_view(/*goto*/ 0x06) + label(0x2d) + endloop(0x60) + + label(0x06) + speak(CHR_TARGET, L_RIT_037, MP3_02BC, CHANNEL_7, COLOR_09_BLUE) // "Mr. President, you're in danger. Trent is trying t..." + restart_timer + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x78) + + // In this loop the president will continue to turn to face the player + // because it lacks an if_target_in_fov_left check. + beginloop(0x78) + if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) + if_can_see_target(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_saw_injury(0x00, /*goto*/ 0x86) + if_hears_target(/*goto*/ 0x86) + if_timer_lt(240, /*goto*/ 0x2d) + if_chr_in_view(/*goto*/ 0x06) + label(0x2d) + endloop(0x78) + + label(0x06) + do_preset_animation(PRESETANIM_TALK1) + speak(CHR_TARGET, L_RIT_040, MP3_02C6, CHANNEL_6, COLOR_08_RED) // "You can't make accusations like that without evide..." + restart_timer + + beginloop(0x79) + if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) + if_can_see_target(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_saw_injury(0x00, /*goto*/ 0x86) + if_hears_target(/*goto*/ 0x86) + if_timer_lt(400, /*goto*/ 0x2d) + goto_next(0x84) + + label(0x2d) + endloop(0x79) + + label(0x84) + if_chr_has_object(CHR_TARGET, OBJ_EQUIPMENT, /*goto*/ 0x10) + if_chr_has_object(CHR_TARGET, OBJ_EQUIPMENT_COOP, /*goto*/ 0x10) + + // No equipment + label(0x85) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) + set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISE_UNCOVERED) + speak(CHR_TARGET, L_RIT_036, MP3_02C4, CHANNEL_6, COLOR_08_RED) // "Security, SECURITY!!" + restart_timer + chr_do_animation(ANIM_TALKING_0231, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x77) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x77) + + label(0x06) + set_ailist(0x01, GAILIST_UNALERTED) + set_ailist(CHR_STEWARDESS, GAILIST_UNALERTED) + set_ailist(CHR_STEWARD, GAILIST_UNALERTED) + set_ailist(0x04, GAILIST_UNALERTED) + set_ailist(0x05, GAILIST_UNALERTED) + set_ailist(0x06, GAILIST_UNALERTED) + set_ailist(0x07, GAILIST_UNALERTED) + set_ailist(0x08, GAILIST_UNALERTED) + set_ailist(0x09, GAILIST_UNALERTED) + set_ailist(0x0a, GAILIST_UNALERTED) + set_ailist(0x0b, GAILIST_UNALERTED) + set_ailist(0x0c, GAILIST_UNALERTED) + set_ailist(0x0d, GAILIST_UNALERTED) + set_ailist(0x0e, GAILIST_UNALERTED) + set_ailist(0x0f, GAILIST_UNALERTED) + set_ailist(0x10, GAILIST_UNALERTED) + set_ailist(0x11, GAILIST_UNALERTED) + set_ailist(0x12, GAILIST_UNALERTED) + set_ailist(0x13, GAILIST_UNALERTED) + set_ailist(0x14, GAILIST_UNALERTED) + set_ailist(0x15, GAILIST_UNALERTED) + set_stage_flag(STAGEFLAG_PRESIDENT_CALLED_SECURITY) + yield + increase_squadron_alertness(100) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) + + beginloop(0x0a) + endloop(0x0a) + + label(0x06) + + // Has equipment + label(0x10) + stop_chr + speak(CHR_TARGET, L_RIT_041, MP3_02BD, CHANNEL_6, COLOR_09_BLUE) // "This is a recording of a meeting between Trent and..." + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) + + // This loop uses an if_sound_finished check rather than a timer check, + // which allows the speech to be skipped. + beginloop(0x0b) + if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) + if_can_see_target(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_saw_injury(0x00, /*goto*/ 0x86) + if_hears_target(/*goto*/ 0x86) + if_sound_finished(CHANNEL_6, /*goto*/ 0x06) + goto_first(0x0b) + + label(0x06) + do_preset_animation(PRESETANIM_TALK2) + speak(CHR_TARGET, L_RIT_042, MP3_02C7, CHANNEL_6, COLOR_08_RED) // "Seems overwhelming... I'm in your hands. What do w..." + restart_timer + + beginloop(0x7a) + if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) + if_can_see_target(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_saw_injury(0x00, /*goto*/ 0x86) + if_hears_target(/*goto*/ 0x86) + if_timer_gt(400, /*goto*/ 0x06) + endloop(0x7a) + + label(0x33) + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_MIDCUTSCENE) + + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + disable_object(OBJ_EXTERIOR_DOOR) + disable_object(OBJ_FLOORHATCH) + set_object_flag(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG_00000100) + unset_object_flag2(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG2_INVISIBLE) + unset_object_flag2(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG_00000100) + play_sound(SFX_EXPLOSION_8098, -1) + restart_timer + + beginloop(0x7b) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x7b) + + label(0x06) + do_preset_animation(PRESETANIM_TALKRANDOM) + speak(CHR_TARGET, L_RIT_038, SFX_816E, CHANNEL_6, COLOR_08_RED) // "What the hell was that!" + restart_timer + + beginloop(0x0c) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + stop_chr + set_stage_flag(STAGEFLAG_PRESIDENT_STARTED_RUNNING) +#if VERSION < VERSION_NTSC_1_0 + unlock_door(OBJ_COCKPITDOOR, 0x40) +#endif + speak(CHR_TARGET, L_RIT_039, MP3_02BE, CHANNEL_6, COLOR_09_BLUE) // "We have to get you to the escape pod. Follow me." + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0e) + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + set_chrpreset(CHR_TARGET) + set_chr_maxdamage(CHR_SELF, 500) + set_shotlist(AILIST_PRESIDENT_RUNNING) + set_ailist(CHR_SELF, AILIST_PRESIDENT_RUNNING) + + label(0x86) + goto_first(0x85) + + endlist +}; + +u8 func0404_president_running[] = { + set_self_chrflag(CHRCFLAG_PUSHABLE) + set_shotlist(AILIST_PRESIDENT_RUNNING) + set_target_chr(CHR_PRESET) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x2d) + + // Dying + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(0x54) + + label(0x06) + assign_sound(MP3_02BF, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x2d) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x55) + + // Injured + label(0x06) + restart_timer + assign_sound(MP3_02C2, CHANNEL_6) + play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_INJURED, TRUE, /*goto*/ 0x56) + set_stage_flag(STAGEFLAG_PRESIDENT_INJURED) + show_hudmsg(CHR_BOND, L_RIT_072) // "The President is under attack." + + beginloop(0x56) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + + label(0x06) + if_chr_stopped(/*goto*/ 0x55) + endloop(0x56) + + // Not injured, or injury animation finished + label(0x55) + stop_chr + restart_timer + + beginloop(0x57) + // @bug: This FALSE should be TRUE instead. This causes the president + // to behave weirdly when you've killed both blondes and stand in the + // entrance to Trent's room. + if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, FALSE, /*goto*/ 0x2d) + + // Both blondes dead + // This room is the entrance to Trent's room + if_chr_in_room(CHR_TARGET, 0x00, 0x000d, /*goto*/ 0x10) + + // At least one Blonde is alive, or follow through + // These rooms are the escape pod area + label(0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0030, /*goto*/ 0x11) + if_chr_in_room(CHR_TARGET, 0x00, 0x0031, /*goto*/ 0x11) + if_chr_in_room(CHR_TARGET, 0x00, 0x0032, /*goto*/ 0x11) + if_can_see_target(/*goto*/ 0x06) + goto_next(0x58) + + label(0x06) + if_timer_gt(1250, /*goto*/ 0x2d) + if_distance_to_target_gt(200, /*goto*/ 0x58) + endloop(0x57) + + // Been in sight for almost 21 seconds - say quip + label(0x2d) + call_rng + if_rand_lt(64, /*goto*/ 0x2d) + say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x55) + + label(0x2d) + say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x55) + + // Unreachable + label(0x06) + say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x55) + + // Distance to player > 200 or line of sight broken, so start following + label(0x58) + restart_timer + label(0x2d) + try_jog_to_target(/*goto*/ 0x59) + + beginloop(0x59) + // @bug: This FALSE should be TRUE instead. This causes the president + // to behave weirdly when you've killed both blondes and stand in the + // entrance to Trent's room. + if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, FALSE, /*goto*/ 0x2d) + + // Both blondes dead + // This room is the entrance to Trent's room + if_chr_in_room(CHR_TARGET, 0x00, 0x000d, /*goto*/ 0x10) + + // At least one Blonde is alive, or follow through + // These rooms are the escape pod area + label(0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0030, /*goto*/ 0x11) + if_chr_in_room(CHR_TARGET, 0x00, 0x0031, /*goto*/ 0x11) + if_chr_in_room(CHR_TARGET, 0x00, 0x0032, /*goto*/ 0x11) + if_distance_to_target_lt(100, /*goto*/ 0x5b) + if_chr_stopped(/*goto*/ 0x5b) + if_timer_gt(360, /*goto*/ 0x2d) + endloop(0x59) + + label(0x2d) + say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x58) + + label(0x06) + say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) + goto_first(0x58) + + // Stopped because president is close to player's sampled prop + label(0x5b) + goto_first(0x55) + + // Unreachable + label(0x5c) + try_run_to_target(/*goto*/ 0x5d) + + beginloop(0x5d) + if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, FALSE, /*goto*/ 0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x000d, /*goto*/ 0x10) + label(0x2d) + if_chr_in_room(CHR_TARGET, 0x00, 0x0030, /*goto*/ 0x11) + if_chr_in_room(CHR_TARGET, 0x00, 0x0031, /*goto*/ 0x11) + if_chr_in_room(CHR_TARGET, 0x00, 0x0032, /*goto*/ 0x11) + endloop(0x5d) + + label(0x5e) + goto_first(0x55) + + // Player in pod room while a Blonde is alive + // This pad is at the escape pod + label(0x11) + jog_to_pad(PAD_RIT_0083) + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x09) + + label(0x06) + stop_chr + set_stage_flag(STAGEFLAG_PRESIDENT_AT_POD) + set_chr_team(CHR_SELF, TEAM_NONCOMBAT) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Player is in the entrance to Trent's room and both blondes are dead. + // The intention behind this code is to make the president cower until the + // Blondes are dead, then resume following. However, due to a logic bug + // described earlier this code is jumped to only after the blondes are dead. + label(0x10) + run_to_pad(PAD_RIT_0019) + + // This loop will never iterate because the blondes are already dead + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x0b) + if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, TRUE, /*goto*/ 0x06) + endloop(0x0a) + + // Unreachable under real conditions + label(0x0b) + chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x83) + if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, TRUE, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x83) + + label(0x2d) + goto_first(0x0b) + + // Both blondes dead - resume running + label(0x06) + goto_first(0x55) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_president_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_PRESIDENT_DEAD) + show_hudmsg(CHR_BOND, L_RIT_026) // "The President has been incapacitated." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0409_unused[] = { + set_self_chrflag(CHRCFLAG_00000040) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_target_is_player(/*goto*/ 0x06) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) + set_returnlist(CHR_SELF, 0x0409) + set_shotlist(0x0409) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + label(0x2d) + endloop(0x04) + + label(0x06) + unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * This stripes guard is in one of the cockpit rooms. + */ +u8 func100c_cockpit_stripes[] = { + set_shotlist(GAILIST_ALERTED) + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_self_chrflag(CHRCFLAG_00000040) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x06) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_target_is_player(/*goto*/ 0x06) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) + set_returnlist(CHR_SELF, AILIST_COCKPIT_STRIPES) + set_shotlist(GAILIST_COMBAT_WITH_TARGET) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + label(0x2d) + endloop(0x04) + + label(0x06) + unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040f_taker1[] = { + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) + set_chr_dodge_rating(2, 0) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_target_chr(CHR_PILOT1) + set_ailist(CHR_SELF, AILIST_TAKER) + endlist +}; + +u8 func0410_taker2[] = { + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) + set_chr_dodge_rating(2, 0) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_target_chr(CHR_PILOT2) + set_ailist(CHR_SELF, AILIST_TAKER) + endlist +}; + +u8 func0413_taker[] = { + set_shotlist(GAILIST_ALERTED) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_accuracy(50) + set_self_chrflag(CHRCFLAG_00000040) + restart_timer + + // Wait for condition + beginloop(0x04) + if_door_state(0x0c, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x0a) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, FALSE, /*goto*/ 0x2d) + if_timer_gt(7200, /*goto*/ 0x0a) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0a) + label(0x2d) + endloop(0x04) + + // Wait another 1.5 seconds + label(0x0a) + restart_timer + + beginloop(0x0c) + if_timer_gt(90, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x11) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x06) + label(0x06) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + label(0x08) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) + say_quip(CHR_BOND, QUIP_ATTACK2, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + restart_timer + + beginloop(0x09) + if_chr_stopped(/*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + if_target_is_player(/*goto*/ 0x11) + if_chrpresets_target_is_different(/*goto*/ 0x2d) + goto_next(0x11) + + label(0x2d) + damage_chr(CHR_TARGET, WEAPON_SUPERDRAGON) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + if_chr_dead(CHR_TARGET, /*goto*/ 0x06) + goto_first(0x0a) + + label(0x11) + label(0x06) + unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func100c_cockpit[] = { + label(0x2d) + label(0x2e) + set_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) + + beginloop(0x60) + if_all_objectives_complete(/*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x2e) + endloop(0x60) + + // All objectives complete + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // UFO attachment damaged + label(0x2e) + yield + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_INVINCIBLE) + label(0x06) + + // This loop will surely never iterate because + // the UFO attachment is already damaged + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + if_chr_deadish(CHR_TAKER1, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_chr_deadish(CHR_TAKER2, /*goto*/ 0x2d) + goto_next(0x06) + + // Both takers dead + label(0x2d) + goto_next(0x2e) + + // At least one taker alive + label(0x06) + damage_chr(CHR_PILOT1, WEAPON_SUPERDRAGON) + damage_chr(CHR_PILOT2, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_PILOT1, WEAPON_SUPERDRAGON) + damage_chr(CHR_PILOT2, WEAPON_SUPERDRAGON) + yield + damage_chr(CHR_PILOT1, WEAPON_SUPERDRAGON) + damage_chr(CHR_PILOT2, WEAPON_SUPERDRAGON) + yield + set_stage_flag(STAGEFLAG_PILOTS_DEAD) + show_hudmsg(CHR_BOND, L_RIT_027) // "Pilots have been killed." + goto_next(0x06) + + // Both takers dead + label(0x2e) + + // Pilots killed + label(0x06) + label(0x10) + set_stage_flag(STAGEFLAG_PLANE_NOSEDIVING) + set_object_image(OBJ_AUTOPILOT_SWITCH, 0, TVCMDLIST_0F) + + // Wait 10 seconds + label(0x09) + restart_timer + + beginloop(0x0f) + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) + if_timer_gt(600, /*goto*/ 0x2d) + endloop(0x0f) + + label(0x2d) + configure_environment(0x0000, AIENVCMD_PLAYNOSEDIVE, 60) + + // Wait 40 seconds or for autopilot + restart_timer + + beginloop(0x0a) + if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x11) + if_timer_gt(2400, /*goto*/ 0x0b) + endloop(0x0a) + + label(0x0b) + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) + show_hudmsg(CHR_BOND, L_RIT_029) // "Air Force One is about to crash." + + // Wait until the 50 second mark + beginloop(0x0c) + if_all_objectives_complete(/*goto*/ 0x11) + if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x11) + if_timer_gt(3000, /*goto*/ 0x0e) + endloop(0x0c) + + // Crash + label(0x0e) + set_stage_flag(STAGEFLAG_PLANE_CRASHED) + explosions_around_chr(CHR_BOND) + restart_timer + + beginloop(0x65) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x65) + + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + label(0x7c) + label(0x2d) + set_object_image(0x03, 0, TVCMDLIST_13) + set_stage_flag(STAGEFLAG_PLANE_STABILIZED) + show_hudmsg(CHR_BOND, L_RIT_028) // "Pilots have been saved." + stop_ambient_track + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + label(0x08) + goto_first(0x04) + + // Plane stabilized or all objectives complete + label(0x11) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to a pilot and a cyclone guard. + */ +u8 func0411_typing_guy[] = { + set_shotlist(AILIST_TYPING_GUY) + label(0x04) + chr_do_animation(ANIM_SITTING_TYPING, 0, -1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) + + beginloop(0x03) + if_chr_idle(/*goto*/ 0x06) + goto_first(0x04) + + label(0x06) + endloop(0x03) + + endlist +}; + +/** + * Assigned to a pilot and a cyclone guard. + */ +u8 func0412_sitting_guy[] = { + set_shotlist(AILIST_SITTING_GUY) + label(0x04) + chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) + + beginloop(0x03) + if_chr_idle(/*goto*/ 0x06) + goto_first(0x04) + + label(0x06) + endloop(0x03) + + endlist +}; + +u8 func0426_start_path00[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(0) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0427_start_path01[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(1) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0428_start_path02[] = { + assign_path(2) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_AIRFORCEONE_INTRO) + camera_movement(ANIM_CUT_RIT_INTRO_CAM_01) + set_chr_chrflag(0x30, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x30, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x30, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_INTRO_STR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x30, 4) + set_chr_chrflag(0x31, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x31, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x31, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_INTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x31, 4) + set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_PRESIDENT, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_INTRO_PRES, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_PRESIDENT, 4) + set_chr_chrflag(0x13, CHRCFLAG_HIDDEN) + set_chr_chrflag(0x14, CHRCFLAG_HIDDEN) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x7d) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(140, 0x94) + + wait_until(180, 0x60) + speak(CHR_BOND, L_RIT_073, MP3_044C, CHANNEL_7, COLOR_05_GREEN) // "Have you thought any more about that proposal I ga..." + + wait_until(330, 0x95) + + wait_until(360, 0x96) + + wait_until(438, 0x77) + speak(CHR_BOND, L_RIT_074, MP3_044D, CHANNEL_7, COLOR_08_RED) // "My answer remains the same... I'm sorry Trent, but..." + + wait_until(486, 0x97) + + wait_until(532, 0x98) + + wait_until(850, 0x99) + + wait_until(1020, 0x78) + speak(CHR_BOND, L_RIT_075, MP3_044E, CHANNEL_7, COLOR_05_GREEN) // "But this is a golden opportunity to show that Amer..." + + wait_until(1402, 0x79) + speak(CHR_BOND, L_RIT_076, SFX_81BB, CHANNEL_7, COLOR_08_RED) // "Damn it, man! I say no and I mean no! I'm not gonn..." + + wait_until(2348, 0x7a) + speak(CHR_BOND, L_RIT_077, MP3_0450, CHANNEL_7, COLOR_05_GREEN) // "As you wish, sir." + + wait_until(2406, 0x9a) + + wait_until(2410, 0x62) + open_door(0x15) + + wait_until(2465, 0x9b) + + wait_until(2498, 0x9c) + + wait_until(2560, 0x9d) + + wait_until(2616, 0x9e) + + wait_until(2654, 0x7b) + speak(CHR_BOND, L_RIT_078, MP3_0451, CHANNEL_7, COLOR_05_GREEN) // "My last chance? Ha! You fool. That was yours." + close_door(0x15) + play_sound(SFX_DOOR_8008, CHANNEL_10) + + wait_until(2680, 0x9f) + + wait_until(2710, 0xa0) + + wait_until(2790, 0xa5) + + wait_until(3140, 0xa1) + + wait_until(3180, 0xa2) + + wait_until(3190, 0xa3) + + wait_until(3210, 0xa4) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x7d) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x7d) + label(0x2d) + endloop(0x08) + + label(0x7d) + mute_channel(CHANNEL_10) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) + label(0x2d) + if_savefile_flag_is_set(GAMEFILEFLAG_AF1_ENTRY, /*goto*/ 0x06) + goto_next(0x7e) + label(0x06) + camera_movement(ANIM_CUT_RIT_INTRO_CAM_02) + cmd0175(60) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + chr_move_to_pad(CHR_COOP, PAD_RIT_008A, 0x01, /*goto*/ 0x2d) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x5f) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x5f) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x5f) + label(0x2d) + endloop(0x09) + + label(0x7e) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) + label(0x2d) + camera_movement(ANIM_CUT_RIT_INTRO_CAM_03) + cmd0175(60) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + chr_move_to_pad(CHR_COOP, PAD_RIT_00B2, 0x01, /*goto*/ 0x2d) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x5f) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + beginloop(0x0a) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x5f) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x5f) + label(0x2d) + endloop(0x0a) + + label(0x5f) + mute_channel(CHANNEL_7) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + if_savefile_flag_is_set(GAMEFILEFLAG_AF1_ENTRY, /*goto*/ 0x06) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + chr_do_animation(ANIM_CUT_RIT_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + goto_next(0x2d) + label(0x06) + chr_do_animation(ANIM_CUT_RIT_INTRO_JO_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + label(0x2d) + stop_cutscene_track + stop_ambient_track + unset_chr_chrflag(0x13, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x14, CHRCFLAG_HIDDEN) + set_ailist(CHR_PRESIDENT, AILIST_INIT_PRESIDENT) + set_ailist(0x09, AILIST_INIT_NEUTRAL) + set_ailist(0x0a, AILIST_INIT_NEUTRAL) + set_ailist(0x0c, AILIST_INIT_NEUTRAL) + set_ailist(0x0d, AILIST_INIT_NEUTRAL) + remove_chr(0x30) + remove_chr(0x31) + unset_chr_chrflag(0x30, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x31, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_UNPLAYABLE) + set_stage_flag(STAGEFLAG_INTRO_FINISHED) + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * The dumbwaiter near the middle of the plane. + */ +u8 func1010_dumbwaiter1[] = { + label(0x03) + set_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) + set_object_image(OBJ_DUMBWAITER1_SWITCH, 0, TVCMDLIST_12) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER1_SWITCH, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + play_sound(SFX_043A, CHANNEL_7) + set_object_image(OBJ_DUMBWAITER1_SWITCH, 0, TVCMDLIST_13) + unset_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) + yield + yield + yield + + beginloop(0x08) + if_lift_stationary(OBJ_DUMBWAITER1, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + unset_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) + yield + yield + yield + + beginloop(0x0a) + if_lift_stationary(OBJ_DUMBWAITER1, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x06) + endloop(0x0a) + + label(0x2d) + yield + yield + yield + + beginloop(0x0b) + if_lift_stationary(OBJ_DUMBWAITER1, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + open_door(0x2b) +#endif + if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER1_SWITCH, /*goto*/ 0x2d) + label(0x2d) + goto_first(0x03) + + endlist +}; + +u8 func1011_dumbwaiter2[] = { + label(0x03) + set_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) + set_object_image(OBJ_DUMBWAITER2_SWITCH, 0, TVCMDLIST_12) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER2_SWITCH, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + play_sound(SFX_043A, CHANNEL_7) + set_object_image(OBJ_DUMBWAITER2_SWITCH, 0, TVCMDLIST_13) + unset_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) + yield + yield + yield + + beginloop(0x08) + if_lift_stationary(OBJ_DUMBWAITER2, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + unset_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) + yield + yield + yield + + beginloop(0x0a) + if_lift_stationary(OBJ_DUMBWAITER2, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + // @bug: Wrong object, but this is a no-op anyway. + if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER1_SWITCH, /*goto*/ 0x2d) + label(0x2d) + goto_first(0x03) + + endlist +}; + +u8 func040a_defend_pad[] = { + set_shotlist(AILIST_DEFEND_PAD) + set_returnlist(CHR_SELF, AILIST_DEFEND_PAD) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + // Dying + label(0x2d) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + // Injured + label(0x2d) + + beginloop(0x0a) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0a) + + // Not injured + label(0x06) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) + + label(0x03) + jog_to_pad(PAD_PRESET) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + stop_chr + + beginloop(0x09) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + // Detected enemy + label(0x08) + set_returnlist(CHR_SELF, AILIST_DEFEND_PAD) + set_shotlist(AILIST_DEFEND_PAD) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +/** + * Unused, but would have been assigned to a cyclone guard. + */ +u8 func040b_defend_president[] = { + set_shotlist(AILIST_DEFEND_PRESIDENT) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_distance_to_chr_lt(200, CHR_PRESIDENT, /*goto*/ 0x06) + + label(0x03) + try_jog_to_chr(CHR_PRESIDENT, /*goto*/ 0x04) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_detected_chr(CHR_PRESIDENT, /*goto*/ 0x60) + endloop(0x04) + + // Near president + label(0x60) + if_distance_to_chr_lt(200, CHR_PRESIDENT, /*goto*/ 0x06) + goto_first(0x04) + + label(0x06) + stop_chr + + beginloop(0x09) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_detected_chr(CHR_PRESIDENT, /*goto*/ 0x60) + goto_first(0x04) + + label(0x60) + if_distance_to_chr_gt(300, CHR_PRESIDENT, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + goto_first(0x03) + + // Detected enemy + label(0x08) + set_returnlist(CHR_SELF, AILIST_DEFEND_PRESIDENT) + set_shotlist(AILIST_DEFEND_PRESIDENT) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func0415_cloner1[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) + reloop(0x03) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_AT_POD, TRUE, /*goto*/ 0x06) + endloop(0x03) + + label(0x06) + + set_chr_team(CHR_SELF, TEAM_04) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) + // These rooms are the attachment area + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0019, /*goto*/ 0x2d) + if_never_been_onscreen(/*goto*/ 0x4f) + if_can_see_target(/*goto*/ 0x08) + label(0x2d) + reloop(0x04) + + // Line of sight to player + label(0x08) + set_ailist(CHR_SELF, AILIST_CLONE1) + + // Chr flag is unset + label(0x4f) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + // @bug? This may have intended to be a bank 1 check because the bank 1 + // flag is unset further below, and cloner3 uses bank 1. + label(0x4f) + if_self_flag_bankx_eq(CHRFLAG0_SQUADALERTANYDIST, TRUE, BANK_0, /*goto*/ 0x2d) + restart_timer + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) + if_timer_gt(2400, /*goto*/ 0x2d) + endloop(0x0b) + + // Player is in UFO area, or interval has passed + label(0x2d) + unset_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE1, 0, /*goto*/ 0x2d) + label(0x2d) + yield + endloop(0x04) + + // UFO attachment damaged + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0416_init_clone1[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x35, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_CLONE1) + endlist +}; + +u8 func0417_clone1[] = { + // Pad is at the cockpit door + run_to_pad(PAD_RIT_0042) + set_returnlist(CHR_SELF, AILIST_CLONE1) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0418_cloner2[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) + reloop(0x03) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_AT_POD, TRUE, /*goto*/ 0x06) + endloop(0x03) + + label(0x06) + + set_chr_team(CHR_SELF, TEAM_04) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) + yield + yield + yield + yield + yield + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) + // These rooms are the attachment area + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0019, /*goto*/ 0x2d) + if_never_been_onscreen(/*goto*/ 0x4f) + if_can_see_target(/*goto*/ 0x08) + label(0x2d) + reloop(0x04) + + // Line of sight to player + label(0x08) + set_ailist(CHR_SELF, AILIST_CLONE2) + + // Chr flag is unset + label(0x4f) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + // @bug? This may have intended to be a bank 1 check because the bank 1 + // flag is unset further below, and cloner3 uses bank 1. + label(0x4f) + if_self_flag_bankx_eq(CHRFLAG0_SQUADALERTANYDIST, TRUE, BANK_0, /*goto*/ 0x2d) + restart_timer + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) + if_timer_gt(3600, /*goto*/ 0x2d) + endloop(0x0b) + + // Player is in UFO area, or interval has passed + label(0x2d) + unset_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE2, 0, /*goto*/ 0x2d) + label(0x2d) + yield + endloop(0x04) + + // UFO attachment damaged + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0419_init_clone2[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x36, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_CLONE2) + endlist +}; + +u8 func041a_clone2[] = { + // Pad is at back of the plane, top floor + run_to_pad(PAD_RIT_005C) + set_returnlist(CHR_SELF, AILIST_CLONE2) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Unlike the other two cloners, this one does not stop once the president has + * reached the escape pod. + */ +u8 func041b_cloner3[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) + endloop(0x03) + + label(0x06) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + set_chr_team(CHR_SELF, TEAM_04) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0019, /*goto*/ 0x2d) + if_never_been_onscreen(/*goto*/ 0x4f) + if_can_see_target(/*goto*/ 0x08) + label(0x2d) + reloop(0x04) + + label(0x08) + set_ailist(CHR_SELF, AILIST_CLONE3) + label(0x4f) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + label(0x4f) + if_self_flag_bankx_eq(CHRFLAG1_NOIDLEANIMS, TRUE, BANK_1, /*goto*/ 0x2d) + restart_timer + + beginloop(0x0b) + if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) + if_timer_gt(3600, /*goto*/ 0x2d) + endloop(0x0b) + + label(0x2d) + unset_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE3, 0, /*goto*/ 0x2d) + label(0x2d) + yield + endloop(0x04) + + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041c_init_clone3[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x37, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_CLONE3) + endlist +}; + +u8 func041d_clone3[] = { + set_target_chr(CHR_BOND) + try_run_to_target(/*goto*/ 0x04) + label(0x04) + yield + set_returnlist(CHR_SELF, AILIST_CLONE3) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func041f_init_blonde[] = { + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_chr_dodge_rating(2, 0) + set_accuracy(24) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(100) + set_recovery_speed(100) + set_shield(0) + set_ailist(CHR_SELF, AILIST_BLONDE) + endlist +}; + +u8 func041e_blonde[] = { + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_accuracy(30) + set_shotlist(AILIST_BLONDE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x2d) + + // Dying + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x54) + if_timer_gt(15, /*goto*/ 0x06) + endloop(0x54) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + // This injured check is pointless + label(0x2d) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x08) + + label(0x06) + label(0x08) + set_self_chrflag(CHRCFLAG_00000040) + label(0x68) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x75) + label(0x06) + kneel + + beginloop(0x75) + label(0x2d) + chr_toggle_p1p2(CHR_P1P2) + set_target_chr(CHR_BOND) + if_target_in_sight(/*goto*/ 0x6a) + if_near_miss(/*goto*/ 0x6b) + label(0x2d) + reloop(0x75) + + label(0x06) + if_target_in_sight(/*goto*/ 0x6a) + label(0x2d) + endloop(0x75) + + label(0x6a) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2d) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + label(0x2d) + goto_next(0x6c) + + // Unreachable + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x6d) + goto_next(0x6e) + + // Reachable from below + beginloop(0x6d) + if_chr_stopped(/*goto*/ 0x6e) + endloop(0x6d) + + label(0x6e) + restart_timer + chr_do_animation(ANIM_RELOAD_0209, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x66) + if_self_flag_bankx_eq(CHRFLAG1_CAN_RELOAD, FALSE, BANK_1, /*goto*/ 0x06) + if_timer_lt(120, /*goto*/ 0x06) + assign_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_7) + play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) + unset_self_flag_bankx(CHRFLAG1_CAN_RELOAD, BANK_1) + label(0x06) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x66) + + label(0x2d) + label(0x06) + goto_first(0x68) + + label(0x6b) + restart_timer + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x6f) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + + label(0x6f) + call_rng + if_target_in_sight(/*goto*/ 0x70) + if_timer_gt(60, /*goto*/ 0x71) + if_rand_lt(4, /*goto*/ 0x71) + goto_first(0x6f) + + label(0x71) + if_can_see_target(/*goto*/ 0x70) + goto_first(0x68) + + label(0x70) + goto_first(0x6a) + + label(0x72) + restart_timer + + beginloop(0x73) + if_can_see_target(/*goto*/ 0x70) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x73) + + label(0x06) + goto_first(0x68) + + label(0x70) + goto_first(0x6a) + + label(0x6c) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) + label(0x06) + goto_first(0x6d) + + label(0x2d) + goto_first(0x6e) + + label(0x76) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x74) + label(0x74) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) + goto_next(0x2d) + label(0x06) + goto_first(0x6d) + + label(0x2d) + goto_first(0x6e) + + endlist +}; + +u8 func0421_trent_waiting[] = { + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_self_chrflag(CHRCFLAG_00000040) + set_shield(500) + set_chr_chrflag(CHR_TRENT, CHRCFLAG_INVINCIBLE) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x06) + endloop(0x04) + + label(0x06) + restart_timer + speak(CHR_TARGET, L_RIT_045, SFX_816F, CHANNEL_6, COLOR_05_GREEN) // "How the hell did you get on board?" + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_ailist(CHR_SELF, AILIST_TRENT_ATTACKING) + endlist +}; + +u8 func0420_trent_attacking[] = { + label(0x03) + stop_chr + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x2d) + set_target_chr(CHR_PRESIDENT) + if_target_in_sight(/*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_ONE_BLONDE_DEAD, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + // One Blonde dead or player in sight + label(0x2d) + set_shield(500) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) + speak(CHR_P1P2, L_RIT_070, MP3_02CB, CHANNEL_6, COLOR_05_GREEN) // "Ha, Ha, Ha, Ha, Ha." + set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) + + // President in sight + label(0x06) + label(0x76) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x74) + label(0x74) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) + goto_next(0x2d) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x09) + goto_first(0x03) + + label(0x2d) + goto_first(0x03) + + label(0x09) + restart_timer + chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + speak(CHR_P1P2, L_RIT_071, MP3_02CA, CHANNEL_6, COLOR_05_GREEN) // "You'll never save him now." + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) + endlist +}; + +u8 func0422_trent_running[] = { + run_to_pad(PAD_RIT_0034) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x06) + set_self_chrflag(CHRCFLAG_HIDDEN) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_alertness(100) + set_returnlist(CHR_SELF, GAILIST_UNALERTED) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func1012_check_blondes_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_BLONDE1, /*goto*/ 0x2d) + if_chr_deadish(CHR_BLONDE2, /*goto*/ 0x06) + reloop(0x04) + + // Blonde 2 dead + label(0x06) + set_stage_flag(STAGEFLAG_ONE_BLONDE_DEAD) + reloop(0x04) + + // Blonde 1 dead + label(0x2d) + set_stage_flag(STAGEFLAG_ONE_BLONDE_DEAD) + if_chr_deadish(CHR_BLONDE2, /*goto*/ 0x2d) + endloop(0x04) + + // Both blondes dead + label(0x2d) + set_stage_flag(STAGEFLAG_BOTH_BLONDES_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_unhide_trent_and_blondes[] = { + yield + disable_chr(CHR_TRENT) + disable_chr(CHR_BLONDE1) + disable_chr(CHR_BLONDE2) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_y(CHR_P1P2, 190, OPERATOR_LESS_THAN, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + enable_chr(CHR_TRENT) + set_ailist(CHR_TRENT, AILIST_TRENT_WAITING) + enable_chr(CHR_BLONDE1) + set_ailist(CHR_BLONDE1, AILIST_INIT_BLONDE) + enable_chr(CHR_BLONDE2) + set_ailist(CHR_BLONDE2, AILIST_INIT_BLONDE) + yield + unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE1, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BLONDE2, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to basically everyone during president conversation. + */ +u8 func0429_be_unalert[] = { + set_shotlist(GAILIST_ALERTED) + set_target_chr(CHR_BOND) + set_alertness(0) + + label(0x03) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) + + beginloop(0x04) + if_chr_stopped(/*goto*/ 0x06) + if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x2d) + endloop(0x04) + + label(0x06) + goto_first(0x03) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Would have given the player one minute before the diguise was uncovered. + * The set_ailist at the start has effectively disabled this function. + */ +u8 func1014_uncover_disguise[] = { + set_ailist(CHR_SELF, GAILIST_IDLE) + restart_timer + + beginloop(0x04) + if_timer_gt(3600, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Assigned to presidential security as well as the two mechanics. + */ +u8 func042a_init_neutral[] = { + yield + + beginloop(0x60) + if_camera_animating(/*goto*/ 0x77) + goto_next(0x06) + + label(0x77) + endloop(0x60) + + label(0x06) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(70) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func042b_reinit_stripes[] = { + set_chr_dodge_rating(2, 0) + set_accuracy(14) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(0) + set_recovery_speed(30) + set_shield(0) + set_chr_team(CHR_SELF, TEAM_04) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_STRIPES) + endlist +}; + +u8 func0407_steward[] = { + set_shotlist(AILIST_STEWARD_SHOT) + + beginloop(0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_chr_idle(/*goto*/ 0x2d) + call_rng + if_rand_lt(32, /*goto*/ 0x0f) + call_rng + if_rand_lt(32, /*goto*/ 0x8a) + if_rand_lt(64, /*goto*/ 0x8b) + if_rand_lt(96, /*goto*/ 0x8c) + if_rand_lt(128, /*goto*/ 0x8d) + if_rand_lt(160, /*goto*/ 0x8e) + if_rand_lt(192, /*goto*/ 0x8f) + if_rand_lt(224, /*goto*/ 0x90) + + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x8a) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x8b) + chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x8c) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x8d) + chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x8e) + chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x8f) + chr_do_animation(ANIM_023A, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x90) + chr_do_animation(ANIM_HEAD_ROLL, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) + goto_next(0x2d) + + label(0x0f) + call_rng + if_rand_lt(86, /*goto*/ 0x60) + if_rand_lt(172, /*goto*/ 0x77) + + if_chr_distance_to_pad_lt(CHR_SELF, 50, PAD_RIT_00C1, /*goto*/ 0x60) + label(0x79) + walk_to_pad(PAD_RIT_00C1) + set_morale(1) + set_padpreset(PAD_RIT_00C2) + goto_next(0x87) + + label(0x60) + if_chr_distance_to_pad_lt(CHR_SELF, 50, PAD_RIT_00C3, /*goto*/ 0x77) + walk_to_pad(PAD_RIT_00C3) + set_morale(2) + set_padpreset(PAD_RIT_00C4) + goto_next(0x87) + + label(0x77) + if_chr_distance_to_pad_lt(CHR_SELF, 50, PAD_RIT_00C1, /*goto*/ 0x78) + set_morale(3) + set_padpreset(PAD_RIT_00C6) + walk_to_pad(PAD_RIT_00C5) + goto_next(0x87) + + label(0x78) + goto_first(0x79) + + beginloop(0x87) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_in_sight(/*goto*/ 0x89) + if_saw_injury(0x00, /*goto*/ 0x89) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x87) + + label(0x06) + try_face_entity(ATTACKFLAG_AIMATPAD, PAD_PRESET, /*goto*/ 0x88) + + beginloop(0x88) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x88) + + label(0x06) + reloop(0x03) + + chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + label(0x2d) + if_target_in_sight(/*goto*/ 0x89) + if_saw_injury(0x00, /*goto*/ 0x89) + endloop(0x03) + + // Detected player + label(0x89) + set_alertness(100) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + increase_squadron_alertness(100) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) + do_preset_animation(PRESETANIM_TALKRANDOM) + restart_timer + speak(CHR_P1P2, L_RIT_043, MP3_02BB, CHANNEL_4, COLOR_04_ORANGE) // "Hey, that's not..." + + beginloop(0x08) + if_timer_gt(35, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + mute_channel(CHANNEL_4) + set_ailist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0425_steward_shot[] = { + mute_channel(CHANNEL_4) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func0408_stewardess[] = { + set_chr_maxdamage(CHR_SELF, 0) + set_shotlist(AILIST_STEWARDESS) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x03) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Wait until alerted + beginloop(0x03) + if_chr_idle(/*goto*/ 0x2d) + chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + label(0x2d) + if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x2d) + if_saw_injury(0x00, /*goto*/ 0x2d) + if_chr_deadish(CHR_STEWARD, /*goto*/ 0x2d) + endloop(0x03) + + // Alerted + label(0x2d) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) + chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x2d) + goto_next(0x0a) + + label(0x2d) + try_run_to_chr(CHR_PRESET, /*goto*/ 0x7f) + + beginloop(0x7f) + if_detected_chr(CHR_PRESET, /*goto*/ 0x80) + if_chr_stopped(/*goto*/ 0x80) + endloop(0x7f) + + label(0x80) + play_sound(MP3_02DC, CHANNEL_7) + increase_squadron_alertness(100) + + label(0x0a) + set_self_chrflag(CHRCFLAG_PUSHABLE) + chr_do_animation(ANIM_COWER_0229, -1, 190, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + beginloop(0x83) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x83) + + label(0x2d) + goto_first(0x0a) + + endlist +}; + +u8 func1015_msg_retrievetheevidence[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + speak(CHR_BOND, L_RIT_046, MP3_03C8, CHANNEL_6, COLOR_09_BLUE) // "Now, let's retrieve the evidence." + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_msg_onthislevel[] = { + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 440, OPERATOR_LESS_THAN, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x06) + endloop(0x04) + + label(0x2d) + set_target_chr(CHR_PRESET) + speak(CHR_TARGET, L_RIT_047, SFX_8185, CHANNEL_6, COLOR_09_BLUE) // "The President's room is on this level, Joanna." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_msg_gettothecockpit[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x0e) + if_stage_flag_eq(STAGEFLAG_PILOTS_DEAD, TRUE, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PLANE_NOSEDIVING, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x0e) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + speak(CHR_BOND, L_RIT_048, SFX_8186, CHANNEL_5, COLOR_09_BLUE) // "Something's wrong... You have to get to the cockpi..." + + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_msg_maybeamine[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x0e) + chr_toggle_p1p2(CHR_SELF) + if_objective_complete(2, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + speak(CHR_P1P2, L_RIT_049, MP3_03CB, CHANNEL_6, COLOR_09_BLUE) // "Maybe a mine will detach the UFO." + + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c02_outro_from_menu[] = { + set_ailist(CHR_ELVIS, GAILIST_IDLE) + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func0423_outro[] = { + configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) + set_target_chr(CHR_BOND) + goto_next(0x06) + label(0x2d) + set_target_chr(CHR_COOP) + label(0x06) + camera_movement(ANIM_CUT_RIT_OUTRO_CAM) + play_cutscene_track(MUSIC_AIRFORCEONE_OUTRO) + configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + set_ailist(CHR_TARGET, GAILIST_IDLE) + set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) + set_chr_hudpiece_visible(CHR_TARGET, TRUE) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_RIT_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + enable_object(0x19) + set_object_flag2(0x19, OBJFLAG2_04000000) + set_object_flag3(0x19, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_RIT_OUTRO_SKSHUTTLE, 0x19, 0x04, 0xffff) + enable_object(0x1a) + set_object_flag2(0x1a, OBJFLAG2_04000000) + set_object_flag3(0x1a, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_RIT_OUTRO_UFOEXTERIOR, 0x1a, 0x04, 0xffff) + enable_object(0x23) + set_object_flag2(0x23, OBJFLAG2_04000000) + set_object_flag3(0x23, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_RIT_OUTRO_UFOINTERIOR, 0x23, 0x04, 0xffff) + enable_object(0x37) + set_object_flag2(0x37, OBJFLAG2_04000000) + set_object_flag3(0x37, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_RIT_OUTRO_PLANE, 0x37, 0x04, 0xffff) + restart_timer + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + show_nonessential_chrs(FALSE) + label(0x60) + yield + if_controller_button_pressed(/*goto*/ 0x5f) + if_timer_gt(20, /*goto*/ 0x06) + goto_first(0x60) + + label(0x06) + speak(CHR_BOND, L_RIT_079, MP3_0452, CHANNEL_7, COLOR_09_BLUE) // "Elvis! Elvis! I can't detach that tube from the fu..." + + #define outro_wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x5f) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + outro_wait_until(426, 0x77) + speak(CHR_BOND, L_RIT_080, MP3_0453, CHANNEL_7, COLOR_06_WHITE) // "Piece of cake, Joanna. Watch this!" + + outro_wait_until(1045, 0x65) + play_sound(SFX_0063, CHANNEL_10) + + outro_wait_until(1050, 0x78) + speak(CHR_BOND, L_RIT_081, MP3_0454, CHANNEL_7, COLOR_06_WHITE) // "Uh-oh." + emit_sparks(0x23) + + outro_wait_until(1112, 0x79) + speak(CHR_BOND, L_RIT_082, MP3_0455, CHANNEL_7, COLOR_09_BLUE) // "Watch what? Will you stop playing around and shoot..." + + outro_wait_until(1380, 0x7a) + speak(CHR_BOND, L_RIT_083, MP3_0456, CHANNEL_7, COLOR_06_WHITE) // "Out of options... Joanna, brace yourself for impac..." + + outro_wait_until(1950, 0x7b) + + outro_wait_until(1951, 0x62) + destroy_object(0x1a) + + outro_wait_until(1958, 0x63) + destroy_object(0x1a) + + outro_wait_until(1970, 0x64) + destroy_object(0x1a) + destroy_object(0x19) + + outro_wait_until(1985, 0x8e) + destroy_object(0x1a) + + outro_wait_until(2000, 0x8a) + destroy_object(0x1a) + + outro_wait_until(2015, 0x8b) + destroy_object(0x1a) + + outro_wait_until(2030, 0x8c) + destroy_object(0x1a) + + outro_wait_until(2045, 0x8d) + destroy_object(0x1a) + + outro_wait_until(2060, 0x8f) + destroy_object(0x1a) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x5f) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x5f) + label(0x2d) + endloop(0x08) + + label(0x5f) + mute_channel(CHANNEL_10) + label(0x06) + stop_cutscene_track + configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) + disable_object(0x19) + disable_object(0x1a) + set_chr_hudpiece_visible(CHR_TARGET, FALSE) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1019_midcutscene[] = { + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MIDCUTSCENE, TRUE, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_STARTED, TRUE, /*goto*/ 0x2d) + set_stage_flag(STAGEFLAG_MIDCUTSCENE_STARTED) + play_cutscene_track(MUSIC_AIRFORCEONE_MIDCUTSCENE) + label(0x2d) + camera_movement(ANIM_CUT_RIT_MID_CAM) + + enable_object(0x19) + set_object_flag2(0x19, OBJFLAG2_04000000) + set_object_flag3(0x19, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_RIT_MID_SKSHUTTLE, 0x19, 0x04, 0xffff) + object_set_modelpart_visible(0x19, MODELPART_SKSHUTTLE_GANGWAY, TRUE) + + enable_object(0x37) + set_object_flag2(0x37, OBJFLAG2_04000000) + set_object_flag3(0x37, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_RIT_MID_PLANE, 0x37, 0x04, 0xffff) + + restart_timer + + outro_wait_until(1086, 0x61) + play_sound(SFX_DOOR_042C, -1) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x5f) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x5f) + label(0x2d) + endloop(0x09) + + label(0x5f) + disable_object(0x37) + disable_object(0x19) + label(0x06) + set_stage_flag(STAGEFLAG_MIDCUTSCENE_FINISHED) + stop_cutscene_track + stop_ambient_track + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_END_CINEMA) + endlist +}; + +u8 func1019_midcutscene_from_menu[] = { + set_stage_flag(STAGEFLAG_TRIGGER_MIDCUTSCENE) + set_ailist(CHR_SELF, AILIST_MIDCUTSCENE) + endlist +}; + +u8 func101a_equipment_switch[] = { + set_object_flag(0x1b, OBJFLAG_DEACTIVATED) + set_object_image(OBJ_EQUIPMENT_SWITCH, 0, TVCMDLIST_12) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_EQUIPMENT_SWITCH, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2d) + + restart_timer + show_hudmsg(CHR_P1P2, L_RIT_063) // "Access denied - lift key card required." + + beginloop(0x77) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x77) + + label(0x06) + endloop(0x04) + + // Switch activated with keycard + label(0x2d) + set_object_image(OBJ_EQUIPMENT_SWITCH, 0, TVCMDLIST_13) + set_stage_flag(STAGEFLAG_EQUIPMENT_RAISED) + open_door(0x1c) + show_hudmsg(CHR_P1P2, L_RIT_061) // "Cargo bay has been raised." + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_EQUIPMENT_SWITCH, TRUE) + unset_object_flag(0x1b, OBJFLAG_DEACTIVATED) + yield + yield + yield + yield + yield + yield + restart_timer + + beginloop(0x08) + if_lift_stationary(0x1b, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_object_flag(0x1b, OBJFLAG_DEACTIVATED) + set_object_image(OBJ_EQUIPMENT_SWITCH, 0, TVCMDLIST_12) + + beginloop(0x09) + if_door_state(0x1c, DOORSTATE_CLOSING, /*goto*/ 0x2d) + reloop(0x09) + + label(0x2d) + open_door(0x1c) + endloop(0x09) + + endlist +}; + +u8 func101b_hoverbike_switch[] = { + unset_savefile_flag(GAMEFILEFLAG_CRASHSITE_BIKE) + set_object_flag(0x1f, OBJFLAG_DEACTIVATED) + set_object_image(OBJ_HOVERBIKE_SWITCH, 0, TVCMDLIST_12) + label(0x08) + open_door(0x20) + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + if_door_state(0x20, DOORSTATE_CLOSING, /*goto*/ 0x2d) + if_chr_activated_object(CHR_P1P2, OBJ_HOVERBIKE_SWITCH, /*goto*/ 0x0a) + reloop(0x09) + + label(0x2d) + open_door(0x20) + reloop(0x09) + + label(0x0a) + if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2d) + restart_timer + show_hudmsg(CHR_P1P2, L_RIT_063) // "Access denied - lift key card required." + + beginloop(0x77) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x77) + + label(0x06) + endloop(0x09) + + // Activated with keycard + label(0x2d) + set_object_image(OBJ_HOVERBIKE_SWITCH, 0, TVCMDLIST_13) + show_hudmsg(CHR_P1P2, L_RIT_060) // "Cargo bay has been lowered." + set_savefile_flag(GAMEFILEFLAG_CRASHSITE_BIKE) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_HOVERBIKE_SWITCH, TRUE) + unset_object_flag(0x1f, OBJFLAG_DEACTIVATED) + restart_timer + + beginloop(0x0c) + if_timer_gt(2, /*goto*/ 0x2d) + endloop(0x0c) + + label(0x2d) + close_door(0x20) + + beginloop(0x0b) + if_lift_stationary(0x1f, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + set_object_flag(0x1f, OBJFLAG_DEACTIVATED) + set_object_image(OBJ_HOVERBIKE_SWITCH, 0, TVCMDLIST_12) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_check_equipment_switch_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_EQUIPMENT_SWITCH, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + endloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_EQUIPMENT_RAISED, TRUE, /*goto*/ 0x2d) + set_stage_flag(STAGEFLAG_EQUIPMENT_SWITCH_DESTROYED) + show_hudmsg(CHR_BOND, L_RIT_062) // "Mission critical object has been destroyed." + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_init_defend_pad[] = { + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_ANTINONINTERACTABLE) + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + set_target_chr(-1) + label(0x04) + try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0x2d) + label(0x2d) + set_ailist(CHR_SELF, AILIST_DEFEND_PAD) + endlist +}; + +u8 func040e_unused[] = { + label(0x04) + try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0x2d) + label(0x2d) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +/** + * Unused. + */ +u8 func040d_init_defend_president[] = { + label(0x04) + try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0x2d) + label(0x2d) + set_ailist(CHR_SELF, AILIST_DEFEND_PRESIDENT) + endlist +}; + +#if VERSION < VERSION_NTSC_1_0 +/** + * This is unused in ntsc-beta, and deleted in newer versions. + */ +u8 unregistered_function2[] = { + beginloop(0x04) + // Wait until player is in the dumbwaiter shaft near the UFO attachment + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x001a, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_lift_stationary(0x05, /*goto*/ 0x06) + reloop(0x04) + + // Disable the lift and wait 2 seconds + label(0x06) + set_object_flag(0x05, OBJFLAG_DEACTIVATED) + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0e) + + // Check that the player is still on the lift + label(0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x001a, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_lift_stationary(0x05, /*goto*/ 0x06) + reloop(0x04) + + // Check that the door is closing + label(0x06) + if_door_state(0x2b, DOORSTATE_CLOSED | DOORSTATE_CLOSING, /*goto*/ 0x2d) + reloop(0x04) + + // Start the lift + label(0x2d) + play_sound(SFX_043A, CHANNEL_7) + unset_object_flag(0x05, OBJFLAG_DEACTIVATED) + yield + yield + yield + + // Wait until lift has stopped, then disable it and wait 3 seconds + beginloop(0x08) + if_lift_stationary(0x05, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_object_flag(0x05, OBJFLAG_DEACTIVATED) + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x09) + + // Enable the lift again and wait for it to start moving + // ...presumably without the player on it + label(0x2d) + unset_object_flag(0x05, OBJFLAG_DEACTIVATED) + yield + yield + yield + + beginloop(0x0a) + if_lift_stationary(0x05, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x06) + endloop(0x0a) + + // Wait for the lift to arrive at its original position + label(0x2d) + yield + yield + yield + + beginloop(0x0b) + if_lift_stationary(0x05, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + endloop(0x04) + + endlist +}; +#endif + +u8 func042c_remove_if_offscreen[] = { + unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_ANTINONINTERACTABLE) + set_chr_team(CHR_SELF, TEAM_ALLY) + rebuild_teams + rebuild_squadrons + set_chr_maxdamage(CHR_SELF, 0) + + label(0x04) + yield + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x06) + label(0x08) + chr_drop_weapon(CHR_SELF) + remove_chr(CHR_SELF) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_ailist(CHR_SELF, AILIST_INIT_DEFEND_PAD) + endlist +}; + +/** + * If president dies between mid cutscene and Jo's "we have to get you to the + * escape pod" line, set the flag that causes things to happen. + * + * This was most likely added after QA, hence why the original function wasn't + * changed instead. + */ +u8 func101d_handle_early_president_death[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + disable_object(OBJ_EXTERIOR_DOOR) + unset_object_flag2(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG2_INVISIBLE) + set_object_flag(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG_00000100) + + beginloop(0x08) + if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + set_stage_flag(STAGEFLAG_PRESIDENT_STARTED_RUNNING) + unlock_door(OBJ_COCKPITDOOR, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_check_pod_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_ESCAPE_POD, /*goto*/ 0x2d) + show_hudmsg(CHR_BOND, L_RIT_062) // "Mission critical object has been destroyed." + set_stage_flag(STAGEFLAG_POD_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func101f_setup_rtracker[] = { + yield + set_object_flag3(0x38, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(0x39, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1420_setup_environment[] = { + yield + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_pilots_stabilizing[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_PLANE_NOSEDIVING, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x93) + if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2e) + if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2e) + if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2e) + goto_next(0x06) + + label(0x2e) + if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x0e) + if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x0e) + if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x0e) + + // Pilots stabilizing + label(0x06) + if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x0e) + if_timer_gt(1200, /*goto*/ 0x06) + endloop(0x93) + + label(0x06) + show_hudmsg(CHR_BOND, L_RIT_084) // "The pilots have stabilized Air Force One." + set_stage_flag(STAGEFLAG_PLANE_STABILIZED) + + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1023_check_pilots_dead[] = { + beginloop(0x04) + if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x2d) + if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + set_stage_flag(STAGEFLAG_PILOTS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Wait until intro finished, then wait several frames before unsetting a flag + * on Joanna. + * + * When the flag is set, the co-op buddy will attempt to warp to Jo. This is + * needed because Jo can start in two locations in this level, but the buddy + * only starts in one location. + * + * The flag must be unset so the buddy stops attempting to warp. + */ +u8 func1025_disable_buddy_warp[] = { + yield + + beginloop(0x04) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + endloop(0x04) + + label(0x06) + yield + yield + yield + yield + yield + yield + yield + unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1026_buddy_floor_hatch[] = { + yield + + beginloop(0x93) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x04) + + label(0x2d) + endloop(0x93) + + // This flag is set by a global function + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_AI_BUDDY_EXISTS, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + // Maybe the AI has difficulty opening the floor hatch so they removed it? + label(0x2d) + disable_object(OBJ_FLOORHATCH) + set_object_flag(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG_00000100) + unset_object_flag2(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_rebuild_groups, 0x1003 }, + { func1004_reassign_ailists_during_conversation, 0x1004 }, + { func1005_check_neutrals_killed, 0x1005 }, + { func1006_hijack, 0x1006 }, + { func1007_check_pod_destroyed, 0x1007 }, + { func1008_check_mine_wasted_bond, 0x1008 }, + { func1009_check_end_level, 0x1009 }, + { func100a_autopilot_switch, 0x100a }, + { func100b_check_president_dead, 0x100b }, + { func100c_cockpit, 0x100c }, + { func1010_dumbwaiter1, 0x1010 }, + { func1011_dumbwaiter2, 0x1011 }, + { func1012_check_blondes_dead, 0x1012 }, + { func1013_unhide_trent_and_blondes, 0x1013 }, + { func1014_uncover_disguise, 0x1014 }, + { func1015_msg_retrievetheevidence, 0x1015 }, + { func1016_msg_onthislevel, 0x1016 }, + { func1017_msg_gettothecockpit, 0x1017 }, + { func1018_msg_maybeamine, 0x1018 }, + { func1019_midcutscene, 0x1019 }, + { func101a_equipment_switch, 0x101a }, + { func101b_hoverbike_switch, 0x101b }, + { func101c_check_equipment_switch_destroyed, 0x101c }, + { func101d_handle_early_president_death, 0x101d }, + { func101e_blow_mines, 0x101e }, + { func101f_setup_rtracker, 0x101f }, + { func1420_setup_environment, 0x1420 }, + { func1021_check_mine_wasted_coop, 0x1021 }, + { func1022_pilots_stabilizing, 0x1022 }, + { func1023_check_pilots_dead, 0x1023 }, + { func1024_give_objects, 0x1024 }, + { func1025_disable_buddy_warp, 0x1025 }, + { func1026_buddy_floor_hatch, 0x1026 }, + { func1002_intro, 0x0c00 }, + { func1019_midcutscene_from_menu, 0x0c01 }, + { func0c02_outro_from_menu, 0x0c02 }, + { func0401_init_stripes, 0x0401 }, + { func0402_init_elvis, 0x0402 }, + { func0403_stripes, 0x0403 }, + { func0404_president_running, 0x0404 }, + { func0405_president_in_room, 0x0405 }, + { func0406_init_president, 0x0406 }, + { func0407_steward, 0x0407 }, + { func0408_stewardess, 0x0408 }, + { func1019_midcutscene, 0x0424 }, + { func0409_unused, 0x0409 }, + { func040a_defend_pad, 0x040a }, + { func040b_defend_president, 0x040b }, + { func040c_init_defend_pad, 0x040c }, + { func040d_init_defend_president, 0x040d }, + { func040e_unused, 0x040e }, + { func0413_taker, 0x0413 }, + { func100c_cockpit_stripes, 0x0414 }, + { func040f_taker1, 0x040f }, + { func0410_taker2, 0x0410 }, + { func0411_typing_guy, 0x0411 }, + { func0412_sitting_guy, 0x0412 }, + { func0426_start_path00, 0x0426 }, + { func0427_start_path01, 0x0427 }, + { func0428_start_path02, 0x0428 }, + { func0429_be_unalert, 0x0429 }, + { func042a_init_neutral, 0x042a }, + { func042b_reinit_stripes, 0x042b }, + { func042c_remove_if_offscreen, 0x042c }, + { func0415_cloner1, 0x0415 }, + { func0416_init_clone1, 0x0416 }, + { func0417_clone1, 0x0417 }, + { func0418_cloner2, 0x0418 }, + { func0419_init_clone2, 0x0419 }, + { func041a_clone2, 0x041a }, + { func041b_cloner3, 0x041b }, + { func041c_init_clone3, 0x041c }, + { func041d_clone3, 0x041d }, + { func041e_blonde, 0x041e }, + { func041f_init_blonde, 0x041f }, + { func0420_trent_attacking, 0x0420 }, + { func0421_trent_waiting, 0x0421 }, + { func0422_trent_running, 0x0422 }, + { func0423_outro, 0x0423 }, + { func0425_steward_shot, 0x0425 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setuprun.c b/src/ailists/setuprun.c new file mode 100644 index 000000000..11ceafdf9 --- /dev/null +++ b/src/ailists/setuprun.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x23 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupsev.c b/src/ailists/setupsev.c new file mode 100644 index 000000000..681e3f296 --- /dev/null +++ b/src/ailists/setupsev.c @@ -0,0 +1,1967 @@ +// +// Maian SOS +// + +#include "stagesetup.h" + +// Characters +#define CHR_LABTECH1 0x44 +#define CHR_LABTECH2 0x45 +#define CHR_OUTRO_GUARD 0x56 + +// Objects +#define OBJ_EXPERIMENT 0x2f +#define OBJ_CONSOLE 0x45 +#define OBJ_GLASS1 0x4a +#define OBJ_GLASS2 0x4b +#define OBJ_GLASS3 0x4c +#define OBJ_TROLLEY 0x4d +#define OBJ_PSYCHOSISGUN 0x4e + +// Stage flags +#define STAGEFLAG_EXPERIMENT_DESTROYED 0x00000100 +#define STAGEFLAG_SAUCER_DESTROYED 0x00000200 +#define STAGEFLAG_CONSOLE_ACTIVATED 0x00000400 +#define STAGEFLAG_ALARM_SOUNDED 0x00000800 +#define STAGEFLAG_CONSOLE_DESTROYED 0x00001000 +#define STAGEFLAG_TRAPPED_AT_START 0x00002000 +#define STAGEFLAG_GOT_FALCON2 0x00004000 + +// AI Lists +#define AILIST_CLONE_SPAWNER 0x0410 +#define AILIST_INIT_CLONE 0x0411 +#define AILIST_CLONE 0x0412 +#define AILIST_CLONE_SPAWNER2 0x0413 +#define AILIST_UNLOAD 0x0414 +#define AILIST_INIT_50HP_GUARD 0x0415 +#define AILIST_INIT_80HP_GUARD 0x0416 +#define AILIST_INIT_LX_GUARD 0x0417 +#define AILIST_INIT_OUTRO_GUARD 0x0419 +#define AILIST_OUTRO 0x041b +#define AILIST_INIT_LABTECH 0x041c + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_SEV_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_SEV_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_SEV_002) + briefing(BRIEFINGTYPE_TEXT_A, L_SEV_003) + + beginobjective(0, L_SEV_004, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Sabotage enemy medical experiment" + complete_flags(STAGEFLAG_EXPERIMENT_DESTROYED) + endobjective + + beginobjective(1, L_SEV_005, (DIFFBIT_PA | DIFFBIT_PD)) // "Destroy captured Maian saucer" + complete_flags(STAGEFLAG_SAUCER_DESTROYED) + endobjective + + beginobjective(2, L_SEV_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Activate distress signal" + complete_flags(STAGEFLAG_CONSOLE_ACTIVATED) + fail_flags(STAGEFLAG_CONSOLE_DESTROYED) + fail_flags(STAGEFLAG_TRAPPED_AT_START) + endobjective + + chr(SPAWNFLAG_FIXEDHEIGHT, CHR_LABTECH1, PAD_SEV_03DC, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 4, 0, 0) + + chr(SPAWNFLAG_FIXEDHEIGHT, CHR_LABTECH2, PAD_SEV_012D, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_LABTECH, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2, CHR_LABTECH2, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FALCON2) + + chr(SPAWNFLAG_00000200, 0x00, PAD_SEV_0128, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x01, PAD_SEV_0126, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x02, PAD_SEV_0399, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, 0x3f, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x03, PAD_SEV_039A, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 2000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_02, 0x40, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x04, PAD_SEV_0393, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x07, PAD_SEV_0394, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x08, PAD_SEV_0395, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x09, PAD_SEV_0115, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x0b, PAD_SEV_013A, BODY_AREA51GUARD, HEAD_KEN, AILIST_INIT_LX_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357TRENT, 0x000b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_WEAPON_40000000, 0, 0, WEAPON_DY357LX) + weapon(0x0100, MODEL_CHRDY357TRENT, 0x000b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED | OBJFLAG_WEAPON_40000000, 0, 0, WEAPON_DY357LX) + + link_guns(-1, -2) + chr(SPAWNFLAG_00000200, 0x0c, PAD_SEV_013D, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x0f, PAD_SEV_010D, BODY_AREA51GUARD, HEAD_RANDOM, 0x0407, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x10, PAD_SEV_0100, BODY_AREA51GUARD, HEAD_RANDOM, 0x0408, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x11, PAD_SEV_03BF, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 100, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x12, PAD_SEV_03C0, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 100, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x13, PAD_SEV_03B1, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x14, PAD_SEV_03B2, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x15, PAD_SEV_03C9, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, 0x03c8, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 4, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0015, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x16, PAD_SEV_03B3, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, 0x03c9, -1, 1000, 100, CHRFLAG0_GP1 | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 4, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0016, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_TRANQUILIZER) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0016, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_PSYCHOSISGUN) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x17, PAD_SEV_039E, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, 0x41, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x18, PAD_SEV_039B, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, 0x42, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x19, PAD_SEV_039D, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, 0x43, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x1a, PAD_SEV_039C, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0A, 0x44, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x46, PAD_SEV_03C2, BODY_LABTECH, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0046, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0046, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_PSYCHOSISGUN) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x47, PAD_SEV_011C, BODY_LABTECH, HEAD_RANDOM, GAILIST_UNALERTED, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION | CHRFLAG1_CAN_DRAW_PISTOL, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 4, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0047, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0047, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_PSYCHOSISGUN) + + chr(SPAWNFLAG_00000200, 0x1b, PAD_SEV_00DB, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x1c, PAD_SEV_00CA, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x1d, PAD_SEV_00C7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x1e, PAD_SEV_03E4, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x1f, PAD_SEV_03E5, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x20, PAD_SEV_03E6, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0020, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x21, PAD_SEV_03E7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_80HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x22, PAD_SEV_039F, BODY_A51AIRMAN, HEAD_RANDOM, 0x0401, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x23, PAD_SEV_03A2, BODY_A51AIRMAN, HEAD_RANDOM, 0x0402, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0023, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x24, PAD_SEV_03A3, BODY_A51AIRMAN, HEAD_RANDOM, 0x0403, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0024, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x25, PAD_SEV_03A4, BODY_A51AIRMAN, HEAD_RANDOM, 0x0404, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0025, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x26, PAD_SEV_03A5, BODY_A51AIRMAN, HEAD_RANDOM, 0x0405, -1, -1, 1000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x27, PAD_SEV_0386, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 2000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0027, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x28, PAD_SEV_0387, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 2000, 100, CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x29, PAD_SEV_03A7, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0029, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x2a, PAD_SEV_03A6, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x2b, PAD_SEV_03A8, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x2c, PAD_SEV_03CB, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_AIVSAI | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x2d, PAD_SEV_035D, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x2e, PAD_SEV_0362, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x002e, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x2f, PAD_SEV_035C, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_THROWGRENADEFIRST | CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x30, PAD_SEV_035E, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_ALLOWSOFTCOVER, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0030, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x31, PAD_SEV_035F, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_CAN_SNIPE, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x32, PAD_SEV_0361, BODY_A51AIRMAN, HEAD_RANDOM, 0x0406, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0032, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x33, PAD_SEV_0360, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x34, PAD_SEV_038C, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x35, PAD_SEV_038D, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0035, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x36, PAD_SEV_038E, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0036, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, 0x37, PAD_SEV_038F, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0037, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + + chr(SPAWNFLAG_00000200, 0x38, PAD_SEV_0390, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0038, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + + chr(SPAWNFLAG_00000200, 0x39, PAD_SEV_0391, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0039, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + + chr(SPAWNFLAG_00000200, 0x3a, PAD_SEV_0392, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_50HP_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x003a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + + chr(0, 0x4e, PAD_SEV_0118, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_CLONE_SPAWNER, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x004e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(0, 0x4f, PAD_SEV_0212, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_CLONE_SPAWNER, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x004f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(0, 0x50, PAD_SEV_00F3, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_CLONE_SPAWNER, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0050, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(0, 0x51, PAD_SEV_01A8, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_CLONE_SPAWNER2, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0051, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(0, 0x52, PAD_SEV_01A2, BODY_A51AIRMAN, HEAD_RANDOM, AILIST_CLONE_SPAWNER2, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CANLOSEGUN, CHRFLAG1_NOHANDCOMBAT | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRAGON, 0x0052, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DRAGON) + + chr(SPAWNFLAG_00000200, CHR_OUTRO_GUARD, PAD_SEV_01A3, BODY_LABTECH, HEAD_RANDOM, AILIST_INIT_OUTRO_GUARD, -1, -1, 1000, 20, CHRFLAG0_AIVSAI | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_NONCOMBAT, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0056, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + + tag(OBJ_TROLLEY, 1) + hover_prop(0x0100, MODEL_A51TROLLEY, PAD_SEV_03BD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_BULLETPROOF, OBJFLAG3_PUSHABLE | OBJFLAG3_PUSHFREELY, 1000, 0x00010000) + tag(OBJ_EXPERIMENT, 1) + hover_prop(0x0100, MODEL_HOVERBED, PAD_SEV_03C3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_BULLETPROOF, OBJFLAG3_HOVERBEDSHIELD, 1000, 0x00010000) + tag(0x3e, 1) + stdobject(0x0100, MODEL_ELVIS_SAUCER, PAD_SEV_0396, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR, OBJFLAG2_REMOVEWHENDESTROYED, 0, 12000) + door_scale(0x00008000) + tag(0x35, 1) +#if VERSION >= VERSION_NTSC_1_0 + lift(0x0100, MODEL_A51_LIFT_STORE, PAD_SEV_0334, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0334, 0x0335, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x20000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000e666, 0x00010000, 0x00000888, 0x00000888, 0x00000147, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000e666, 0x00010000, 0x00000888, 0x00000888, 0x00000147, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) +#else + lift(0x0100, MODEL_A51_LIFT_STORE, PAD_SEV_0334, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0334, 0x0335, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x15000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00000888, 0x00000888, 0x00000147, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00000888, 0x00000888, 0x00000147, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) +#endif + lift_door(-2, -3, 0) + lift_door(-2, -4, 1) + tag(0x39, 1) +#if VERSION >= VERSION_NTSC_1_0 + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_SEV_0336, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0336, 0x0337, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x20000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) +#else + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_SEV_0336, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0336, 0x0337, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x15000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_SEV_02E3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) +#endif + lift_door(-2, -3, 0) + lift_door(-2, -4, 1) + door_scale(0x00010000) + tag(0x03, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_0428, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x02, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_0427, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x01, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_0429, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x04, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_0426, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x3c, 2) + tag(0x3d, 2) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_03C6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_03C7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_027F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_027E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_027D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_027C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_027A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_027B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0278, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0279, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0277, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0276, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0274, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000002, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0275, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000002, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0273, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0272, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0270, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0271, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_026F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_026E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_026C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_026D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_026B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_026A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0268, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0269, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0266, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0267, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x2b, 4) + tag(0x2c, 4) + tag(0x2d, 4) + tag(0x2e, 4) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02AA, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02AB, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02AC, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02AD, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x07, 2) + tag(0x08, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0280, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0281, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x09, 2) + tag(0x0a, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02B7, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02B8, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0b, 2) + tag(0x0c, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02B9, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02BA, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0d, 2) + tag(0x0e, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02BB, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02BC, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0283, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0282, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0284, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_0285, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_028B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_028A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_SEV_0286, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0287, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_SEV_0289, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_0288, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02A4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02A5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000001, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_SECRET, PAD_SEV_028E, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x0000d555, 0x0000d555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000001, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_0292, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_0293, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_0294, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_0295, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_0299, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_0298, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0f, 1) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_SEV_02A8, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02A7, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_029A, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_029B, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_029C, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_029D, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x13, 1) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_029E, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_029F, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x30, 3) + tag(0x31, 3) + tag(0x11, 1) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_02A1, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_02A0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_028C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_028D, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_02AE, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_028F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x12, 1) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_0290, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_0291, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_02A2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000a666, 0x0000a666, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_02A3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000a666, 0x0000a666, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51GATE_L, PAD_SEV_02B5, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00001800) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_A51GATE_R, PAD_SEV_02B6, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_A51GATE_R, PAD_SEV_02B6, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00001800) +#endif + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02E5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SEV_02E6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_02E7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SEV_02E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_02EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02EB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SEV_02EC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_02ED, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02EE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SEV_02EF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_02F0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02F1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SEV_02F2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_02F3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02F4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SEV_02F5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_02F6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_02F7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + blocked_path(2, 0x0111, 0x01bb) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_A51_UNEXP1, PAD_SEV_0422, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + stdobject(0x0100, MODEL_A51_EXP1, PAD_SEV_0421, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x18, -2) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0475, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x46, 6) + tag(0x47, 6) + tag(0x48, 8) + tag(0x49, 8) + tag(0x38, 1) + lift(0x0100, MODEL_A51_LIFT_CONTROL, PAD_SEV_032A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x032a, 0x032b, -1, -1, 0x00000001, 0x00000005, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_0330, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_0331, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000300) + lift_door(-2, -3, 1) + lift_door(-2, -4, 1) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_0332, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_0333, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000300) + lift_door(-2, -7, 2) + lift_door(-2, -8, 2) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_032E, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000002, 0x0000012c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_032F, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x0000e666, 0x00008e38, 0x00008e38, 0x00000444, 0, DOORTYPE_SLIDING, 0x00000002, 0x0000012c, 0x00000000, 0xffffffff, 0x00000000) +#endif + tag(0x14, 2) + tag(0x15, 2) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_02B3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_SEV_02B4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000300) + tag(0x33, 2) + tag(0x34, 2) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_SEV_02AF, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_SEV_02B0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_SEV_0321, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_SEV_0327, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_SEV_0320, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_SEV_0326, OBJFLAG_DEACTIVATED, OBJFLAG2_INTERACTCHECKLOS | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00001900) +#endif + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02B2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02B1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x17, 1) + hover_prop(0x00eb, MODEL_HOVERCRATE1, PAD_SEV_01C7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE, 1000, 0x02010000) + stdobject(0x0100, MODEL_A51BOARD, PAD_SEV_03C4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02BD, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02BE, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02BF, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02C0, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02C1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02C2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_SEV_02C3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02C4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + glass(0x0100, MODEL_MEDLABWIN1, PAD_SEV_0436, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_SEV_0437, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_SEV_0438, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + tag(OBJ_GLASS1, 3) + tag(OBJ_GLASS2, 3) + tag(OBJ_GLASS3, 3) + glass(0x0100, MODEL_MEDLABWIN1, PAD_SEV_0439, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_SEV_043A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_SEV_043B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_0446, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x0096012c) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_0445, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000, 0x0096012c) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_043D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_043E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_043F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_0440, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_0441, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_SEV_0442, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x04b007d0) + tag(0x19, 1) + autogun(0x00c0, MODEL_ROOFGUN, PAD_SEV_0405, OBJFLAG_00000004, 0, 0, 1000, 0x0108, 0x00004000, 0xffffc000, 0x000000da, 0x00140000) + tag(0x1a, 2) + tag(0x22, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_033C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033c, 0x033d, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_045C, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x1c, 2) + tag(0x24, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_0340, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0340, 0x0341, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_0459, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x1e, 2) + tag(0x26, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_0344, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0344, 0x0345, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_045A, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x20, 2) + tag(0x28, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_0348, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0348, 0x0349, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_045B, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x1b, 2) + tag(0x23, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_033F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033f, 0x033e, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_045E, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x1d, 2) + tag(0x25, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_0343, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0343, 0x0342, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_045F, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x1f, 2) + tag(0x27, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_0347, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0347, 0x0346, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_0460, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x21, 2) + tag(0x29, 2) + lift(0x0100, MODEL_CHAMBER, PAD_SEV_034B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x034b, 0x034a, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_SEV_045D, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 18) + tag(0x32, 1) + stdobject(0x0100, MODEL_A51_CRATE1, -1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0461, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0462, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0463, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0464, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0465, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0466, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0467, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0468, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0469, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_046A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_046B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_046C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_046D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_046E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_046F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0470, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0471, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0472, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0473, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_SEV_0474, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0476, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x44, 1) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_0477, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_0479, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x43, 1) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_047A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_047B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x40, 1) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_047C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_047D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_047E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_047F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x3f, 1) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_0480, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0481, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0482, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0483, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x41, 1) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_0484, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x42, 1) + stdobject(0x00c0, MODEL_DD_CHAIR, PAD_SEV_0485, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3b, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0486, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0487, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0488, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0489, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0491, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0492, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0493, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0494, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0495, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0496, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0497, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0498, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_0499, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_049A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_049B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_049C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_049D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_049E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_049F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_04A0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_04A1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_04A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_SEV_04A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SEV_031A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SEV_031B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04B8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04B9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04BA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04BB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04BC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04BD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_04BE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02C7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02C8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02C9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02CA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02CB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02CC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02CD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02CE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02CF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D1, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D2, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D3, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D4, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D5, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D6, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D7, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D8, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02D9, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02DA, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_SEV_02DB, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0307, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0306, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0305, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0304, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02F9, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02FA, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02FB, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02FC, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02FD, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02FE, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_02FF, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0300, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0301, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0302, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_BARREL, PAD_SEV_0303, OBJFLAG_00000001 | OBJFLAG_00000040 | OBJFLAG_00000100, 0, OBJFLAG3_PUSHABLE, 1000) + tag(OBJ_PSYCHOSISGUN, 1) + weapon(0x0100, MODEL_CHRDRUGGUN, PAD_SEV_0397, OBJFLAG_00000001, 0, 0, WEAPON_PSYCHOSISGUN) + stdobject(0x0200, MODEL_A51TABLE, PAD_SEV_04D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0200, MODEL_A51TABLE, PAD_SEV_04D7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_SEV_04B6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_048F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_SEV_0490, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(OBJ_CONSOLE, 1) +#if VERSION >= VERSION_PAL_BETA + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_0435, OBJFLAG_00000001 | OBJFLAG_00000100, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 0, 0) +#else + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_SEV_0435, OBJFLAG_00000001 | OBJFLAG_00000100, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 0, 0) +#endif + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04ED, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04EE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04EF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_SEV_04F6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x4f, 1) + stdobject(0x0100, MODEL_A51GRATE, PAD_SEV_0443, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x50, 1) + stdobject(0x0100, MODEL_A51GRATE, PAD_SEV_0449, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + endprops +}; + +s32 intro[] = { + spawn(PAD_SEV_03DD) + ammo(AMMOTYPE_MAGNUM, 1) + outfit(OUTFIT_ELVIS) + endintro +}; + +s32 path00[] = { + PAD_SEV_0194, + PAD_SEV_0193, + PAD_SEV_0196, + PAD_SEV_0195, + -1, +}; + +s32 path01[] = { + PAD_SEV_019A, + PAD_SEV_019C, + PAD_SEV_018B, + PAD_SEV_018A, + PAD_SEV_018F, + PAD_SEV_01A0, + PAD_SEV_0190, + PAD_SEV_019E, + PAD_SEV_0199, + -1, +}; + +s32 path02[] = { + PAD_SEV_0190, + PAD_SEV_019E, + PAD_SEV_0199, + PAD_SEV_019A, + PAD_SEV_019C, + PAD_SEV_018B, + PAD_SEV_018A, + PAD_SEV_018F, + PAD_SEV_01A0, + -1, +}; + +s32 path03[] = { + PAD_SEV_018D, + PAD_SEV_0189, + PAD_SEV_0191, + PAD_SEV_018F, + PAD_SEV_018E, + -1, +}; + +s32 path04[] = { + PAD_SEV_0185, + PAD_SEV_0186, + PAD_SEV_0187, + PAD_SEV_0182, + PAD_SEV_0188, + -1, +}; + +s32 path05[] = { + PAD_SEV_01BD, + PAD_SEV_01BC, + PAD_SEV_01BB, + PAD_SEV_01BC, + PAD_SEV_01BD, + -1, +}; + +s32 path06[] = { + PAD_SEV_0111, + PAD_SEV_010F, + PAD_SEV_011A, + PAD_SEV_0118, + PAD_SEV_011A, + PAD_SEV_010F, + PAD_SEV_0111, + -1, +}; + +s32 path07[] = { + PAD_SEV_0112, + PAD_SEV_0113, + PAD_SEV_0100, + PAD_SEV_0102, + PAD_SEV_0104, + PAD_SEV_0102, + PAD_SEV_0100, + PAD_SEV_0113, + -1, +}; + +s32 path08[] = { + PAD_SEV_00F7, + PAD_SEV_00FA, + PAD_SEV_00FB, + PAD_SEV_00FC, + PAD_SEV_00FB, + PAD_SEV_00FA, + PAD_SEV_00F7, + PAD_SEV_00F8, + PAD_SEV_00F9, + PAD_SEV_00FA, + -1, +}; + +s32 path09[] = { + PAD_SEV_00F0, + PAD_SEV_00F2, + PAD_SEV_00F3, + PAD_SEV_00F4, + PAD_SEV_00F3, + PAD_SEV_00F2, + PAD_SEV_00F0, + PAD_SEV_00EF, + PAD_SEV_00F3, + PAD_SEV_00F2, + -1, +}; + +s32 path10[] = { + PAD_SEV_0123, + PAD_SEV_0124, + -1, +}; + +s32 path11[] = { + PAD_SEV_0124, + PAD_SEV_0123, + -1, +}; + +s32 path12[] = { + PAD_SEV_0118, + PAD_SEV_0119, + PAD_SEV_011A, + PAD_SEV_010D, + PAD_SEV_010E, + PAD_SEV_010F, + PAD_SEV_0110, + PAD_SEV_0111, + PAD_SEV_0112, + PAD_SEV_0113, + PAD_SEV_0114, + PAD_SEV_0100, + PAD_SEV_0114, + PAD_SEV_0113, + PAD_SEV_0112, + PAD_SEV_0111, + PAD_SEV_0110, + PAD_SEV_010F, + PAD_SEV_010E, + PAD_SEV_010D, + PAD_SEV_011A, + PAD_SEV_0119, + -1, +}; + +s32 path13[] = { + PAD_SEV_00ED, + PAD_SEV_0100, + PAD_SEV_00ED, + -1, +}; + +s32 path14[] = { + PAD_SEV_0100, + PAD_SEV_0118, + PAD_SEV_0100, + PAD_SEV_00ED, + -1, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, 0 }, + { path02, 2, 0 }, + { path03, 3, 0 }, + { path04, 4, 0 }, + { path05, 5, 0 }, + { path06, 6, 0 }, + { path07, 7, 0 }, + { path08, 8, 0 }, + { path09, 9, 0 }, + { path10, 10, 0 }, + { path11, 11, 0 }, + { path12, 12, 0 }, + { path13, 13, 0 }, + { path14, 14, 0 }, + { NULL, 0, 0 }, +}; + +u8 func1000_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + + // These objects don't exist...? + give_object_to_chr(0x05, CHR_BOND) + give_object_to_chr(0x3a, CHR_COOP) + + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func0401_start_path00[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + assign_path(0) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0402_start_path01[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + assign_path(1) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0403_start_path02[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + assign_path(2) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0404_start_path03[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + assign_path(3) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0405_start_path04[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + assign_path(4) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0406_start_path05[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + assign_path(5) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0407_start_path06[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(6) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0408_start_path07[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(7) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0409_start_path08[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(8) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040a_start_path09[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(9) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040b_start_path10[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(10) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040c_start_path11[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(11) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040d_start_path12[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(12) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040e_start_path13[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(13) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040f_start_path14[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + assign_path(14) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func0415_init_50hp_guard[] = { + set_accuracy(10) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 50) + add_health_or_armor(0) + set_recovery_speed(35) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0416_init_80hp_guard[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0417_init_lx_guard[] = { + set_accuracy(10) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 280) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +// This function is never assigned +u8 func0418_init_alerted_guard[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func100d_start_lifts[] = { + activate_lift(1, 0x35) + activate_lift(4, 0x38) + activate_lift(5, 0x39) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1003_check_experiment_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_EXPERIMENT, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_SEV_007) // "Medical experiment has been sabotaged." + set_stage_flag(STAGEFLAG_EXPERIMENT_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + endloop(0x04) + + endlist +}; + +u8 func1004_check_saucer_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(0x3e, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_SEV_008) // "Captured Maian saucer has been destroyed." + set_stage_flag(STAGEFLAG_SAUCER_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + endloop(0x04) + + endlist +}; + +u8 func1005_check_experiment_destroyed_pointless[] = { + // This is a pointless function + beginloop(0x04) + if_object_in_good_condition(OBJ_EXPERIMENT, /*goto*/ 0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + endloop(0x04) + + endlist +}; + +u8 func1006_activate_alarm[] = { + // Wait until player is in crate room + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x003f, /*goto*/ 0x2c) + endloop(0x04) + + // Activate alarm + label(0x2c) + activate_alarm + set_stage_flag(STAGEFLAG_ALARM_SOUNDED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * A hidden chr spawns clones every 50 seconds after the alarm is sounded. + */ +u8 func0410_clone_spawner[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + // Wait until alarm activated + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, TRUE, /*goto*/ 0x04) + endloop(0x0d) + + beginloop(0x04) + if_never_been_onscreen(/*goto*/ 0x4d) + if_can_see_target(/*goto*/ 0x08) // <-- pointless + reloop(0x04) + + label(0x08) + reloop(0x04) + + label(0x4d) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4d) + reloop(0x04) + + // Wait 50 seconds + label(0x4d) + restart_timer + + beginloop(0x09) + if_timer_gt(3000, /*goto*/ 0x06) + endloop(0x09) + + // Spawn a clone + label(0x06) + try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE, 0, /*goto*/ 0x2c) + set_ailist(CHR_SELF, AILIST_CLONE) + + label(0x2c) + yield + endloop(0x04) + + endlist +}; + +u8 func0411_init_clone[] = { + set_accuracy(13) + set_reaction_speed(0) + set_chr_maxdamage(CHR_SELF, 80) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + label(0x04) + try_inherit_properties(0x4e, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_CLONE) + endlist +}; + +u8 func0412_clone[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_returnlist(CHR_SELF, GAILIST_ALERTED) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func0410_clone_spawner2[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + + // Wait until player is in room 0x005e + beginloop(0x0d) + if_chr_in_room(CHR_BOND, 0x00, 0x005e, /*goto*/ 0x2c) + endloop(0x0d) + + beginloop(0x04) + if_never_been_onscreen(/*goto*/ 0x4d) + if_can_see_target(/*goto*/ 0x08) // <-- pointless + reloop(0x04) + + label(0x08) + reloop(0x04) + + // Condition triggered. Also wait until clone is dead. + label(0x4d) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4d) + reloop(0x04) + + // Wait a further 50 seconds + label(0x4d) + restart_timer + + beginloop(0x09) + if_timer_gt(3000, /*goto*/ 0x06) + endloop(0x09) + + // Spawn clone + label(0x06) + try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE, 0, /*goto*/ 0x2c) + set_ailist(CHR_SELF, AILIST_CLONE) + + label(0x2c) + yield + endloop(0x04) + + endlist +}; + +u8 func1007_disable_pods[] = { + // Pods are the things that you xray scan in Rescue + set_object_flag(0x1a, OBJFLAG_DEACTIVATED) + set_object_flag(0x1b, OBJFLAG_DEACTIVATED) + set_object_flag(0x1c, OBJFLAG_DEACTIVATED) + set_object_flag(0x1d, OBJFLAG_DEACTIVATED) + set_object_flag(0x1e, OBJFLAG_DEACTIVATED) + set_object_flag(0x1f, OBJFLAG_DEACTIVATED) + set_object_flag(0x20, OBJFLAG_DEACTIVATED) + set_object_flag(0x21, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_check_console[] = { + // Wait for console activated or destroyed + beginloop(0x04) + if_chr_activated_object(CHR_ANY, OBJ_CONSOLE, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x06) + goto_next(0x08) + label(0x06) + endloop(0x04) + + // Console activated - play sound and wait 3 seconds + label(0x2c) + play_sound(SFX_8116, -1) + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x2c) + endloop(0x09) + + label(0x2c) + assign_sound(SFX_8111, CHANNEL_0) + play_sound_from_object(CHANNEL_0, OBJ_CONSOLE, 1, 300, 400) + show_hudmsg(CHR_BOND, L_SEV_009) // "Distress signal has been sent." + set_stage_flag(STAGEFLAG_CONSOLE_ACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Console destroyed + label(0x08) + show_hudmsg(CHR_BOND, L_SEV_010) // "Critical mission object has been destroyed." + set_stage_flag(STAGEFLAG_CONSOLE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_check_for_exit[] = { + // Wait for all objectives complete + beginloop(0x04) + if_all_objectives_complete(/*goto*/ 0x2c) + endloop(0x04) + + // Wait 2 seconds + label(0x2c) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + set_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) + goto_next(0x06) + + // Both players dead + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // At least one player survived + label(0x06) + set_ailist(CHR_SELF, AILIST_OUTRO) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_vertical_door_sounds[] = { + // Wait for player to activate vertical doors + beginloop(0x5d) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x46, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x47, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ 0x2c) + reloop(0x5d) + + label(0x2c) + play_sound(SFX_DOOR_81B0, -1) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + endloop(0x5d) + + endlist +}; + +u8 func100b_check_medlab_escapable[] = { + // While player is in the starting area + beginloop(0x04) + if_chr_in_room(CHR_BOND, 0x00, 0x0095, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0096, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0097, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0098, /*goto*/ 0x2c) + reloop(0x04) + + // If any glass is broken, jump to 0x0d where we'll return + label(0x2c) + if_object_in_good_condition(OBJ_GLASS1, /*goto*/ 0x2c) + goto_next(0x0d) + label(0x2c) + if_object_in_good_condition(OBJ_GLASS2, /*goto*/ 0x2c) + goto_next(0x0d) + label(0x2c) + if_object_in_good_condition(OBJ_GLASS3, /*goto*/ 0x2c) + goto_next(0x0d) + + // Check if trolley is destroyed + label(0x2c) + if_object_in_good_condition(OBJ_TROLLEY, /*goto*/ 0x06) + goto_next(0x2c) + + // Trolley is not destroyed + // Wait until we have pistol ammo (ie. Falcon 2), then wait until we don't. + label(0x06) + if_stage_flag_eq(STAGEFLAG_GOT_FALCON2, TRUE, /*goto*/ 0x66) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_PISTOL, 1, /*goto*/ 0x67) + set_stage_flag(STAGEFLAG_GOT_FALCON2) + reloop(0x04) + + label(0x67) + reloop(0x04) + + label(0x66) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_PISTOL, 1, /*goto*/ 0x2c) + reloop(0x04) + + // Trolley is destroyed. Wait 3 seconds for explosion to break any glass. + label(0x2c) + restart_timer + + beginloop(0x61) + if_timer_gt(180, /*goto*/ 0x2c) + if_object_in_good_condition(OBJ_GLASS1, /*goto*/ 0x2d) + goto_next(0x0d) + label(0x2d) + if_object_in_good_condition(OBJ_GLASS2, /*goto*/ 0x2d) + goto_next(0x0d) + label(0x2d) + if_object_in_good_condition(OBJ_GLASS3, /*goto*/ 0x2d) + goto_next(0x0d) + label(0x2d) + endloop(0x61) + + // Timer expired, and no glass was broken. Check if lab techs are dead. + label(0x2c) + if_chr_deadish(CHR_LABTECH1, /*goto*/ 0x63) + goto_next(0x06) + + label(0x63) + if_chr_deadish(CHR_LABTECH2, /*goto*/ 0x65) + + label(0x06) + if_chr_has_object(CHR_BOND, OBJ_PSYCHOSISGUN, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_PSYCHOSIS, 1, /*goto*/ 0x2c) + reloop(0x04) + + // Both lab techs dead + label(0x65) + + // Player has psychosis gun but ammo depleted + label(0x2c) + show_hudmsg(CHR_BOND, L_SEV_011) // "Mission failed - cannot escape from medlab." + set_stage_flag(STAGEFLAG_TRAPPED_AT_START) + goto_next(0x0e) + + // Glass broken + label(0x0d) + unset_stage_flag(STAGEFLAG_TRAPPED_AT_START) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x0e) + if_chr_in_room(CHR_BOND, 0x00, 0x0095, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0096, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0097, /*goto*/ 0x2c) + if_chr_in_room(CHR_BOND, 0x00, 0x0098, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x0e) + + label(0x06) + show_hudmsg(CHR_BOND, L_SEV_012) // "Alternative escape route found." + unset_stage_flag(STAGEFLAG_TRAPPED_AT_START) + goto_first(0x04) + + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_INTRO) + camera_movement(ANIM_CUT_SEV_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SEV_INTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + set_object_flag2(OBJ_TROLLEY, OBJFLAG2_04000000) + set_object_flag3(OBJ_TROLLEY, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SEV_INTRO_BED, OBJ_TROLLEY, 0x04, 0xffff) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x87) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + \ + label(0x06) + + wait_until(300, 0x76) + play_sound(SFX_0161, CHANNEL_7) + + wait_until(302, 0x77) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(330, 0x78) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(360, 0x79) + play_sound(SFX_0164, CHANNEL_6) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0x87) + label(0x2c) + if_controller_button_pressed(/*goto*/ 0x87) + label(0x2c) + endloop(0x08) + + label(0x87) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SEV_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + unset_object_flag2(OBJ_TROLLEY, OBJFLAG2_04000000) + set_object_flag3(OBJ_TROLLEY, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SEV_INTRO_BED, OBJ_TROLLEY, 0x04, 0xfffe) + stop_cutscene_track + stop_ambient_track + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func041b_outro[] = { + set_invincible(CHR_BOND) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_OUTRO) + camera_movement(ANIM_CUT_SEV_OUTRO_CAM) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SEV_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + unset_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_OUTRO_GUARD, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SEV_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD, 4) + + show_nonessential_chrs(FALSE) + restart_timer + + wait_until(46, 0x6c) + play_sound(SFX_M0_HEY_YOU, CHANNEL_7) + + wait_until(144, 0x6d) + play_sound(SFX_0085, CHANNEL_6) + + wait_until(205, 0x6e) + play_sound(SFX_04F2, CHANNEL_10) + + wait_until(210, 0x6f) + play_sound(SFX_0045, CHANNEL_10) + + wait_until(214, 0x70) + play_sound(SFX_ARGH_MAIAN_05E0, CHANNEL_10) + + wait_until(260, 0x71) + play_sound(SFX_007B, CHANNEL_10) + + wait_until(270, 0x72) + play_sound(SFX_M0_GRAB_A_BODY_BAG, CHANNEL_10) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0x87) + label(0x2c) + if_controller_button_pressed(/*goto*/ 0x87) + label(0x2c) + endloop(0x08) + + label(0x87) + label(0x06) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0419_init_outro_guard[] = { + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_unset_trolley_flag_when_destroyed[] = { + beginloop(0x04) + if_object_in_good_condition(OBJ_TROLLEY, /*goto*/ 0x2c) + unset_object_flag3(OBJ_TROLLEY, OBJFLAG3_PUSHABLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + endloop(0x04) + + endlist +}; + +u8 func041c_init_labtech[] = { + set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func100e_break_glass[] = { + // If SA or PA, wait until experiment destroyed + // then break the surrounding glass. + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + beginloop(0x04) + if_objective_complete(0, /*goto*/ 0x0d) + endloop(0x04) + + label(0x0d) + disable_object(0x4f) + disable_object(0x50) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func100f_init_lighting[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x00d3, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d6, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d8, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d9, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00da, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00db, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0079, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0080, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0090, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0091, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0092, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0093, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0094, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0095, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0096, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0097, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0098, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0099, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x009a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x009b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00aa, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ab, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ac, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ad, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ae, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00af, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ba, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00be, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bf, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ca, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ce, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cf, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00d0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00d1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00d2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00dc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00dd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00de, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00df, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00f2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fa, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fe, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ff, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0100, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0101, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0102, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0103, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0104, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0105, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0106, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0107, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0108, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0109, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0083, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0084, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0085, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0086, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0087, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0088, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0089, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_unload_part1_chrs[] = { + // Wait until player is in room 0x0067 - probably crate room or so + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0067, /*goto*/ 0x2c) + endloop(0x04) + + // Unload all chrs in first part of the stage + label(0x2c) + set_ailist(CHR_LABTECH1, AILIST_UNLOAD) + set_ailist(CHR_LABTECH2, AILIST_UNLOAD) + set_ailist(0x00, AILIST_UNLOAD) + set_ailist(0x01, AILIST_UNLOAD) + set_ailist(0x02, AILIST_UNLOAD) + set_ailist(0x03, AILIST_UNLOAD) + set_ailist(0x04, AILIST_UNLOAD) + set_ailist(0x07, AILIST_UNLOAD) + set_ailist(0x08, AILIST_UNLOAD) + set_ailist(0x09, AILIST_UNLOAD) + set_ailist(0x0b, AILIST_UNLOAD) + set_ailist(0x0c, AILIST_UNLOAD) + set_ailist(0x0f, AILIST_UNLOAD) + set_ailist(0x10, AILIST_UNLOAD) + set_ailist(0x11, AILIST_UNLOAD) + set_ailist(0x12, AILIST_UNLOAD) + set_ailist(0x13, AILIST_UNLOAD) + set_ailist(0x14, AILIST_UNLOAD) + set_ailist(0x15, AILIST_UNLOAD) + set_ailist(0x16, AILIST_UNLOAD) + set_ailist(0x17, AILIST_UNLOAD) + set_ailist(0x18, AILIST_UNLOAD) + set_ailist(0x19, AILIST_UNLOAD) + set_ailist(0x1a, AILIST_UNLOAD) + set_ailist(0x46, AILIST_UNLOAD) + set_ailist(0x47, AILIST_UNLOAD) + set_ailist(0x1b, AILIST_UNLOAD) + set_ailist(0x1c, AILIST_UNLOAD) + set_ailist(0x1d, AILIST_UNLOAD) + set_ailist(0x1e, AILIST_UNLOAD) + set_ailist(0x1f, AILIST_UNLOAD) + set_ailist(0x20, AILIST_UNLOAD) + set_ailist(0x21, AILIST_UNLOAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0414_unload[] = { + label(0x2c) + yield + set_target_chr(CHR_BOND) + if_nearly_in_targets_sight(30, /*goto*/ 0x06) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) + set_target_chr(CHR_COOP) + if_nearly_in_targets_sight(30, /*goto*/ 0x06) + label(0x2c) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x08) + set_target_chr(CHR_ANTI) + if_nearly_in_targets_sight(30, /*goto*/ 0x06) + label(0x08) + yield + chr_drop_weapon(CHR_SELF) + remove_chr(CHR_SELF) + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x06) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +struct ailist ailists[] = { + { func1000_setup_counterop, 0x1000 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_check_experiment_destroyed, 0x1003 }, + { func1004_check_saucer_destroyed, 0x1004 }, + { func1005_check_experiment_destroyed_pointless, 0x1005 }, + { func1006_activate_alarm, 0x1006 }, + { func1007_disable_pods, 0x1007 }, + { func1008_check_console, 0x1008 }, + { func1009_check_for_exit, 0x1009 }, + { func100a_vertical_door_sounds, 0x100a }, + { func100b_check_medlab_escapable, 0x100b }, + { func100c_unset_trolley_flag_when_destroyed, 0x100c }, + { func100d_start_lifts, 0x100d }, + { func100e_break_glass, 0x100e }, + { func100f_init_lighting, 0x100f }, + { func1010_unload_part1_chrs, 0x1010 }, + { func0401_start_path00, 0x0401 }, + { func0402_start_path01, 0x0402 }, + { func0403_start_path02, 0x0403 }, + { func0404_start_path03, 0x0404 }, + { func0405_start_path04, 0x0405 }, + { func0406_start_path05, 0x0406 }, + { func0407_start_path06, 0x0407 }, + { func0408_start_path07, 0x0408 }, + { func0409_start_path08, 0x0409 }, + { func040a_start_path09, 0x040a }, + { func040b_start_path10, 0x040b }, + { func040c_start_path11, 0x040c }, + { func040d_start_path12, 0x040d }, + { func040e_start_path13, 0x040e }, + { func040f_start_path14, 0x040f }, + { func0410_clone_spawner, 0x0410 }, + { func0411_init_clone, 0x0411 }, + { func0412_clone, 0x0412 }, + { func0410_clone_spawner2, 0x0413 }, + { func0414_unload, 0x0414 }, + { func0415_init_50hp_guard, 0x0415 }, + { func0416_init_80hp_guard, 0x0416 }, + { func0417_init_lx_guard, 0x0417 }, + { func0418_init_alerted_guard, 0x0418 }, + { func0419_init_outro_guard, 0x0419 }, + { func1002_intro, 0x041a }, + { func041b_outro, 0x041b }, + { func041c_init_labtech, 0x041c }, + { func1002_intro, 0x0c00 }, + { func041b_outro, 0x0c01 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setupsevb.c b/src/ailists/setupsevb.c new file mode 100644 index 000000000..ec826f8f5 --- /dev/null +++ b/src/ailists/setupsevb.c @@ -0,0 +1,39 @@ +// +// Retaking the Institute +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupsevx.c b/src/ailists/setupsevx.c new file mode 100644 index 000000000..566a3b6e4 --- /dev/null +++ b/src/ailists/setupsevx.c @@ -0,0 +1,39 @@ +// +// Stage IDs 0x24 and 0x2b +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupsevxb.c b/src/ailists/setupsevxb.c new file mode 100644 index 000000000..750cd3354 --- /dev/null +++ b/src/ailists/setupsevxb.c @@ -0,0 +1,39 @@ +// +// Unused +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupsho.c b/src/ailists/setupsho.c new file mode 100644 index 000000000..60cc92613 --- /dev/null +++ b/src/ailists/setupsho.c @@ -0,0 +1,3968 @@ +// +// Skedar Ruins +// + +#include "stagesetup.h" + +// Characters +#define CHR_KING1 0x33 +#define CHR_KING_SKEDAR_SPAWNER 0x34 +#define CHR_KING_MINISKEDAR_SPAWNER 0x35 +#define CHR_ELVIS 0x36 +#define CHR_KING2 0x3b + +// Objects +#define OBJ_PILLAR1 0x01 +#define OBJ_PILLAR2 0x02 +#define OBJ_PILLAR3 0x03 +#define OBJ_BRIDGE 0x05 +#define OBJ_TARGETAMP_BOND 0x08 +#define OBJ_ALTAR 0x0b +#define OBJ_SPIKE_ML 0x13 +#define OBJ_SPIKE_MR 0x14 +#define OBJ_SPIKE_BL 0x15 +#define OBJ_SPIKE_BR 0x16 +#define OBJ_SPIKE_T 0x17 +#define OBJ_SPIKE_SHAD_ML 0x19 +#define OBJ_SPIKE_SHAD_MR 0x1a +#define OBJ_SPIKE_SHAD_BL 0x1b +#define OBJ_SPIKE_SHAD_BR 0x1c +#define OBJ_SPIKE_SHAD_T 0x1d +#define OBJ_SPIKE_NOSHAD_ML 0x1e +#define OBJ_SPIKE_NOSHAD_MR 0x1f +#define OBJ_SPIKE_NOSHAD_BL 0x20 +#define OBJ_SPIKE_NOSHAD_BR 0x21 +#define OBJ_SPIKE_NOSHAD_T 0x22 +#define OBJ_TARGETAMP_COOP 0x35 +#define OBJ_PHOENIX1 0x42 +#define OBJ_PHOENIX2 0x43 +#define OBJ_REMOTEMINE 0x44 +#define OBJ_ALTAR_FALCON 0x47 +#define OBJ_ALTAR_DEVASTATOR 0x48 +#define OBJ_ALTAR_CALLISTO 0x49 +#define OBJ_ALTAR_MAULER 0x4a +#define OBJ_ALTAR_SLAYER 0x4b +#define OBJ_PUZZLEROCK 0x4c +#define OBJ_BUDDYBRIDGE 0x50 +#define OBJ_BUDDYBARRICADE 0x51 + +// Stage flags +#define STAGEFLAG_COOP_THREW_FIRST_BUG 0x00000001 +#define STAGEFLAG_COOP_THREW_SECOND_BUG 0x00000002 +#define STAGEFLAG_COOP_THREW_THIRD_BUG 0x00000004 +#define STAGEFLAG_COOP_BUGS_WASTED 0x00000008 +#define STAGEFLAG_BOND_BUGS_WASTED 0x00000010 +#define STAGEFLAG_IN_INTRO 0x00000020 +#define STAGEFLAG_IN_OUTRO 0x00000040 +#define STAGEFLAG_AI_BUDDY_EXISTS 0x00000080 +#define STAGEFLAG_PILLAR1_MARKED 0x00000100 +#define STAGEFLAG_PILLAR2_MARKED 0x00000200 +#define STAGEFLAG_PILLAR3_MARKED 0x00000400 +#define STAGEFLAG_BUG_WASTED 0x00000800 +#define STAGEFLAG_BRIDGE_EXTENDED 0x00001000 +#define STAGEFLAG_TRIGGER_SKEDAR_ARMY 0x00002000 +#define STAGEFLAG_ARMY_DEFEATED 0x00004000 +#define STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE 0x00008000 +#define STAGEFLAG_TRIGGER_BRIDGE 0x00010000 +#define STAGEFLAG_BOND_THREW_FIRST_BUG 0x00020000 +#define STAGEFLAG_BOND_THREW_SECOND_BUG 0x00040000 +#define STAGEFLAG_BOND_THREW_THIRD_BUG 0x00080000 +#define STAGEFLAG_GRENADES_WASTED 0x00100000 +#define STAGEFLAG_ACCESSED_SANCTUM 0x00200000 +#define STAGEFLAG_KING_SKEDAR_CLONE_EXISTS 0x00800000 +#define STAGEFLAG_SPIKE1_DESTROYED 0x01000000 +#define STAGEFLAG_SPIKE2_DESTROYED 0x02000000 +#define STAGEFLAG_SPIKE3_DESTROYED 0x04000000 +#define STAGEFLAG_SPIKE4_DESTROYED 0x08000000 +#define STAGEFLAG_SPIKE5_DESTROYED 0x10000000 +#define STAGEFLAG_SPIKES_VULNERABLE 0x20000000 +#define STAGEFLAG_SPIKE_DESTROYED 0x40000000 +#define STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS 0x80000000 + +// AI Lists +#define AILIST_INIT_UNARMED_SKEDAR 0x0401 +#define AILIST_UNARMED_SKEDAR 0x0402 +#define AILIST_INIT_MINISKEDAR 0x0403 +#define AILIST_MINISKEDAR 0x0404 +#define AILIST_PUZZLEROOM_MINISKEDAR_WAITING 0x0405 +#define AILIST_MINISKEDAR_SPAWNER 0x0406 +#define AILIST_INIT_CLOAKED_SKEDAR 0x0407 +#define AILIST_CLOAKED_SKEDAR 0x0408 +#define AILIST_REAPER_SLAYER_SKEDAR 0x0409 +#define AILIST_INIT_REAPER_SLAYER_SKEDAR 0x040a +#define AILIST_MAULER_SKEDAR 0x040b +#define AILIST_KING_WAITING 0x040c +#define AILIST_KING_COMBAT 0x040d +#define AILIST_KING_SKEDAR_SPAWNER 0x040e +#define AILIST_UPDATE_SPIKE_STAGEFLAGS 0x040f +#define AILIST_INIT_KING_SKEDAR_CLONE 0x0410 +#define AILIST_KING_MINISKEDAR_SPAWNER 0x0411 +#define AILIST_INIT_KING_MINISKEDAR_CLONE 0x0412 +#define AILIST_HIDE 0x0413 +#define AILIST_OUTRO 0x0414 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_SHO_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_SHO_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_SHO_002) + briefing(BRIEFINGTYPE_TEXT_A, L_SHO_003) + + beginobjective(0, L_SHO_005, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Identify temple targets" + complete_flags(STAGEFLAG_PILLAR1_MARKED) + complete_flags(STAGEFLAG_PILLAR2_MARKED) + complete_flags(STAGEFLAG_PILLAR3_MARKED) + fail_flags(STAGEFLAG_BUG_WASTED) + endobjective + + beginobjective(1, L_SHO_006, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Activate bridge" + complete_flags(STAGEFLAG_BRIDGE_EXTENDED) + endobjective + + beginobjective(2, L_SHO_007, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Gain access to Inner Sanctum" + complete_flags(STAGEFLAG_ACCESSED_SANCTUM) + endobjective + + beginobjective(3, L_SHO_008, (DIFFBIT_PA | DIFFBIT_PD)) // "Destroy secret Skedar army" + complete_flags(STAGEFLAG_ARMY_DEFEATED) + endobjective + + beginobjective(4, L_SHO_009, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Assassinate Skedar leader" + complete_flags(STAGEFLAG_SPIKE1_DESTROYED) + complete_flags(STAGEFLAG_SPIKE2_DESTROYED) + complete_flags(STAGEFLAG_SPIKE3_DESTROYED) + complete_flags(STAGEFLAG_SPIKE4_DESTROYED) + complete_flags(STAGEFLAG_SPIKE5_DESTROYED) + fail_flags(STAGEFLAG_GRENADES_WASTED) + endobjective + + chr(SPAWNFLAG_00000200, 0x05, PAD_SHO_00A0, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x06, PAD_SHO_00A1, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x07, PAD_SHO_00A2, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00d9, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x08, PAD_SHO_00A3, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00d9, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x17, PAD_SHO_00A4, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 15, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x09, PAD_SHO_00A5, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00da, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x0a, PAD_SHO_00A6, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00da, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x0b, PAD_SHO_00A7, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00db, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x0c, PAD_SHO_00A8, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00db, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x0d, PAD_SHO_00A9, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00dc, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x0e, PAD_SHO_00AA, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00dc, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x0f, PAD_SHO_00AB, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00dd, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x10, PAD_SHO_00AC, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00dd, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x1c, PAD_SHO_00A4, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 15, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x18, PAD_SHO_00AE, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x19, PAD_SHO_00AF, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x1a, PAD_SHO_00B0, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 50, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x11, PAD_SHO_00B1, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00de, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x12, PAD_SHO_00B2, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00de, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x13, PAD_SHO_00B3, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00de, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x14, PAD_SHO_00B4, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00de, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x1b, PAD_SHO_00B5, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x1d, PAD_SHO_00B6, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x15, PAD_SHO_00B7, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00df, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x16, PAD_SHO_00B8, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_CLOAKED_SKEDAR, 0x00df, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x1e, PAD_SHO_00B9, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_00000200, 0x1f, PAD_SHO_00BA, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, CHRFLAG1_CAN_ATTACKAMOUNTRELOAD, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(0, 0x23, PAD_SHO_00BB, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_MINISKEDAR_SPAWNER, 0x00e0, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x24, PAD_SHO_00BC, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_MINISKEDAR_SPAWNER, 0x00e1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x25, PAD_SHO_00BD, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_MINISKEDAR_SPAWNER, 0x00e1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x26, PAD_SHO_00BE, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_PUZZLEROOM_MINISKEDAR_WAITING, -1, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x28, PAD_SHO_00BF, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_MINISKEDAR_SPAWNER, 0x00e2, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x29, PAD_SHO_00C0, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_MINISKEDAR_SPAWNER, 0x00e3, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(0, 0x2a, PAD_SHO_00C2, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_MINISKEDAR_SPAWNER, 0x00e4, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x20, PAD_SHO_00C3, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 30, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 5, 0) + weapon(0x0100, MODEL_CHRSKROCKET, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SLAYER) + chr(SPAWNFLAG_00000200, 0x21, PAD_SHO_00C4, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 30, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 5, 0) + weapon(0x0100, MODEL_CHRSKROCKET, 0x0021, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SLAYER) + chr(SPAWNFLAG_00000200, 0x22, PAD_SHO_00C5, BODY_SKEDAR, HEAD_RANDOM, AILIST_INIT_REAPER_SLAYER_SKEDAR, -1, -1, 1000, 30, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 2, 0, 10, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x0022, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_REAPER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x2c, PAD_SHO_00C6, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x2d, PAD_SHO_00C7, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x2e, PAD_SHO_00C8, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x2f, PAD_SHO_00C9, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x002f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x30, PAD_SHO_00CA, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0030, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x31, PAD_SHO_00CB, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0031, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(SPAWNFLAG_IGNORECOLLISION, 0x32, PAD_SHO_00CC, BODY_SKEDAR, HEAD_RANDOM, AILIST_MAULER_SKEDAR, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, CHRFLAG1_IGNORECOVER, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0032, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_MAULER) + chr(0, 0x33, PAD_SHO_00CD, BODY_SKEDARKING, HEAD_RANDOM, AILIST_HIDE, -1, -1, 1000, 9, CHRFLAG0_HOLD_POSITION, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_KINGSCEPTRE, 0x0033, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_ROCKETLAUNCHER_34) + chr(0, 0x34, PAD_SHO_00CE, BODY_SKEDAR, HEAD_RANDOM, AILIST_KING_SKEDAR_SPAWNER, -1, -1, 1000, 9, CHRFLAG0_GP1, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + ammocrate(0x0100, MODEL_CHRUZI, 0x0034, OBJFLAG_ASSIGNEDTOCHR, 0, 0, 1000, AMMOTYPE_FARSIGHT) + chr(0, 0x35, PAD_SHO_00CF, BODY_MINISKEDAR, HEAD_RANDOM, AILIST_KING_MINISKEDAR_SPAWNER, -1, -1, 1000, 9, CHRFLAG0_GP1, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_BLUESIGHT, 0x36, PAD_SHO_00D9, BODY_ELVISWAISTCOAT, HEAD_ELVIS, AILIST_HIDE, -1, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x37, PAD_SHO_000F, BODY_SKEDAR, HEAD_RANDOM, AILIST_HIDE, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x38, PAD_SHO_0010, BODY_SKEDAR, HEAD_RANDOM, AILIST_HIDE, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x39, PAD_SHO_0011, BODY_SKEDAR, HEAD_RANDOM, AILIST_HIDE, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x3a, PAD_SHO_0012, BODY_SKEDAR, HEAD_RANDOM, AILIST_HIDE, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, 0x3b, PAD_SHO_0018, BODY_SKEDARKING, HEAD_RANDOM, GAILIST_IDLE, 0x00d8, -1, 1000, 9, CHRFLAG0_SKIPSAFETYCHECKS, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_KINGSCEPTRE, 0x003b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_NONE) + conditional_scenery(1, 0, 2) + debris(0x0100, MODEL_SKCREV_UNEXP1, PAD_SHO_00E5, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_INFRARED, 1000) +#if VERSION >= VERSION_NTSC_1_0 + debris(0x0100, MODEL_SKCREV_EXP1, PAD_SHO_00E6, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + debris(0x0100, MODEL_SKCREV_EXP1, PAD_SHO_00E6, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + tag(0x44, 1) + mine(0x0100, MODEL_CHRPROXIMITYMINE, PAD_SHO_00E6, OBJFLAG_00000002, 0, 0, 1000, WEAPON_PROXIMITYMINE) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_SKTNL_UNEXP1, PAD_SHO_00E7, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_INFRARED, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + stdobject(0x0100, MODEL_SKTNL_EXP1, PAD_SHO_00E8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x4d, -2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARLEFT, PAD_SHO_013D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARLEFT, PAD_SHO_013E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARLEFT, PAD_SHO_013F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARLEFT, PAD_SHO_0140, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARRIGHT, PAD_SHO_0141, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARRIGHT, PAD_SHO_0142, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARRIGHT, PAD_SHO_0143, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_PILLARRIGHT, PAD_SHO_0144, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x19, 5) + tag(0x1a, 5) + tag(0x1b, 5) + tag(0x1c, 5) + tag(0x1d, 5) + stdobject(0x0100, MODEL_SK_FL_SHAD_ML, PAD_SHO_014B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_SHAD_MR, PAD_SHO_014C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_SHAD_BL, PAD_SHO_014D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_SHAD_BR, PAD_SHO_014E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_SHAD_T, PAD_SHO_014A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x1e, 5) + tag(0x1f, 5) + tag(0x20, 5) + tag(0x21, 5) + tag(0x22, 5) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_ML, PAD_SHO_014B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_MR, PAD_SHO_014C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_BL, PAD_SHO_014D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_BR, PAD_SHO_014E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_T, PAD_SHO_014A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x01, 3) + tag(0x2a, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN4, PAD_SHO_0111, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x02, 3) + tag(0x2b, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_SHO_010A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x41, -1) + tag(0x03, 3) + tag(0x2c, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN3, PAD_SHO_010B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x2d, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_SHO_010C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x2e, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN3, PAD_SHO_010D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00020000 | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x2f, 5) + tag(0x30, 5) + tag(0x31, 5) + tag(0x32, 5) + tag(0x33, 5) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_SHO_00D5, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_SHO_010A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_SHO_010B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_SHO_010C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_SHO_010D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x27, -3) + tag(0x28, -3) + tag(0x29, -3) + tag(0x3e, 1) + stdobject(0x0100, MODEL_SK_SUNSHAD1, PAD_SHO_014F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x3d, 1) + stdobject(0x0100, MODEL_SK_SUNSHAD2, PAD_SHO_0150, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x4e, 2) + tag(0x4f, 2) + stdobject(0x0100, MODEL_SK_SUNNOSHAD1, PAD_SHO_014F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_SUNNOSHAD2, PAD_SHO_0150, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00EB, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00EC, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00ED, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00EE, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00EF, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F0, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x09, 2) + tag(0x0a, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F1, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F2, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000002, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x0d, 2) + tag(0x0e, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F3, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F4, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x45, 2) + tag(0x46, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F5, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F6, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x0f, 2) + tag(0x10, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F7, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F8, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x11, 2) + tag(0x12, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00F9, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_SHO_00FA, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000080, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x0c, 1) + fan(0x0100, MODEL_SK_UNDER_GENERATOR, PAD_SHO_0126, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_SK_UNDER_TRANS, PAD_SHO_0127, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_SK_UNDER_TRANS, PAD_SHO_0128, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + tag(0x4c, 1) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x00e6, MODEL_SKPUZZLEOBJECT, PAD_SHO_012C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_01000000, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) +#else + stdobject(0x00e6, MODEL_SKPUZZLEOBJECT, PAD_SHO_012C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) +#endif + tag(0x05, 1) + lift(0x0100, MODEL_SKEDARBRIDGE, PAD_SHO_0135, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0135, 0x0134, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000471c, 0x00a6aaaa, 0x00000000) + tag(0x08, 1) + stdobject(0x0100, MODEL_TARGETAMP, PAD_SHO_0001, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + rename_object(-1, WEAPON_TARGETAMPLIFIER, L_SHO_020, L_SHO_021, L_SHO_022, L_SHO_023, L_SHO_024) // "Obtain Target Amplifier." + tag(0x35, 1) + stdobject(0x0100, MODEL_TARGETAMP, PAD_SHO_0001, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + rename_object(-1, WEAPON_TARGETAMPLIFIER, L_SHO_020, L_SHO_021, L_SHO_022, L_SHO_023, L_SHO_024) // "Obtain Target Amplifier." + tag(0x0b, 1) + multimonitor(0x0019, MODEL_COMHUB, PAD_SHO_0137, OBJFLAG_00000002 | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, OBJFLAG3_INTERACTABLE, 1000, 3, 3, 3, 0) + tag(0x13, 1) + stdobject(0x0100, MODEL_SK_PLINTH_ML, PAD_SHO_0146, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_01000000, 0, 0, 3000) + tag(0x14, 1) + stdobject(0x0100, MODEL_SK_PLINTH_MR, PAD_SHO_0147, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_01000000, 0, 0, 3000) + tag(0x15, 1) + stdobject(0x0100, MODEL_SK_PLINTH_BL, PAD_SHO_0149, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_01000000, 0, 0, 3000) + tag(0x16, 1) + stdobject(0x0100, MODEL_SK_PLINTH_BR, PAD_SHO_0148, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_01000000, 0, 0, 3000) + tag(0x17, 1) + stdobject(0x0100, MODEL_SK_PLINTH_T, PAD_SHO_0145, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_COLLECTABLE | OBJFLAG_01000000, 0, 0, 3000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SHO_012D, OBJFLAG_00000001 | OBJFLAG_00000100, 0, 0, 1000) + weapon(0x0100, MODEL_CHRMAULER, -1, OBJFLAG_INSIDEANOTHEROBJ, 0, 0, WEAPON_MAULER) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_SHO_012E, OBJFLAG_00000001 | OBJFLAG_00000100, 0, 0, 1000) + weapon(0x0100, MODEL_CHRMAULER, -1, OBJFLAG_INSIDEANOTHEROBJ, 0, 0, WEAPON_MAULER) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_SHO_012F, OBJFLAG_00000001 | OBJFLAG_00000100, 0, 0, 1000) + weapon(0x0100, MODEL_CHRMAULER, -1, OBJFLAG_INSIDEANOTHEROBJ, 0, 0, WEAPON_MAULER) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_SHO_0130, OBJFLAG_00000001 | OBJFLAG_00000100, 0, 0, 1000) + weapon(0x0100, MODEL_CHRMAULER, -1, OBJFLAG_INSIDEANOTHEROBJ, 0, 0, WEAPON_MAULER) + tag(0x23, 1) + stdobject(0x0019, MODEL_RUBBLE1, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x24, 1) + stdobject(0x0019, MODEL_RUBBLE2, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x25, 1) + stdobject(0x0019, MODEL_RUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x26, 1) + stdobject(0x0019, MODEL_RUBBLE4, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x37, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x38, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE4, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x39, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE5, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3a, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE6, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3b, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3c, 1) + stdobject(0x0019, MODEL_RUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_SHO_010E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_SHO_010F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_SHO_0110, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x36, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_00FC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_00FB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_00FD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_00FE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_0100, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_00FF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_0101, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_0102, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_0104, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_0103, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_0106, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_0105, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_SHO_0107, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001100) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_SHO_0108, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00001100) + tag(0x47, 1) + weapon(0x0100, MODEL_CHRFALCON2SCOPE, PAD_SHO_00D6, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_FALCON2_SCOPE) + tag(0x48, 1) + weapon(0x0100, MODEL_CHRDEVASTATOR, PAD_SHO_00D6, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_DEVASTATOR) + tag(0x49, 1) + weapon(0x0100, MODEL_CHRMAIANSMG, PAD_SHO_00D6, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_CALLISTO) + tag(0x4a, 1) + weapon(0x0100, MODEL_CHRMAULER, PAD_SHO_00D6, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_MAULER) + tag(0x4b, 1) + weapon(0x0100, MODEL_CHRSKROCKET, PAD_SHO_00D6, OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_SLAYER) + tag(0x50, 2) + tag(0x51, 2) + stdobject(0x0100, MODEL_BUDDYBRIDGE, PAD_SHO_00EA, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_TEMPLECOLUMN4, PAD_SHO_0131, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x3f, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_SHO_0151, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x40, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_SHO_00BA, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x42, 2) + tag(0x43, 2) + weapon(0x0100, MODEL_CHRMAIANPISTOL, PAD_SHO_0032, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_PHOENIX) + weapon(0x0100, MODEL_CHRMAIANPISTOL, PAD_SHO_0032, OBJFLAG_00000001 | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_INVISIBLE, 0, WEAPON_PHOENIX) + link_guns(-1, -2) + pad_effect(PADEFFECT_SPARKS, 0x0112) + pad_effect(PADEFFECT_SPARKS, 0x0117) + pad_effect(PADEFFECT_SPARKS, 0x0113) + pad_effect(PADEFFECT_SPARKS, 0x0114) + pad_effect(PADEFFECT_SPARKS, 0x0115) + pad_effect(PADEFFECT_SPARKS, 0x0116) + pad_effect(PADEFFECT_SPARKS, 0x0118) + pad_effect(PADEFFECT_SPARKS, 0x0119) + pad_effect(PADEFFECT_SPARKS, 0x011a) + pad_effect(PADEFFECT_SPARKS, 0x011b) + pad_effect(PADEFFECT_SPARKS, 0x011c) + pad_effect(PADEFFECT_SPARKS, 0x011d) + pad_effect(PADEFFECT_SPARKS, 0x011e) + pad_effect(PADEFFECT_SPARKS, 0x011f) + pad_effect(PADEFFECT_SPARKS, 0x0120) + pad_effect(PADEFFECT_SPARKS, 0x0121) + pad_effect(PADEFFECT_SPARKS, 0x0122) + pad_effect(PADEFFECT_SPARKS, 0x0123) + pad_effect(PADEFFECT_SPARKS, 0x0124) + pad_effect(PADEFFECT_SPARKS, 0x0125) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0025) + pad_effect(PADEFFECT_OUTROSMOKE, 0x008c) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0028) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0029) + pad_effect(PADEFFECT_OUTROSMOKE, 0x002a) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0023) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0027) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0026) + pad_effect(PADEFFECT_OUTROSMOKE, 0x0006) + pad_effect(PADEFFECT_OUTROSMOKE, 0x00d9) + pad_effect(PADEFFECT_OUTROSMOKE, 0x00a3) + pad_effect(PADEFFECT_OUTROSMOKE, 0x000c) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + intro_weapon(WEAPON_FALCON2_SCOPE, -1) + ammo(AMMOTYPE_PISTOL, 200) + intro_weapon(WEAPON_CALLISTO, -1) + ammo(AMMOTYPE_SMG, 300) + ammo(AMMOTYPE_BUG, 3) + intro_weapon(WEAPON_DEVASTATOR, -1) + ammo(AMMOTYPE_DEVASTATOR, 4) + intro_weapon(WEAPON_IRSCANNER, -1) + intro_weapon(WEAPON_RTRACKER, -1) + spawn(PAD_SHO_0000) + endintro +}; + +u8 func0401_init_unarmed_skedar[] = { + set_accuracy(0) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(160) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_ailist(CHR_SELF, AILIST_UNARMED_SKEDAR) + endlist +}; + +u8 func0402_unarmed_skedar[] = { + set_shotlist(AILIST_UNARMED_SKEDAR) + set_action(MA_NORMAL, TRUE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + // Dying + label(0x2d) + set_shotlist(GAILIST_IDLE) + yield + restart_timer + + beginloop(0x11) + if_timer_gt(30, /*goto*/ 0x2d) + endloop(0x11) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) +#define LABEL_HANDLE_PHOENIX_AREA 0x5a +#define LABEL_HANDLE_WALL_AREA 0x5b + + // Alive + label(0x06) + set_action(MA_NORMAL, TRUE) + stop_chr + if_self_flag_bankx_eq(CHRFLAG0_GP1, FALSE, BANK_0, /*goto*/ 0x03) + set_action(MA_TRACKING, TRUE) + try_run_to_target(/*goto*/ 0x03) + + beginloop(0x03) + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) + if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) + if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) + label(0x2e) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2d) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2d) + if_self_flag_bankx_eq(CHRFLAG0_GP1, FALSE, BANK_0, /*goto*/ 0x2e) + if_just_injured(CHR_SELF, /*goto*/ 0x2d) + + label(0x2e) + call_rng + if_rand_gt(1, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x05, 0xff, BANK_0, 0x00, 0x00) + label(0x06) + endloop(0x03) + + // Injured or detected enemy + label(0x2d) + label(0xd9) + yield + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) + if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) + if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2e) + label(0x2e) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + if_distance_to_target_lt(150, /*goto*/ 0x2f) + label(0x54) + if_num_times_shot_lt(1, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + label(0x2d) + restart_timer + set_action(MA_WAITING, TRUE) + say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + try_walk_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) + if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) + if_timer_gt(120, /*goto*/ 0x09) + endloop(0x08) + + label(0x09) + label(0x0a) + if_chr_not_talking(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x2d) + + label(0x06) + say_quip(CHR_BOND, QUIP_ATTACK2, 0x20, 0x00, 0xff, BANK_0, 0x00, 0x00) + label(0x2d) + restart_timer + set_action(MA_TRACKING, TRUE) + try_run_to_target(/*goto*/ 0x0b) + + beginloop(0x0b) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x10) + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) + if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_target_moving_away(/*goto*/ 0x2d) + if_distance_to_target_lt(150, /*goto*/ 0x2f) + label(0x2d) + if_distance_to_target_lt(50, /*goto*/ 0x2f) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + goto_first(0x0a) + + label(0x2f) + restart_timer + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + stop_chr + set_action(MA_FACING, TRUE) + try_face_entity(ATTACKFLAG_AIMATTARGET, 1, /*goto*/ 0x0c) + + beginloop(0x0c) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x10) + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) + if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + set_action(MA_PUNCHING, TRUE) + try_punch_or_kick(/*goto*/ 0x31) + goto_first(0xd9) + + // Punching or kicking + label(0x31) + + beginloop(0x30) + if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x10) + if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) + if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x30) + + // Finished attack + label(0x06) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) + goto_first(0xd9) + + // Killed target + label(0x10) + stop_chr + unset_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + goto_first(0x03) + + // At ledge near Phoenix + label(LABEL_HANDLE_PHOENIX_AREA) + stop_chr + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + restart_timer + run_to_pad(PAD_SHO_0018) + + beginloop(0x5c) + if_chr_stopped(/*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0020, /*goto*/ 0x2d) // at T junction near Phoenix + endloop(0x5c) + + label(0x2d) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + goto_first(0x03) + + // At ledge prior to grenadable wall + label(LABEL_HANDLE_WALL_AREA) + stop_chr + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + restart_timer + run_to_pad(PAD_SHO_003C) + + beginloop(0x5c) + if_chr_stopped(/*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x0045, /*goto*/ 0x2d) // at weak wall + endloop(0x5c) + + label(0x2d) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + goto_first(0x03) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0405_puzzleroom_miniskedar_waiting[] = { + stop_chr + + beginloop(0x03) + if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) + + label(0x2e) + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x2d) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x2d) + if_just_injured(CHR_SELF, /*goto*/ 0x2d) + endloop(0x03) + + // Detected player + label(0x2d) + set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) + endlist +}; + +u8 func0403_init_miniskedar[] = { + set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) + set_accuracy(0) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_ailist(CHR_SELF, AILIST_MINISKEDAR) + endlist +}; + +u8 func0404_miniskedar[] = { + set_shotlist(AILIST_MINISKEDAR) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + // Dying + label(0x2d) + yield + restart_timer + + beginloop(0x11) + if_timer_gt(30, /*goto*/ 0x2d) + endloop(0x11) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x06) + label(0x03) + yield + if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) + + label(0x2e) + if_can_see_target(/*goto*/ 0x2d) + if_just_injured(CHR_SELF, /*goto*/ 0x2d) + + // Healthy + call_rng + say_quip(CHR_BOND, QUIP_RETREAT2, 0xff, 0x05, 0xff, BANK_0, 0x00, 0x00) + label(0x06) + label(0x06) + goto_next(0x54) + + // Injured or detected enemy + label(0x2d) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + if_distance_to_target_lt(400, /*goto*/ 0x2f) + + label(0x54) + restart_timer + label(0x09) + restart_timer + if_chr_not_talking(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + label(0x06) + try_run_to_target(/*goto*/ 0x0b) + + beginloop(0x0b) + if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) + label(0x2e) + if_can_see_target(/*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_distance_to_target_lt(400, /*goto*/ 0x2f) + label(0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + goto_first(0x09) + + label(0x2f) + restart_timer + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) + + beginloop(0x0c) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0c) + + label(0x2d) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + goto_first(0x0c) + + label(0x06) + if_distance_to_target_lt(200, /*goto*/ 0x2e) + miniskedar_try_pounce(0x04, 0x000e, /*goto*/ 0x30) + goto_first(0x03) + + beginloop(0x30) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x30) + + label(0x2d) + restart_timer + if_chr_injured_target(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + label(0x2e) + retreat(GOPOSFLAG_RUN, 1) + + beginloop(0x0d) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + goto_first(0x03) + + endlist +}; + +/** + * Spawn a clone and remove self. This function seems unnecessary. + */ +u8 func0407_init_cloaked_skedar[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) + + beginloop(0x04) + // Wait until clone dead - which it would be immediately? + chr_toggle_p1p2(CHR_SELF) + label(0x4f) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + // Spawn clone + label(0x4f) + try_spawn_clone2(CHR_SELF, AILIST_CLOAKED_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_HIDDEN, /*goto*/ 0x2d) + reloop(0x04) + + // Remove self + label(0x2d) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + yield + endloop(0x04) + + endlist +}; + +u8 func0408_cloaked_skedar[] = { + set_chr_team(CHR_SELF, TEAM_ENEMY) + rebuild_teams + rebuild_squadrons + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + restart_timer + + beginloop(0x08) + if_objective_complete(4, /*goto*/ 0x0e) + + // King is alive + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_PRESET, /*goto*/ 0x2d) + + // 1 in 256 chance of making skedar roar sound + call_rng + if_rand_gt(1, /*goto*/ 0x06) + say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x05, 0xff, BANK_0, 0x00, 0x00) + label(0x06) + endloop(0x08) + + // Player went close to cloaked skedar + label(0x2d) + unset_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, AILIST_INIT_UNARMED_SKEDAR) + + // King is dead + label(0x0e) + remove_chr(CHR_SELF) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Spawns up to 3 miniskedar clones, one at a time. + */ +u8 func0404_miniskedar_spawner[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_00040000) + set_morale(0) + + // Wait until player near trigger pad + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_PRESET, /*goto*/ 0x4f) + endloop(0x04) + + label(0x4f) + if_morale_lt(3, /*goto*/ 0x06) + goto_next(0x2e) + + label(0x06) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + label(0x4f) + try_spawn_clone2(CHR_SELF, AILIST_INIT_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + add_morale(1) + label(0x2e) + yield + endloop(0x04) + + endlist +}; + +u8 unregistered_function3[] = { + camera_movement(ANIM_CUT_SHO_BETA_CAM) + yield + set_chr_hiddenflag(0x00, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_BETA_NOCHR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x00, 4) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + endloop(0x08) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + give_object_to_chr(OBJ_TARGETAMP_BOND, CHR_BOND) + give_object_to_chr(OBJ_TARGETAMP_COOP, CHR_COOP) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + + label(0x2d) + disable_object(OBJ_TARGETAMP_COOP) + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1003_remove_random_skedar[] = { + #define remove_random(chr1, chr2) \ + call_rng \ + if_rand_gt(128, /*goto*/ 0x2d) \ + remove_chr(chr1) \ + goto_next(0x06) \ + label(0x2d) \ + remove_chr(chr2) \ + label(0x06) + + remove_random(0x05, 0x06) + remove_random(0x07, 0x08) + remove_random(0x0b, 0x0c) + remove_random(0x0f, 0x10) + remove_random(0x11, 0x12) + remove_random(0x13, 0x14) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101a_pointless[] = { + beginloop(0x04) + if_chr_death_animation_finished(CHR_KING1, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_check_army_defeated[] = { +#if VERSION >= VERSION_NTSC_1_0 + yield +#endif + + beginloop(0x04) + if_chr_death_animation_finished(0x2c, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(0x2d, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(0x2e, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(0x2f, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(0x30, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(0x31, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(0x32, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + show_hudmsg(CHR_BOND, L_SHO_029) // "Skedar secret army has been defeated." + set_stage_flag(STAGEFLAG_ARMY_DEFEATED) + + beginloop(0x91) + if_objective_complete(0, /*goto*/ 0x2d) + endloop(0x91) + + label(0x2d) + unset_object_flag2(0x45, OBJFLAG2_LOCKEDFRONT) + unset_object_flag2(0x46, OBJFLAG2_LOCKEDBACK) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_5e0c[] = { + yield + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) +#if VERSION >= VERSION_PAL_BETA + if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x41) +#else + if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x2d) +#endif + if_chr_distance_to_pad_lt(CHR_P1P2, 50, PAD_SHO_00D4, /*goto*/ 0x2d) + if_chr_in_room(CHR_P1P2, 0x00, 0x005f, /*goto*/ 0x2e) + unset_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) + endloop(0x04) + + // Crossed bridge without using puzzle piece, + // or one player crossed then another moved the piece off the pad + label(0x2e) + set_stage_flag(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE) + set_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) + +#if VERSION >= VERSION_PAL_BETA + label(0x41) + if_num_human_players_lt(2, /*goto*/ 0x2d) + unset_object_flag3(OBJ_PUZZLEROCK, OBJFLAG3_PUSHABLE) +#endif + + // Pad pressed, or follow through from above + label(0x2d) + if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE, TRUE, /*goto*/ 0x2d) + mute_channel(CHANNEL_5) + assign_sound(SFX_0436, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_PUZZLEROCK, TRUE) + + // Wait for a condition that would cause the bridge to retract + label(0x2d) + restart_timer + + beginloop(0x91) + if_stage_flag_eq(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE, TRUE, /*goto*/ 0x2d) + if_timer_gt(60, /*goto*/ 0x2e) + label(0x2d) + if_timer_lt(20, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE, TRUE, /*goto*/ 0x93) + if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x06) + if_chr_distance_to_pad_lt(CHR_P1P2, 50, PAD_SHO_00D4, /*goto*/ 0x06) + goto_next(0x2e) + + label(0x06) + reloop(0x91) + + label(0x93) + if_chr_in_room(CHR_P1P2, 0x00, 0x0057, /*goto*/ 0x06) // start side + endloop(0x91) + + // Player crossed bridge without using switch, then crossed back + label(0x06) + unset_stage_flag(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE) + unset_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) + goto_first(0x04) + + // Switch activated and bridge extended for 1 second + label(0x2e) + if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x2d) + if_chr_distance_to_pad_lt(CHR_P1P2, 50, PAD_SHO_00D4, /*goto*/ 0x2d) + + // Switch no longer pressed + mute_channel(CHANNEL_5) + assign_sound(SFX_0437, CHANNEL_5) + control_sound_from_object(CHANNEL_5, OBJ_PUZZLEROCK, TRUE) + goto_first(0x04) + + // Switch still pressed + label(0x2d) + set_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) + goto_first(0x04) + + endlist +}; + +u8 func1006_bridge[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE, TRUE, /*goto*/ 0x2d) + set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + endloop(0x04) + + label(0x2d) + unset_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + mute_channel(CHANNEL_4) + assign_sound(SFX_DOOR_8020, CHANNEL_4) + play_sound_from_object(CHANNEL_4, OBJ_BRIDGE, 1, 1200, 1600) + yield + + beginloop(0x08) + if_lift_stationary(OBJ_BRIDGE, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + mute_channel(CHANNEL_4) + assign_sound(SFX_DOOR_8027, CHANNEL_4) + control_sound_from_object(CHANNEL_4, OBJ_BRIDGE, TRUE) + set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + set_stage_flag(STAGEFLAG_BRIDGE_EXTENDED) + + beginloop(0x09) + if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE, FALSE, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + + beginloop(0x91) + if_sound_finished(CHANNEL_4, /*goto*/ 0x2d) + endloop(0x91) + + label(0x2d) + unset_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + mute_channel(CHANNEL_4) + assign_sound(SFX_DOOR_8020, CHANNEL_4) + play_sound_from_object(CHANNEL_4, OBJ_BRIDGE, 1, 1200, 1600) + yield + + beginloop(0x0b) + if_lift_stationary(OBJ_BRIDGE, /*goto*/ 0x06) + endloop(0x0b) + + label(0x06) + unset_stage_flag(STAGEFLAG_BRIDGE_EXTENDED) + set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + mute_channel(CHANNEL_4) + assign_sound(SFX_DOOR_8027, CHANNEL_4) + control_sound_from_object(CHANNEL_4, OBJ_BRIDGE, TRUE) + goto_first(0x04) + + endlist +}; + +u8 func1007_bug_throws_bond[] = { + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_BOND_THREW_FIRST_BUG, FALSE, /*goto*/ 0x55) + if_stage_flag_eq(STAGEFLAG_BOND_THREW_SECOND_BUG, FALSE, /*goto*/ 0x56) + if_stage_flag_eq(STAGEFLAG_BOND_THREW_THIRD_BUG, FALSE, /*goto*/ 0x57) + + label(0x55) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 3, /*goto*/ 0x2d) + endloop(0x03) + + // Threw first + label(0x2d) + set_stage_flag(STAGEFLAG_BOND_THREW_FIRST_BUG) + goto_next(0x0e) + + // Check for second + label(0x56) + label(0x2d) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 2, /*goto*/ 0x2d) + goto_first(0x03) + + label(0x2d) + set_stage_flag(STAGEFLAG_BOND_THREW_SECOND_BUG) + goto_next(0x0e) + + // Check for third + label(0x57) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) + goto_first(0x03) + + label(0x2d) + set_stage_flag(STAGEFLAG_BOND_THREW_THIRD_BUG) + goto_next(0x0e) + + beginloop(0x0e) + if_weapon_thrown(WEAPON_TARGETAMPLIFIER, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x2d) + if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, OBJ_PILLAR1, /*goto*/ 0x09) + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x2d) + if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, OBJ_PILLAR2, /*goto*/ 0x0b) + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x2d) + if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, OBJ_PILLAR3, /*goto*/ 0x0c) + label(0x2d) + if_timer_gt(120, /*goto*/ 0x0d) + endloop(0x08) + + label(0x09) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_PILLAR1_MARKED) + show_hudmsg(CHR_BOND, L_SHO_025) // "Target Amplifier placed correctly." + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) + goto_first(0x03) + + label(0x0b) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_PILLAR2_MARKED) + show_hudmsg(CHR_BOND, L_SHO_025) // "Target Amplifier placed correctly." + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) + goto_first(0x03) + + label(0x0c) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_PILLAR3_MARKED) + show_hudmsg(CHR_BOND, L_SHO_025) // "Target Amplifier placed correctly." + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) + goto_first(0x03) + + label(0x0d) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) + if_stage_flag_eq(STAGEFLAG_COOP_BUGS_WASTED, TRUE, /*goto*/ 0x2d) + goto_next(0x0f) + + label(0x2d) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x2e) + goto_next(0x0f) + + label(0x2e) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, FALSE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, FALSE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, FALSE, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x06) + set_stage_flag(STAGEFLAG_BOND_BUGS_WASTED) + if_stage_flag_eq(STAGEFLAG_COOP_BUGS_WASTED, FALSE, /*goto*/ 0x0f) + set_stage_flag(STAGEFLAG_BUG_WASTED) + show_hudmsg(CHR_BOND, L_SHO_026) // "Target Amplifier placed incorrectly." + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x0f) + goto_first(0x03) + + endlist +}; + +u8 func101b_bug_throws_coop[] = { + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x03) + + label(0x2d) + set_stage_flag(STAGEFLAG_COOP_BUGS_WASTED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + beginloop(0x03) + if_stage_flag_eq(STAGEFLAG_COOP_THREW_FIRST_BUG, FALSE, /*goto*/ 0x55) + if_stage_flag_eq(STAGEFLAG_COOP_THREW_SECOND_BUG, FALSE, /*goto*/ 0x56) + if_stage_flag_eq(STAGEFLAG_COOP_THREW_THIRD_BUG, FALSE, /*goto*/ 0x57) + + label(0x55) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 3, /*goto*/ 0x2d) + endloop(0x03) + + label(0x2d) + set_stage_flag(STAGEFLAG_COOP_THREW_FIRST_BUG) + goto_next(0x0e) + + label(0x56) + label(0x2d) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 2, /*goto*/ 0x2d) + goto_first(0x03) + + label(0x2d) + set_stage_flag(STAGEFLAG_COOP_THREW_SECOND_BUG) + goto_next(0x0e) + + label(0x57) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) + goto_first(0x03) + + label(0x2d) + set_stage_flag(STAGEFLAG_COOP_THREW_THIRD_BUG) + goto_next(0x0e) + + beginloop(0x0e) + if_weapon_thrown(WEAPON_TARGETAMPLIFIER, /*goto*/ 0x06) + endloop(0x0e) + + label(0x06) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x2d) + if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, 0x01, /*goto*/ 0x09) + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x2d) + if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, 0x02, /*goto*/ 0x0b) + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x2d) + if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, 0x03, /*goto*/ 0x0c) + label(0x2d) + if_timer_gt(120, /*goto*/ 0x0d) + endloop(0x08) + + label(0x09) + unset_object_flag3(OBJ_PILLAR1, OBJFLAG3_RTRACKED_YELLOW) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_PILLAR1_MARKED) + show_hudmsg(CHR_COOP, L_SHO_025) // "Target Amplifier placed correctly." + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) + goto_first(0x03) + + label(0x0b) + unset_object_flag3(OBJ_PILLAR2, OBJFLAG3_RTRACKED_YELLOW) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_PILLAR2_MARKED) + show_hudmsg(CHR_COOP, L_SHO_025) // "Target Amplifier placed correctly." + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) + goto_first(0x03) + + label(0x0c) + unset_object_flag3(OBJ_PILLAR3, OBJFLAG3_RTRACKED_YELLOW) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x0d) + set_stage_flag(STAGEFLAG_PILLAR3_MARKED) + show_hudmsg(CHR_COOP, L_SHO_025) // "Target Amplifier placed correctly." + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) + goto_first(0x03) + + label(0x0d) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) + goto_next(0x0f) + + label(0x2d) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) + goto_next(0x0f) + + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, FALSE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, FALSE, /*goto*/ 0x06) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, FALSE, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x06) + set_stage_flag(STAGEFLAG_COOP_BUGS_WASTED) + if_self_flag_bankx_eq(CHRFLAG0_UNDERCOVER, FALSE, BANK_0, /*goto*/ 0x0f) + set_stage_flag(STAGEFLAG_BUG_WASTED) + show_hudmsg(CHR_COOP, L_SHO_026) // "Target Amplifier placed incorrectly." + + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x0f) + goto_first(0x03) + + endlist +}; + +u8 func1008_lock_door[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + goto_next(0x04) + + // A + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA and PA + label(0x04) + yield + lock_door(0x09, 0x02) + lock_door(0x0a, 0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_altar[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0f) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_object_flag2(OBJ_ALTAR, OBJFLAG2_REMOVEWHENDESTROYED, /*goto*/ 0x2d) + if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_SHO_0137, /*goto*/ 0x2e) + label(0x2d) + if_chr_activated_object(CHR_P1P2, OBJ_ALTAR, /*goto*/ 0x06) + endloop(0x08) + + // Activated + label(0x06) + + // Altar has flag + label(0x2d) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_DEVASTATOR, /*goto*/ 0x92) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_CALLISTO, /*goto*/ 0x93) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_FALCON2_SCOPE, /*goto*/ 0x94) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_SLAYER, /*goto*/ 0x95) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_MAULER, /*goto*/ 0x96) + + // At pad, or invalid weapon equipped + label(0x2e) + set_object_flag2(OBJ_ALTAR, OBJFLAG2_REMOVEWHENDESTROYED) + show_hudmsg(CHR_P1P2, L_SHO_051) // "Make your sacrifice to the God of War." + restart_timer + + beginloop(0x91) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x91) + + label(0x06) + goto_first(0x08) + + label(0x92) + unset_object_flag2(OBJ_ALTAR_DEVASTATOR, OBJFLAG2_INVISIBLE) + goto_next(0x2d) + + label(0x93) + unset_object_flag2(OBJ_ALTAR_CALLISTO, OBJFLAG2_INVISIBLE) + goto_next(0x2d) + + label(0x94) + unset_object_flag2(OBJ_ALTAR_FALCON, OBJFLAG2_INVISIBLE) + goto_next(0x2d) + + label(0x95) + unset_object_flag2(OBJ_ALTAR_SLAYER, OBJFLAG2_INVISIBLE) + goto_next(0x2d) + + label(0x96) + unset_object_flag2(OBJ_ALTAR_MAULER, OBJFLAG2_INVISIBLE) + goto_next(0x2d) + + label(0x2d) + play_sound(SFX_80AA, -1) + chr_drop_weapon(VERSION >= VERSION_NTSC_1_0 ? CHR_P1P2 : CHR_BOND) + label(0x04) + yield + label(0x2d) + label(0x0f) + unlock_door(0x09, 0x02) + unlock_door(0x0a, 0x02) + set_lights_state(0x0060, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0061, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0062, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0063, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0064, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0065, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0066, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0067, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0068, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0069, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x006a, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x006b, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x006c, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x006d, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x006e, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x006f, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0070, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0071, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0072, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0073, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0074, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0075, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0076, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0077, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0078, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x0079, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x007a, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x007b, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x007c, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x007d, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x007e, LIGHTOP_3, 0x06, 0x80, 0x78) + set_lights_state(0x007f, LIGHTOP_3, 0x06, 0x80, 0x78) + restart_timer + + beginloop(0x0e) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x0e) + + label(0x2d) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + show_hudmsg(CHR_P1P2, L_SHO_027) // "Generator has been reactivated." + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This function would have cycled the lights every 20 seconds, but the cycling + * part has been disabled. + */ +u8 func101c_setup_corridor_lighting[] = { + label(0x59) + restart_timer + label(0x04) + yield + label(0x2d) + set_lights_state(0x0060, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0061, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0062, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0063, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0064, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0065, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0066, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0067, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0068, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0069, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x006a, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x006b, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x006c, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x006d, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x006e, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x006f, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0070, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0071, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0072, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0073, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0074, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0076, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0078, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0079, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x007a, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x007b, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x007c, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x007d, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x007e, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x007f, LIGHTOP_1, 0x06, 0x00, 0x00) + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + + // The rest of this function is unreachable + restart_timer + + beginloop(0x08) + if_timer_gt(1200, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + set_lights_state(0x0060, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0061, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0062, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0063, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0064, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0065, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0066, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0067, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0068, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0069, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x006a, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x006b, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x006c, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x006d, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x006e, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x006f, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0070, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0071, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0072, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0073, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0074, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0075, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0076, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0077, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0078, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0079, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x007a, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x007b, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x007c, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x007d, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x007e, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x007f, LIGHTOP_3, 0x06, 0xff, 0x78) + goto_first(0x59) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040a_init_reaper_slayer_skedar[] = { + set_accuracy(20) + set_reaction_speed(75) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(160) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, AILIST_REAPER_SLAYER_SKEDAR) + endlist +}; + +u8 func0409_reaper_slayer_skedar[] = { +#if VERSION >= VERSION_NTSC_1_0 + unset_self_chrflag(CHRCFLAG_HIDDEN) +#endif + set_shotlist(AILIST_REAPER_SLAYER_SKEDAR) + if_chr_deadish(CHR_SELF, /*goto*/ 0x06) + goto_next(0x2d) + + // Dying + label(0x06) + set_shotlist(GAILIST_IDLE) + restart_timer + + beginloop(0x5d) + if_timer_gt(15, /*goto*/ 0x06) + endloop(0x5d) + + label(0x06) + say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alive + label(0x2d) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x08) + + // Injured + label(0x06) + set_view_distance(100) + + // Healthy + label(0x08) + set_self_chrflag(CHRCFLAG_00000040) + label(0x5e) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) + set_target_chr(CHR_BOND) + try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x5f) + label(0x06) + kneel + + beginloop(0x5f) + chr_toggle_p1p2(CHR_SELF) + label(0x2d) + set_target_chr(CHR_P1P2) + if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x60) + label(0x2e) + if_target_outside_my_yvisang(/*goto*/ 0x06) + if_target_in_sight(/*goto*/ 0x60) + label(0x06) + if_just_injured(CHR_SELF, /*goto*/ 0x58) + label(0x2d) + if_saw_injury(0x00, /*goto*/ 0x60) + if_near_miss(/*goto*/ 0x61) + label(0x2d) + set_target_chr(CHR_P1P2) + endloop(0x5f) + + label(0x06) + if_target_outside_my_yvisang(/*goto*/ 0x2d) + if_target_in_sight(/*goto*/ 0x60) + label(0x2d) + set_target_chr(CHR_BOND) + goto_first(0x5f) + + label(0x60) + if_can_see_target(/*goto*/ 0x2d) + goto_first(0x5e) + + label(0x58) + label(0x2d) + set_view_distance(100) + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2d) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) + label(0x2d) + goto_next(0x71) + + // Unreachable + try_attack_amount(90, 100) + + beginloop(0x64) + if_chr_stopped(/*goto*/ 0x63) + endloop(0x64) + + label(0x63) + restart_timer + stop_chr + + beginloop(0x65) + if_chr_weapon_equipped(CHR_SELF, WEAPON_SLAYER, /*goto*/ 0x2e) + if_timer_gt(120, /*goto*/ 0x2d) + + label(0x2e) + if_timer_gt(200, /*goto*/ 0x2d) + endloop(0x65) + + label(0x2d) + label(0x06) + goto_first(0x5e) + + label(0x61) + set_view_distance(100) + restart_timer + if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x6a) + set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) + + label(0x6a) + call_rng + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_outside_my_yvisang(/*goto*/ 0x06) + if_target_in_sight(/*goto*/ 0x6b) + label(0x06) + if_timer_gt(60, /*goto*/ 0x6c) + if_rand_lt(4, /*goto*/ 0x6c) + goto_first(0x6a) + + label(0x6c) + if_can_see_target(/*goto*/ 0x6b) + goto_first(0x5e) + + label(0x6b) + goto_first(0x60) + + label(0x6d) + restart_timer + + beginloop(0x6e) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x6b) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x6e) + + label(0x06) + goto_first(0x5e) + + label(0x6b) + goto_first(0x60) + + label(0x71) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ 0x72) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x70) + label(0x70) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x72) + try_attack_amount(40, 60) + label(0x06) + goto_first(0x64) + + label(0x2d) + goto_first(0x63) + + endlist +}; + +u8 func100a_army_room[] = { +#if VERSION >= VERSION_NTSC_1_0 + yield +#endif + set_lights_state(0x0082, LIGHTOP_1, 0x06, 0x00, 0x00) + set_lights_state(0x0087, LIGHTOP_1, 0x06, 0x00, 0x00) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0082, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + close_door(0x0d) + close_door(0x0e) + close_door(0x0f) + close_door(0x10) + if_objective_complete(0, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + lock_door(0x0d, 0x02) + lock_door(0x0e, 0x02) + lock_door(0x0f, 0x02) + lock_door(0x10, 0x02) + label(0x06) + restart_timer + + beginloop(0x08) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + set_lights_state(0x0082, LIGHTOP_3, 0x06, 0xff, 0x78) + set_lights_state(0x0087, LIGHTOP_3, 0x06, 0xff, 0x78) + set_stage_flag(STAGEFLAG_TRIGGER_SKEDAR_ARMY) + play_x_track(XREASON_DEFAULT, 10, 60) + set_ailist(CHR_SELF, GAILIST_IDLE) + goto_first(0x04) + + endlist +}; + +u8 func100b_check_sanctum_accessed[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x007a, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + show_hudmsg(CHR_P1P2, L_SHO_028) // "Skedar Inner Sanctum has been reached." + set_stage_flag(STAGEFLAG_ACCESSED_SANCTUM) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040b_mauler_skedar[] = { + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_accuracy(20) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(50) + set_recovery_speed(0) + set_shield(0) + + beginloop(0x04) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + set_alertness(100) + set_target_chr(CHR_BOND) + try_jog_to_target(/*goto*/ 0x2d) + label(0x2d) + set_shotlist(GAILIST_COMBAT_WITH_TARGET) + set_returnlist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_wake_skedar_army[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_SKEDAR_ARMY, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + + #define enable_army_skedar(chr, loopid) \ + restart_timer \ + set_chr_flag_bankx(chr, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) \ + beginloop(loopid) \ + if_timer_gt(500, /*goto*/ 0x2d) \ + endloop(loopid) \ + label(0x2d) + + enable_army_skedar(0x2e, 0x08) + enable_army_skedar(0x31, 0x09) + enable_army_skedar(0x2c, 0x0b) + enable_army_skedar(0x2f, 0x0c) + enable_army_skedar(0x2d, 0x0d) + enable_army_skedar(0x32, 0x0e) + enable_army_skedar(0x30, 0x0f) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_king_waiting[] = { + set_shield(500) + set_accuracy(100) + set_chr_chrflag(CHR_SELF, CHRCFLAG_RUNFASTER) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) + if_difficulty_gt(DIFF_A, /*goto*/ 0x2d) + set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) + label(0x2d) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) + set_morale(0) + + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) +#if VERSION >= VERSION_NTSC_1_0 + stop_x_track(-1) +#endif + play_track_isolated(MUSIC_SKEDARRUINS_KING) + restart_timer + + beginloop(0x09) + if_timer_gt(300, /*goto*/ 0x2d) + endloop(0x09) + + label(0x2d) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, AILIST_KING_COMBAT) + endlist +}; + +/** + * morale tracks how many rockets have been fired in a row. + */ +u8 func040d_king_combat[] = { +#define LABEL_MAINLOOP 0x03 +#define LABEL_PLAYER_DEAD 0x11 +#define LABEL_FIRE_ROCKET 0x73 +#define LABEL_SPAWN_SKEDAR 0x74 +#define LABEL_SPAWN_MINISKEDAR 0x75 +#define LABEL_CLOAK 0x76 +#define LABEL_LOW_SHIELD 0x7c + + beginloop(0x59) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_attack_target(/*goto*/ 0x03) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + endloop(0x59) + + // Main loop + label(LABEL_MAINLOOP) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) + + beginloop(0x04) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_stage_flag_eq(STAGEFLAG_KING_SKEDAR_CLONE_EXISTS, TRUE, /*goto*/ 0x2d) + if_stage_flag_eq(STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS, TRUE, /*goto*/ 0x2d) + + // No clones exist + call_rng + if_rand_gt(200, /*goto*/ 0x79) + if_morale_lt(2, /*goto*/ 0x06) + goto_next(0x2d) + + label(0x06) + goto_next(LABEL_FIRE_ROCKET) + + label(0x79) + if_rand_gt(237, /*goto*/ 0x07) + if_rand_gt(218, /*goto*/ 0x06) + goto_next(LABEL_SPAWN_MINISKEDAR) + + label(0x06) + goto_next(LABEL_SPAWN_SKEDAR) + + label(0x07) + goto_next(LABEL_CLOAK) + + label(0x2d) + endloop(0x04) + + // + // Run to side and fire a rocket + // + label(LABEL_FIRE_ROCKET) + restart_timer + if_chr_distance_to_pad_lt(CHR_SELF, 300, PAD_SHO_0098, /*goto*/ 0x06) + jog_to_pad(PAD_SHO_0098) // left side (when facing king) + goto_next(0x7f) + + label(0x06) + restart_timer + jog_to_pad(PAD_SHO_0097) // right side + + beginloop(0x7f) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x7f) + + label(0x2d) + set_self_chrflag(CHRCFLAG_00000040) + + beginloop(0x7a) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_can_see_attack_target(/*goto*/ 0x06) + endloop(0x7a) + + label(0x06) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x70) + label(0x70) + say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x7b) + goto_next(0x2d) + + label(0x06) + goto_first(LABEL_MAINLOOP) + + // Shoot successful + beginloop(0x7b) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x7b) + + label(0x2d) + add_morale(1) + goto_first(LABEL_MAINLOOP) + + // + // Spawn skedar + // + label(LABEL_SPAWN_SKEDAR) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_morale(0) + restart_timer + chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x66) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x66) + + label(0x2d) + set_chr_flag_bankx(CHR_KING_SKEDAR_SPAWNER, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + goto_first(LABEL_MAINLOOP) + + // + // Spawn miniskedar + // + label(LABEL_SPAWN_MINISKEDAR) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_morale(0) + restart_timer + chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x67) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x67) + + label(0x2d) + set_chr_flag_bankx(CHR_KING_MINISKEDAR_SPAWNER, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + goto_first(LABEL_MAINLOOP) + + // + // Cloak and warp to player for hand combat + // + label(LABEL_CLOAK) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_morale(0) + restart_timer + chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + + beginloop(0x68) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x68) + + label(0x2d) + try_set_padpreset_to_target_quadrant(QUADRANT_BACK, /*goto*/ 0x2d) + try_set_padpreset_to_target_quadrant(QUADRANT_SIDE1, /*goto*/ 0x2d) + try_set_padpreset_to_target_quadrant(QUADRANT_SIDE2, /*goto*/ 0x2d) + goto_next(0x88) + + label(0x2d) + chr_move_to_pad(CHR_SELF, PAD_PRESET, 0x00, /*goto*/ 0x2d) + goto_next(0x88) + + label(0x2d) + set_countdown_timer(7) + start_countdown_timer + + label(0x8a) + restart_timer + try_run_to_target(/*goto*/ 0x08) + + beginloop(0x08) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ 0x0b) + if_timer_gt(20, /*goto*/ 0x89) + if_distance_to_target_lt(150, /*goto*/ 0x06) + endloop(0x08) + + // Unreachable + label(0x2d) + goto_next(0x88) + + // Every 20 frames - check countdown timer + label(0x89) + if_countdown_timer_lt(1, /*goto*/ 0x2d) + goto_first(0x8a) + + // Been chasing player while cloaked for 7 seconds + label(0x2d) + goto_next(0x88) + + // Distance to player < 150 + label(0x06) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + restart_timer + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + stop_chr + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) + + beginloop(0x09) + if_chr_death_animation_finished(CHR_P1P2, /*goto*/ 0x0b) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_target_out_of_fov_left(246, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x2d) + goto_next(0x87) + + label(0x06) + try_punch_or_kick(/*goto*/ 0x0b) + goto_next(0x87) + + beginloop(0x0b) + if_chr_stopped(/*goto*/ 0x2d) + endloop(0x0b) + + label(0x2d) + restart_timer + set_chr_cloaked(CHR_SELF, TRUE, TRUE) + + beginloop(0x0d) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x0d) + + label(0x2d) + label(0x88) + stop_chr + chr_move_to_pad(CHR_SELF, PAD_SHO_0097, 0x00, /*goto*/ 0x87) + chr_move_to_pad(CHR_SELF, PAD_SHO_0096, 0x00, /*goto*/ 0x87) + chr_move_to_pad(CHR_SELF, PAD_SHO_0098, 0x00, /*goto*/ 0x87) + + label(0x87) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + restart_timer + + beginloop(0x85) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x85) + + label(0x2d) + goto_first(LABEL_MAINLOOP) + + // Unreachable - nothing jumps here + label(0x77) + say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) + set_morale(0) + restart_timer + chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x69) + if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x69) + + label(0x2d) + goto_first(LABEL_MAINLOOP) + + // Shield < 20 + label(LABEL_LOW_SHIELD) + say_quip(CHR_BOND, QUIP_GOTOCOVER1, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00) + jog_to_pad(PAD_SHO_0096) + + beginloop(0x7d) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x7d) + + label(0x06) + restart_timer + set_stage_flag(STAGEFLAG_SPIKES_VULNERABLE) + chr_do_animation(ANIM_0351, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x7e) + if_stage_flag_eq(STAGEFLAG_SPIKE_DESTROYED, TRUE, /*goto*/ 0x06) + if_timer_gt(500, /*goto*/ 0x06) + endloop(0x7e) + + label(0x06) + stop_chr + unset_stage_flag(STAGEFLAG_SPIKE_DESTROYED) + if_stage_flag_eq(STAGEFLAG_SPIKE4_DESTROYED, TRUE, /*goto*/ 0x83) + if_stage_flag_eq(STAGEFLAG_SPIKE3_DESTROYED, TRUE, /*goto*/ 0x82) + if_stage_flag_eq(STAGEFLAG_SPIKE2_DESTROYED, TRUE, /*goto*/ 0x81) + if_stage_flag_eq(STAGEFLAG_SPIKE1_DESTROYED, TRUE, /*goto*/ 0x80) + + set_shield(500) + goto_next(0x06) + + label(0x80) + set_shield(400) + goto_next(0x06) + + label(0x81) + set_shield(300) + goto_next(0x06) + + label(0x82) + set_shield(200) + goto_next(0x06) + + label(0x83) + set_shield(100) + + label(0x06) + unset_stage_flag(STAGEFLAG_SPIKES_VULNERABLE) + goto_first(LABEL_MAINLOOP) + + // Player dead + label(LABEL_PLAYER_DEAD) + goto_first(0x59) + + endlist +}; + +u8 func040e_king_skedar_spawner[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_INVINCIBLE) +#endif + set_self_chrflag(CHRCFLAG_00040000) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) + + beginloop(0x04) + if_chr_deadish(CHR_CLONE, /*goto*/ 0x2d) + goto_next(0x06) + + // Clone dead + label(0x2d) + unset_stage_flag(STAGEFLAG_KING_SKEDAR_CLONE_EXISTS) + + label(0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x4f) + reloop(0x04) + + label(0x4f) + if_chr_deadish(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + label(0x4f) + try_spawn_clone2(CHR_SELF, AILIST_INIT_KING_SKEDAR_CLONE, SPAWNFLAG_00000010, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_stage_flag(STAGEFLAG_KING_SKEDAR_CLONE_EXISTS) + yield + endloop(0x04) + + endlist +}; + +u8 func0410_init_king_skedar_clone[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) + yield + try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x20000000, /*goto*/ 0x06) + label(0x06) + yield + yield + yield + yield + unset_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, AILIST_INIT_UNARMED_SKEDAR) + endlist +}; + +u8 func0411_king_miniskedar_spawner[] = { + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_INVINCIBLE) +#endif + set_self_chrflag(CHRCFLAG_00040000) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) + + beginloop(0x04) + if_chr_deadish(CHR_CLONE, /*goto*/ 0x2d) + goto_next(0x06) + + // Clone dead + label(0x2d) + unset_stage_flag(STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS) + label(0x06) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x4f) + reloop(0x04) + + // Clone dead and flag set + // Redundant check + label(0x4f) + if_chr_deadish(CHR_CLONE, /*goto*/ 0x4f) + reloop(0x04) + + // Spawn clone + label(0x4f) + try_spawn_clone2(CHR_SELF, AILIST_INIT_KING_MINISKEDAR_CLONE, SPAWNFLAG_00000010, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_stage_flag(STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS) + yield + endloop(0x04) + + endlist +}; + +u8 func0412_init_king_miniskedar_clone[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) + yield + try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x20000000, /*goto*/ 0x06) + label(0x06) + yield + yield + yield + yield + unset_self_chrflag(CHRCFLAG_HIDDEN) + set_chr_cloaked(CHR_SELF, FALSE, TRUE) + set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) + endlist +}; + +u8 func100f_spikes_vulnerability[] = { + set_object_flag2(OBJ_SPIKE_ML, OBJFLAG2_00000002 | OBJFLAG2_00200000) + set_object_flag2(OBJ_SPIKE_MR, OBJFLAG2_00000002 | OBJFLAG2_00200000) + set_object_flag2(OBJ_SPIKE_BL, OBJFLAG2_00000002 | OBJFLAG2_00200000) + set_object_flag2(OBJ_SPIKE_BR, OBJFLAG2_00000002 | OBJFLAG2_00200000) + set_object_flag2(OBJ_SPIKE_T, OBJFLAG2_00000002 | OBJFLAG2_00200000) + + beginloop(0x91) + if_stage_flag_eq(STAGEFLAG_IN_INTRO, FALSE, /*goto*/ 0x86) + endloop(0x91) + + label(0x86) + label(0x03) + set_object_flag(OBJ_SPIKE_ML, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_SPIKE_MR, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_SPIKE_BL, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_SPIKE_BR, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_SPIKE_T, OBJFLAG_INVINCIBLE) + set_object_flag3(OBJ_SPIKE_ML, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + set_object_flag3(OBJ_SPIKE_MR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + set_object_flag3(OBJ_SPIKE_BL, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + set_object_flag3(OBJ_SPIKE_BR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + set_object_flag3(OBJ_SPIKE_T, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_SPIKES_VULNERABLE, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + unset_object_flag(OBJ_SPIKE_ML, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_SPIKE_MR, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_SPIKE_BL, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_SPIKE_BR, OBJFLAG_INVINCIBLE) + unset_object_flag3(OBJ_SPIKE_ML, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + unset_object_flag3(OBJ_SPIKE_MR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + unset_object_flag3(OBJ_SPIKE_BL, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + unset_object_flag3(OBJ_SPIKE_BR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + + if_stage_flag_eq(STAGEFLAG_SPIKE1_DESTROYED, FALSE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_SPIKE2_DESTROYED, FALSE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_SPIKE3_DESTROYED, FALSE, /*goto*/ 0x08) + if_stage_flag_eq(STAGEFLAG_SPIKE4_DESTROYED, FALSE, /*goto*/ 0x08) + unset_object_flag(OBJ_SPIKE_T, OBJFLAG_INVINCIBLE) + unset_object_flag3(OBJ_SPIKE_T, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_SPIKES_VULNERABLE, FALSE, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + goto_first(0x03) + + endlist +}; + +#define wait_for_spike_destroyed(spike, shadow, noshadow) \ + beginloop(0x03) \ + if_object_in_good_condition(spike, /*goto*/ 0x2d) \ + goto_next(0x06) \ + \ + label(0x2d) \ + endloop(0x03) \ + \ + label(0x06) \ + set_object_flag2(shadow, OBJFLAG2_INVISIBLE) \ + unset_object_flag2(noshadow, OBJFLAG2_INVISIBLE) + +u8 func1010_spike_ml[] = { + wait_for_spike_destroyed(OBJ_SPIKE_ML, OBJ_SPIKE_SHAD_ML, OBJ_SPIKE_NOSHAD_ML) + set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) + endlist +}; + +u8 func1011_spike_mr[] = { + wait_for_spike_destroyed(OBJ_SPIKE_MR, OBJ_SPIKE_SHAD_MR, OBJ_SPIKE_NOSHAD_MR) + set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) + endlist +}; + +u8 func1012_spike_bl[] = { + wait_for_spike_destroyed(OBJ_SPIKE_BL, OBJ_SPIKE_SHAD_BL, OBJ_SPIKE_NOSHAD_BL) + set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) + endlist +}; + +u8 func1013_spike_br[] = { + wait_for_spike_destroyed(OBJ_SPIKE_BR, OBJ_SPIKE_SHAD_BR, OBJ_SPIKE_NOSHAD_BR) + set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) + endlist +}; + +u8 func1014_spike_top[] = { + wait_for_spike_destroyed(OBJ_SPIKE_T, OBJ_SPIKE_SHAD_T, OBJ_SPIKE_NOSHAD_T) + + set_stage_flag(STAGEFLAG_SPIKE5_DESTROYED) + yield + if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x06) + + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040f_update_spike_stageflags[] = { + if_stage_flag_eq(STAGEFLAG_SPIKE1_DESTROYED, TRUE, /*goto*/ 0x09) + set_stage_flag(STAGEFLAG_SPIKE1_DESTROYED) + set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x09) + if_stage_flag_eq(STAGEFLAG_SPIKE2_DESTROYED, TRUE, /*goto*/ 0x0b) + set_stage_flag(STAGEFLAG_SPIKE2_DESTROYED) + set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x0b) + if_stage_flag_eq(STAGEFLAG_SPIKE3_DESTROYED, TRUE, /*goto*/ 0x0c) + set_stage_flag(STAGEFLAG_SPIKE3_DESTROYED) + set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x0c) + set_stage_flag(STAGEFLAG_SPIKE4_DESTROYED) + set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c00_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_SKEDARRUINS_INTRO) + set_stage_flag(STAGEFLAG_IN_INTRO) + set_chr_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER) + set_chr_chrflag(CHR_KING2, CHRCFLAG_HIDDEN) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_01) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x08) + + label(0x86) + if_controller_button_pressed(/*goto*/ 0x86) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_02) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_ELVIS_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_CALLISTO, WEAPON_NONE) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x09) + + label(0x86) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + if_controller_button_pressed(/*goto*/ 0x86) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_03) + + set_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x37, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x37, 4) + + set_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x38, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x38, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR2_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x38, 4) + + set_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x39, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x39, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR3_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x39, 4) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x0b) + + label(0x86) + unset_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) + if_controller_button_pressed(/*goto*/ 0x86) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_04) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_ELVIS_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_DEVASTATOR, WEAPON_NONE) + + beginloop(0x0c) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x0c) + + label(0x86) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + if_controller_button_pressed(/*goto*/ 0x86) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_05) + + set_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x37, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x37, 4) + + set_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x38, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x38, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR2_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x38, 4) + + set_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x39, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x39, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR3_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x39, 4) + + set_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x3a, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x3a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR4_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x3a, 4) + + beginloop(0x0d) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x0d) + + label(0x86) + unset_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) + if_controller_button_pressed(/*goto*/ 0x86) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_06) + + enable_object(0x36) + set_object_flag2(0x36, OBJFLAG2_04000000) + set_object_flag3(0x36, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_INTRO_SKSHUTTLE_01, 0x36, 0x01, 0xffff) + object_set_modelpart_visible(0x36, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + + beginloop(0x0e) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x0e) + + label(0x86) + disable_object(0x36) + if_controller_button_pressed(/*goto*/ 0x86) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_07) + + set_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x37, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR1_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x37, 4) + + set_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x38, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x38, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR2_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x38, 4) + + set_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x39, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x39, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR3_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x39, 4) + + set_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x3a, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x3a, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR4_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x3a, 4) + + unset_chr_chrflag(CHR_KING2, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_KING2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_KING2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_KING2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_KING, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_KING2, 4) + + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + + beginloop(0x0f) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x0f) + + label(0x86) + unset_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_KING2, CHRCFLAG_UNPLAYABLE) + camera_movement(ANIM_CUT_SHO_INTRO_CAM_08) + cmd0175(60) + if_controller_button_pressed(/*goto*/ 0x86) + + enable_object(0x36) + set_object_flag2(0x36, OBJFLAG2_04000000) + set_object_flag3(0x36, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_INTRO_SKSHUTTLE_02, 0x36, 0x04, 0xffff) + object_set_modelpart_visible(0x36, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + beginloop(0x10) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x10) + + label(0x86) + unset_stage_flag(STAGEFLAG_IN_INTRO) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER) + mute_channel(CHANNEL_7) + label(0x06) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_INTRO_JO_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + disable_object(0x36) + remove_chr(0x37) + remove_chr(0x38) + remove_chr(0x39) + remove_chr(0x3a) + remove_chr(CHR_KING2) + unset_chr_chrflag(CHR_KING1, CHRCFLAG_HIDDEN) + set_ailist(CHR_KING1, AILIST_KING_WAITING) + set_object_flag2(0x2a, OBJFLAG2_04000000) + set_object_flag2(0x2b, OBJFLAG2_04000000) + set_object_flag2(0x2c, OBJFLAG2_04000000) + set_object_flag2(0x2d, OBJFLAG2_04000000) + set_object_flag2(0x2e, OBJFLAG2_04000000) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + stop_cutscene_track + stop_ambient_track + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0414_outro_from_menu[] = { + set_ailist(CHR_ELVIS, GAILIST_IDLE) +#if VERSION >= VERSION_NTSC_1_0 + disable_object(OBJ_SPIKE_ML) + disable_object(OBJ_SPIKE_MR) + disable_object(OBJ_SPIKE_BL) + disable_object(OBJ_SPIKE_BR) +#endif + set_ailist(CHR_SELF, AILIST_OUTRO) + endlist +}; + +u8 func0414_outro[] = { + if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) + set_target_chr(CHR_BOND) + goto_next(0x06) + + label(0x2d) + set_target_chr(CHR_COOP) + + label(0x06) + set_chr_chrflag(CHR_TARGET, CHRCFLAG_KILLCOUNTABLE) + camera_movement(ANIM_CUT_SHO_OUTRO_CAM_01) + play_cutscene_track(MUSIC_SKEDARRUINS_OUTRO) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_ailist(CHR_TARGET, GAILIST_IDLE) + remove_chr(0x05) + remove_chr(0x06) + remove_chr(0x07) + remove_chr(0x08) + remove_chr(0x09) + remove_chr(0x0a) + remove_chr(0x0b) + remove_chr(0x0c) + remove_chr(0x0d) + remove_chr(0x0e) + remove_chr(0x17) + remove_chr(0x0f) + remove_chr(0x10) + remove_chr(0x0d) + remove_chr(0x1c) + remove_chr(0x18) + remove_chr(0x19) + remove_chr(0x1a) + remove_chr(0x11) + remove_chr(0x12) + remove_chr(0x13) + remove_chr(0x14) + remove_chr(0x1b) + remove_chr(0x15) + remove_chr(0x16) + remove_chr(0x1d) + remove_chr(0x1e) + remove_chr(0x1f) + set_ailist(CHR_KING1, GAILIST_IDLE) + + set_chr_chrflag(CHR_KING1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_KING1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_KING1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_OUTRO_KING_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_KING1, 4) + + object_do_animation(ANIM_CUT_SHO_OUTRO_SPIKE_01, OBJ_SPIKE_T, 0x04, 0xffff) + set_stage_flag(STAGEFLAG_IN_OUTRO) + show_nonessential_chrs(FALSE) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x08) + + label(0x86) + camera_movement(ANIM_CUT_SHO_OUTRO_CAM_02) + + set_chr_chrflag(CHR_KING1, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_KING1, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_KING1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_OUTRO_KING_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_KING1, 4) + + set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_OUTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) + + object_do_animation(ANIM_CUT_SHO_OUTRO_SPIKE_02, OBJ_SPIKE_T, 0x04, 0xffff) + + enable_object(0x37) + set_object_flag2(0x37, OBJFLAG2_04000000) + set_object_flag3(0x37, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE05, 0x37, 0x04, 0xffff) + + enable_object(0x38) + set_object_flag2(0x38, OBJFLAG2_04000000) + set_object_flag3(0x38, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE06, 0x38, 0x04, 0xffff) + + enable_object(0x39) + set_object_flag2(0x39, OBJFLAG2_04000000) + set_object_flag3(0x39, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE07, 0x39, 0x04, 0xffff) + + enable_object(0x3a) + set_object_flag2(0x3a, OBJFLAG2_04000000) + set_object_flag3(0x3a, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE08, 0x3a, 0x04, 0xffff) + + enable_object(0x3b) + set_object_flag2(0x3b, OBJFLAG2_04000000) + set_object_flag3(0x3b, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE09, 0x3b, 0x04, 0xffff) + enable_object(0x3c) + + set_object_flag2(0x3c, OBJFLAG2_04000000) + set_object_flag3(0x3c, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE10, 0x3c, 0x04, 0xffff) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x09) + + label(0x86) + disable_object(0x3c) + camera_movement(ANIM_CUT_SHO_OUTRO_CAM_03) + + set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_OUTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) + + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_SHO_OUTRO_ELVIS_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + + enable_object(0x23) + set_object_flag2(0x23, OBJFLAG2_04000000) + set_object_flag3(0x23, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE01, 0x23, 0x04, 0xffff) + + enable_object(0x24) + set_object_flag2(0x24, OBJFLAG2_04000000) + set_object_flag3(0x24, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE02, 0x24, 0x04, 0xffff) + + enable_object(0x25) + set_object_flag2(0x25, OBJFLAG2_04000000) + set_object_flag3(0x25, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE03, 0x25, 0x04, 0xffff) + + enable_object(0x26) + set_object_flag2(0x26, OBJFLAG2_04000000) + set_object_flag3(0x26, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE04, 0x26, 0x04, 0xffff) + + beginloop(0x0b) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x86) + + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x86) + label(0x2d) + endloop(0x0b) + + label(0x86) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_KILLCOUNTABLE) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_KILLCOUNTABLE) + unset_stage_flag(STAGEFLAG_IN_OUTRO) + disable_object(0x23) + disable_object(0x24) + disable_object(0x25) + disable_object(0x26) + label(0x06) + stop_cutscene_track + stop_ambient_track + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0413_hide[] = { + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1015_msg_specialpillars[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0026, /*goto*/ 0x91) + if_chr_in_room(CHR_P1P2, 0x00, 0x0031, /*goto*/ 0x92) + if_chr_in_room(CHR_P1P2, 0x00, 0x0035, /*goto*/ 0x93) + if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x94) + if_chr_in_room(CHR_P1P2, 0x00, 0x000e, /*goto*/ 0x95) + endloop(0x04) + + label(0x91) + if_object_in_room(0x01, 0x0026, /*goto*/ 0x2d) + if_object_in_room(0x02, 0x0026, /*goto*/ 0x2d) + if_object_in_room(0x03, 0x0026, /*goto*/ 0x2d) + goto_first(0x04) + + label(0x92) + if_object_in_room(0x01, 0x0031, /*goto*/ 0x2d) + if_object_in_room(0x02, 0x0031, /*goto*/ 0x2d) + if_object_in_room(0x03, 0x0031, /*goto*/ 0x2d) + goto_first(0x04) + + label(0x93) + if_object_in_room(0x01, 0x0037, /*goto*/ 0x2d) + if_object_in_room(0x02, 0x0037, /*goto*/ 0x2d) + if_object_in_room(0x03, 0x0037, /*goto*/ 0x2d) + goto_first(0x04) + + label(0x94) + if_object_in_room(0x01, 0x002b, /*goto*/ 0x2d) + if_object_in_room(0x02, 0x002b, /*goto*/ 0x2d) + if_object_in_room(0x03, 0x002b, /*goto*/ 0x2d) + goto_first(0x04) + + label(0x95) + if_object_in_room(0x01, 0x000d, /*goto*/ 0x2d) + if_object_in_room(0x02, 0x000d, /*goto*/ 0x2d) + if_object_in_room(0x03, 0x000d, /*goto*/ 0x2d) + goto_first(0x04) + + label(0x2d) + speak(CHR_P1P2, L_SHO_030, MP3_03E0, CHANNEL_6, COLOR_09_BLUE) // "This seems to be one of the special pillars." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_msg_powersmoreconstant[] = { + restart_timer + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0077, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + speak(CHR_P1P2, L_SHO_031, MP3_03E1, CHANNEL_6, COLOR_09_BLUE) // "The power's more constant in this area. The Inner ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_msg_skedararmy[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0082, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + speak(CHR_P1P2, L_SHO_032, MP3_03E2, CHANNEL_6, COLOR_09_BLUE) // "OH, NO!!! A Skedar army in suspended animation!" + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_msg_cutoffthehead[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x08) + + label(0x2d) + speak(CHR_P1P2, L_SHO_033, MP3_03E3, CHANNEL_6, COLOR_09_BLUE) // "Okay, this is it... Cut off the head and the body ..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1019_blow_pillars[] = { + // Wait until all pillars marked + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x2d) + endloop(0x04) + + // Wait 10 seconds + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(600, /*goto*/ 0x2d) + endloop(0x08) + + // 1 + label(0x2d) + unset_object_flag(0x27, OBJFLAG_00000100) + unset_object_flag(0x28, OBJFLAG_00000100) + unset_object_flag(0x29, OBJFLAG_00000100) + unset_object_flag(OBJ_PILLAR1, OBJFLAG_INVINCIBLE) + unset_object_flag(0x27, OBJFLAG_INVINCIBLE) + destroy_object(0x27) + yield + yield + yield + yield + yield + restart_timer + + beginloop(0x09) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x09) + + // 2 + label(0x2d) + unset_object_flag(OBJ_PILLAR2, OBJFLAG_INVINCIBLE) + unset_object_flag(0x28, OBJFLAG_INVINCIBLE) + destroy_object(0x28) + yield + yield + yield + yield + yield + restart_timer + + beginloop(0x0b) + if_timer_gt(180, /*goto*/ 0x2d) + endloop(0x0b) + + // 3 + label(0x2d) + unset_object_flag(OBJ_PILLAR3, OBJFLAG_INVINCIBLE) + unset_object_flag(0x29, OBJFLAG_INVINCIBLE) + destroy_object(0x29) + yield + yield + yield + yield + yield + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_setup_pillars[] = { + yield + shuffle_ruins_pillars(OBJ_PILLAR1, OBJ_PILLAR2, OBJ_PILLAR3, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x27, 0x28, 0x29, 0x2f, 0x30, 0x31, 0x32, 0x33) + yield + set_object_flag3(OBJ_PILLAR1, OBJFLAG3_RTRACKED_YELLOW) + set_object_flag3(OBJ_PILLAR2, OBJFLAG3_RTRACKED_YELLOW) + set_object_flag3(OBJ_PILLAR3, OBJFLAG3_RTRACKED_YELLOW) + set_object_flag(OBJ_PILLAR1, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_PILLAR2, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_PILLAR3, OBJFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_remove_pillar_shadow[] = { + beginloop(0x04) + // One of the pillars, but with a different tag + if_object_in_good_condition(0x41, /*goto*/ 0x2d) + + // Destroyed - remove shadow + label(0x06) + disable_object(0x3d) + disable_object(0x3e) + unset_object_flag2(0x4e, OBJFLAG2_INVISIBLE) + unset_object_flag2(0x4f, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + endloop(0x04) + + // Unreachable + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c00_intro_sounds[] = { + label(0xda) + if_chr_has_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER, /*goto*/ 0xdb) + yield + goto_first(0xda) + + label(0xdb) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER) + + #define wait_until_with_stageflag(time, loopid) \ + beginloop(loopid) \ + if_stage_flag_eq(STAGEFLAG_IN_INTRO, FALSE, /*goto*/ 0x86) \ + if_controller_button_pressed(/*goto*/ 0x86) \ + if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? time : time - 50, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x86) \ + if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? time : time - 50, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + label(0x2d) + restart_timer + + wait_until_with_stageflag(100, 0x91) + speak(CHR_BOND, L_SHO_034, MP3_048D, CHANNEL_10, COLOR_04_ORANGE) // "This is the Skedar fanatics' most holy place. They..." + + wait_until_with_stageflag(770, 0xa4) + play_sound(SFX_RELOAD_FARSIGHT, CHANNEL_10) + + wait_until_with_stageflag(800, 0x92) + speak(CHR_BOND, L_SHO_035, MP3_048E, CHANNEL_10, COLOR_09_BLUE) // "So let me get this straight - it's holy. But there..." + + wait_until_with_stageflag(1018, 0xa5) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(1090, 0xa6) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until_with_stageflag(1148, 0xa7) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(1210, 0x93) + speak(CHR_BOND, L_SHO_036, MP3_048F, CHANNEL_10, COLOR_04_ORANGE) // "Yes. In all of the time that we Maians fought the ..." + + wait_until_with_stageflag(1230, 0xa8) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until(1270, 0xc5) + play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) + + wait_until_with_stageflag(1274, 0xa9) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(1330, 0xaa) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until_with_stageflag(1375, 0xab) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(1435, 0xac) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until_with_stageflag(1490, 0xad) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(1600, 0xc7) + play_sound(SFX_05C7, CHANNEL_10) + + wait_until_with_stageflag(1670, 0xc8) + play_sound(SFX_05C6, CHANNEL_10) + + wait_until_with_stageflag(1710, 0xae) + play_sound(SFX_05C5, CHANNEL_10) + + wait_until_with_stageflag(1840, 0xaf) + play_sound(SFX_05CC, CHANNEL_10) + + wait_until_with_stageflag(2040, 0xb7) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2065, 0xb0) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until_with_stageflag(2090, 0xb8) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2115, 0xb1) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until(2050, 0xc6) // time is out of order + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until_with_stageflag(2140, 0xb9) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2180, 0xb2) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until_with_stageflag(2220, 0xb3) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2250, 0xb4) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2290, 0xb5) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2340, 0xb6) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until_with_stageflag(2650, 0x94) + speak(CHR_BOND, L_SHO_037, MP3_0490, CHANNEL_10, COLOR_09_BLUE) // "Then we have to be certain that no fanatics surviv..." + + wait_until_with_stageflag(3250, 0x95) + speak(CHR_BOND, L_SHO_038, MP3_0491, CHANNEL_10, COLOR_04_ORANGE) // "If you're caught on the ground when the fleet gets..." + + wait_until(3330, 0xc3) + play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) + + wait_until(3535, 0xc4) + play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) + + wait_until_with_stageflag(3600, 0x96) + mute_channel(CHANNEL_7) + speak(CHR_BOND, L_SHO_039, MP3_0492, CHANNEL_10, COLOR_09_BLUE) // "That's a mistake I don't intend to make." + + wait_until(4040, 0xc0) + play_sound(SFX_05A0, CHANNEL_10) + + wait_until(4158, 0xc1) + play_sound(SFX_05A1, CHANNEL_10) + + wait_until(4236, 0xc2) + play_sound(SFX_SKEDAR_ROAR_0529, CHANNEL_10) + + wait_until(4580, 0xbc) + play_sound(SFX_01D8, CHANNEL_10) + + wait_until(4610, 0xbd) + play_sound(SFX_01DA, CHANNEL_10) + + wait_until(4630, 0xbe) + play_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_10) + + wait_until(4678, 0xbf) + play_sound(SFX_01DB, CHANNEL_10) + + wait_until_with_stageflag(4675, 0x97) + play_sound(SFX_0162, CHANNEL_10) + + wait_until_with_stageflag(4750, 0xbb) + play_sound(SFX_0161, CHANNEL_10) + + mute_channel(CHANNEL_0) + mute_channel(CHANNEL_1) + mute_channel(CHANNEL_2) + mute_channel(CHANNEL_3) + mute_channel(CHANNEL_4) + mute_channel(CHANNEL_5) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_7) + label(0x86) + mute_channel(CHANNEL_10) + goto_first(0xda) + + endlist +}; + +u8 func0414_outro_sounds[] = { + // The kill countable flag is probably just used to track which player + // destroyed the final spike so they can be shown in the outro. + label(0xda) + if_chr_has_chrflag(CHR_BOND, CHRCFLAG_KILLCOUNTABLE, /*goto*/ 0xdb) + if_chr_has_chrflag(CHR_COOP, CHRCFLAG_KILLCOUNTABLE, /*goto*/ 0xdc) + yield + goto_first(0xda) + + label(0xdb) + set_target_chr(CHR_BOND) + goto_next(0x2d) + + label(0xdc) + set_target_chr(CHR_COOP) + goto_next(0x2d) + + #define outro_wait_until_with_stageflag(time, loopid) \ + beginloop(loopid) \ + if_stage_flag_eq(STAGEFLAG_IN_OUTRO, FALSE, /*goto*/ 0x86) \ + if_controller_button_pressed(/*goto*/ 0x86) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + #define outro_wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x86) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + label(0x2d) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_KILLCOUNTABLE) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_KILLCOUNTABLE) + restart_timer + + outro_wait_until_with_stageflag(40, 0xd5) + play_sound(SFX_0067, CHANNEL_10) + + outro_wait_until_with_stageflag(80, 0x9e) + play_sound(SFX_0067, CHANNEL_10) + + outro_wait_until_with_stageflag(120, 0x9f) + play_sound(SFX_0067, CHANNEL_10) + + outro_wait_until_with_stageflag(160, 0xa0) + play_sound(SFX_05C0, CHANNEL_10) + + outro_wait_until_with_stageflag(180, 0xa1) + play_sound(SFX_SKEDAR_ROAR_052D, CHANNEL_10) + + outro_wait_until_with_stageflag(230, 0x9b) + speak(CHR_BOND, L_SHO_040, MP3_04DE, CHANNEL_10, COLOR_09_BLUE) // "Yesss..." + + outro_wait_until_with_stageflag(470, 0xa9) + play_sound(SFX_8099, CHANNEL_10) + + outro_wait_until_with_stageflag(494, 0xa2) + play_sound(SFX_EXPLOSION_8098, CHANNEL_10) + play_sound(SFX_00F6, CHANNEL_10) + + outro_wait_until_with_stageflag(520, 0xa8) + play_sound(SFX_809B, CHANNEL_10) + + outro_wait_until_with_stageflag(540, 0xa3) + play_sound(SFX_80A2, CHANNEL_10) + play_sound(SFX_00F6, CHANNEL_10) + + outro_wait_until_with_stageflag(550, 0xd6) + play_sound(MP3_07C8, CHANNEL_10) + + outro_wait_until_with_stageflag(600, 0xaa) + play_sound(SFX_80A3, CHANNEL_10) + + outro_wait_until_with_stageflag(616, 0xa4) + play_sound(SFX_809F, CHANNEL_10) + play_sound(SFX_00F6, CHANNEL_10) + + outro_wait_until_with_stageflag(700, 0xa5) + play_sound(SFX_80A1, CHANNEL_10) + play_sound(SFX_00F6, CHANNEL_10) + + outro_wait_until_with_stageflag(760, 0xcd) + play_sound(SFX_80A3, CHANNEL_10) + + outro_wait_until(780, 0xae) + fade_to_color(0x000000ff, 80) + + outro_wait_until_with_stageflag(790, 0xa6) + play_sound(SFX_809C, CHANNEL_10) + play_sound(SFX_00F6, CHANNEL_10) + + outro_wait_until_with_stageflag(820, 0xcc) + play_sound(SFX_80A2, CHANNEL_10) + + outro_wait_until_with_stageflag(860, 0xa7) + play_sound(SFX_80A3, CHANNEL_10) + + outro_wait_until_with_stageflag(880, 0xce) + play_sound(MP3_07DA, CHANNEL_10) + + outro_wait_until(920, 0xaf) + fade_to_color(0xffffffff, 0) + fade_to_color(0x00000000, 120) + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + + outro_wait_until_with_stageflag(1680, 0x91) + mute_channel(CHANNEL_10) + speak(CHR_BOND, L_SHO_041, MP3_0493, CHANNEL_10, COLOR_04_ORANGE) // "Joanna! Joanna!" + + outro_wait_until_with_stageflag(2020, 0x9c) + speak(CHR_BOND, L_SHO_054, MP3_0755, CHANNEL_10, COLOR_04_ORANGE) // "Where are you? Are you hurt?" + + outro_wait_until_with_stageflag(2206, 0x92) + speak(CHR_BOND, L_SHO_042, MP3_0494, CHANNEL_10, COLOR_09_BLUE) // "Elvis! Elvis! Over here." + + outro_wait_until_with_stageflag(2625, 0x93) + speak(CHR_BOND, L_SHO_043, MP3_0495, CHANNEL_10, COLOR_04_ORANGE) // "No problem. Grab my arms - we'll get you out in no..." + + outro_wait_until_with_stageflag(2810, 0xd4) + play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) + + outro_wait_until_with_stageflag(2895, 0x94) + speak(CHR_BOND, L_SHO_044, MP3_0496, CHANNEL_10, COLOR_09_BLUE) // "No, quick! Give me your gun!" + + outro_wait_until_with_stageflag(3160, 0xca) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_ELVIS, WEAPON_PHOENIX, WEAPON_NONE) + + outro_wait_until_with_stageflag(3280, 0xcb) + set_cutscene_weapon(CHR_TARGET, WEAPON_PHOENIX, WEAPON_NONE) + set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) + + outro_wait_until_with_stageflag(3290, 0x95) + speak(CHR_BOND, L_SHO_045, MP3_0497, CHANNEL_10, COLOR_09_BLUE) // "Will! You! Just! Let! Go!" + + outro_wait_until_with_stageflag(3420, 0xcf) + set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) + yield + yield + set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) + play_sound(SFX_SKEDAR_ROAR_052E, CHANNEL_10) + + outro_wait_until_with_stageflag(3445, 0xd0) + set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) + yield + yield + set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) + + outro_wait_until_with_stageflag(3470, 0xd1) + set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) + yield + yield + set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) + + outro_wait_until_with_stageflag(3495, 0xd2) + set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) + yield + yield + set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) + + outro_wait_until_with_stageflag(3520, 0xd3) + set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) + yield + yield + set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) + play_sound_from_object2(CHANNEL_6, 0x25, SFX_SKEDAR_ROAR_052D, 0x00, 0x00) + + outro_wait_until_with_stageflag(3600, 0xd7) + play_sound(MP3_07C9, CHANNEL_10) + + outro_wait_until_with_stageflag(3880, 0xd8) + play_sound(SFX_0427, CHANNEL_10) + + outro_wait_until_with_stageflag(3990, 0x96) + speak(CHR_BOND, L_SHO_046, MP3_0498, CHANNEL_10, COLOR_04_ORANGE) // "I managed to get the fleet to stop the bombardment..." + + outro_wait_until_with_stageflag(4425, 0x97) + speak(CHR_BOND, L_SHO_047, MP3_0499, CHANNEL_10, COLOR_09_BLUE) // "I'd have got out in time if that one hadn't grabbe..." + + outro_wait_until_with_stageflag(4650, 0x98) + speak(CHR_BOND, L_SHO_048, MP3_049A, CHANNEL_10, COLOR_04_ORANGE) // "Of course, Joanna, of course." + + outro_wait_until_with_stageflag(4825, 0x99) + speak(CHR_BOND, L_SHO_049, MP3_049B, CHANNEL_10, COLOR_09_BLUE) // "No, I would have." + + outro_wait_until_with_stageflag(4960, 0x9a) + speak(CHR_BOND, L_SHO_050, MP3_049C, CHANNEL_10, COLOR_04_ORANGE) // "I believe you." + + outro_wait_until_with_stageflag(5560, 0x9d) + play_sound(SFX_0161, CHANNEL_7) + + label(0x86) + mute_channel(CHANNEL_10) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + goto_first(0xda) + + endlist +}; + +u8 func1020_show_phoenix[] = { + // Show Phoenix once pillars destroyed + beginloop(0x04) + if_object_in_good_condition(0x2a, /*goto*/ 0x2d) + if_object_in_good_condition(0x2b, /*goto*/ 0x2d) + if_object_in_good_condition(0x2c, /*goto*/ 0x2d) + if_object_in_good_condition(0x2d, /*goto*/ 0x2d) + if_object_in_good_condition(0x2e, /*goto*/ 0x2d) + unset_object_flag(OBJ_PHOENIX1, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_PHOENIX1, OBJFLAG2_INVISIBLE) + unset_object_flag(OBJ_PHOENIX2, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_PHOENIX2, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2d) + endloop(0x04) + + endlist +}; + +/** + * Handle the mine hidden inside the first ravine debris. + */ +u8 func1021_handle_mine[] = { + yield + if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) + + // SA and PA + disable_object(OBJ_REMOTEMINE) + + // A + label(0x2d) + destroy_object(OBJ_REMOTEMINE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1022_armyroom_exitdoors[] = { + yield + set_object_flag2(0x45, OBJFLAG2_LOCKEDFRONT) + set_object_flag2(0x46, OBJFLAG2_LOCKEDBACK) + if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) + + // A and SA + beginloop(0x91) + if_objective_complete(0, /*goto*/ 0x06) + endloop(0x91) + + label(0x06) + unset_object_flag2(0x45, OBJFLAG2_LOCKEDFRONT) + unset_object_flag2(0x46, OBJFLAG2_LOCKEDBACK) + + // All difficulties + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 unregistered_function1[] = { + restart_timer + + beginloop(0x04) + if_timer_gt(300, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + chr_drop_weapon(CHR_BOND) + show_hudmsg(CHR_BOND, L_SHO_026) // "Target Amplifier placed incorrectly." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Used to print whether the puzzle rock is pushable or not. + */ +u8 unregistered_function2[] = { + beginloop(0x04) + if_object_flag3(OBJ_PUZZLEROCK, OBJFLAG3_PUSHABLE, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func1024_check_grenades_wasted[] = { + beginloop(0x04) + if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_DEVASTATOR, 1, /*goto*/ 0x2d) + reloop(0x04) + + label(0x2d) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_DEVASTATOR, 1, /*goto*/ 0x2d) + endloop(0x04) + + label(0x2d) + restart_timer + + beginloop(0x91) + if_timer_gt(240, /*goto*/ 0x2d) + endloop(0x91) + + label(0x2d) + if_object_in_good_condition(0x4d, /*goto*/ 0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x09) + endloop(0x08) + + beginloop(0x09) + if_object_in_good_condition(0x4d, /*goto*/ 0x2d) + + // Blown up using other means (eg. Phoenix or all guns cheat) + unset_stage_flag(STAGEFLAG_GRENADES_WASTED) + show_hudmsg(CHR_BOND, L_SHO_053) // "Alternative entrance to Shrine created." + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2d) + if_stage_flag_eq(STAGEFLAG_GRENADES_WASTED, TRUE, /*goto*/ 0x2d) + show_hudmsg(CHR_BOND, L_SHO_052) // "Grenade ammo used up - can't enter Shrine." + set_stage_flag(STAGEFLAG_GRENADES_WASTED) + label(0x2d) + endloop(0x09) + + endlist +}; + +u8 func1023_setup_rtracker[] = { + yield + set_object_flag3(OBJ_PHOENIX1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_PHOENIX2, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1427_setup_environment[] = { + yield + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0021, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0022, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0023, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0049, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0049, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0058, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1025_unlock_doors_for_buddy[] = { + yield + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) + + // Co-op mode + // Wait for pillars objective + beginloop(0x91) +#if VERSION >= VERSION_NTSC_1_0 + if_objective_complete(0, /*goto*/ 0x2d) + reloop(0x91) + + // Unlock doors repeatedly + label(0x2d) +#endif + unlock_door(0x0d, 0x02) + unlock_door(0x0e, 0x02) + unlock_door(0x0f, 0x02) + unlock_door(0x10, 0x02) + unlock_door(0x45, 0x80) + unlock_door(0x46, 0x80) + endloop(0x91) + + // Buddy doesn't exist + label(0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Open the portal in the explosive wall to prevent a flicker + * where the room isn't rendered on the first frame after exploding. + */ +u8 func1426_setup_portals[] = { + yield + set_portal_flag(0x0072, PORTALFLAG_FORCEOPEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1028_buddybridge[] = { + yield + + // Wait for camera to finish + beginloop(0x59) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x2e) + + label(0x2d) + endloop(0x59) + + // Wait 5 seconds + label(0x2e) + restart_timer + + beginloop(0x04) + if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? 300 : 180, /*goto*/ 0x2d) + endloop(0x04) + + // This flag is set by global ailists + label(0x2d) + if_stage_flag_eq(STAGEFLAG_AI_BUDDY_EXISTS, FALSE, /*goto*/ 0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Flag not set - so this is solo mode + // Remove the bridge and barricade over the first ravine + label(0x2d) + disable_object(OBJ_BUDDYBRIDGE) + disable_object(OBJ_BUDDYBARRICADE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func0401_init_unarmed_skedar, 0x0401 }, + { func0402_unarmed_skedar, 0x0402 }, + { func0403_init_miniskedar, 0x0403 }, + { func0404_miniskedar, 0x0404 }, + { func0405_puzzleroom_miniskedar_waiting, 0x0405 }, + { func0404_miniskedar_spawner, 0x0406 }, + { func0407_init_cloaked_skedar, 0x0407 }, + { func0408_cloaked_skedar, 0x0408 }, + { func0409_reaper_slayer_skedar, 0x0409 }, + { func040a_init_reaper_slayer_skedar, 0x040a }, + { func040b_mauler_skedar, 0x040b }, + { func040c_king_waiting, 0x040c }, + { func040d_king_combat, 0x040d }, + { func040e_king_skedar_spawner, 0x040e }, + { func040f_update_spike_stageflags, 0x040f }, + { func0410_init_king_skedar_clone, 0x0410 }, + { func0411_king_miniskedar_spawner, 0x0411 }, + { func0412_init_king_miniskedar_clone, 0x0412 }, + { func0413_hide, 0x0413 }, + { func0414_outro, 0x0414 }, + { func0c00_intro, 0x0c00 }, + { func0414_outro_from_menu, 0x0c01 }, + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func0c00_intro, 0x1002 }, + { func1003_remove_random_skedar, 0x1003 }, + { func1004_setup_pillars, 0x1004 }, + { func1005_5e0c, 0x1005 }, + { func1006_bridge, 0x1006 }, + { func1007_bug_throws_bond, 0x1007 }, + { func1008_lock_door, 0x1008 }, + { func1009_altar, 0x1009 }, + { func100a_army_room, 0x100a }, + { func100b_check_sanctum_accessed, 0x100b }, + { func100c_check_army_defeated, 0x100c }, + { func100e_wake_skedar_army, 0x100e }, + { func100f_spikes_vulnerability, 0x100f }, + { func1010_spike_ml, 0x1010 }, + { func1011_spike_mr, 0x1011 }, + { func1012_spike_bl, 0x1012 }, + { func1013_spike_br, 0x1013 }, + { func1014_spike_top, 0x1014 }, + { func1015_msg_specialpillars, 0x1015 }, + { func1016_msg_powersmoreconstant, 0x1016 }, + { func1017_msg_skedararmy, 0x1017 }, + { func1018_msg_cutoffthehead, 0x1018 }, + { func1019_blow_pillars, 0x1019 }, + { func101a_pointless, 0x101a }, + { func101b_bug_throws_coop, 0x101b }, + { func101c_setup_corridor_lighting, 0x101c }, + { func101d_remove_pillar_shadow, 0x101d }, + { func0c00_intro_sounds, 0x141e }, + { func0414_outro_sounds, 0x141f }, + { func1020_show_phoenix, 0x1020 }, + { func1021_handle_mine, 0x1021 }, + { func1022_armyroom_exitdoors, 0x1022 }, + { func1023_setup_rtracker, 0x1023 }, + { func1024_check_grenades_wasted, 0x1024 }, + { func1025_unlock_doors_for_buddy, 0x1025 }, + { func1426_setup_portals, 0x1426 }, + { func1427_setup_environment, 0x1427 }, + { func1028_buddybridge, 0x1028 }, + { NULL, 0 }, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupsilo.c b/src/ailists/setupsilo.c new file mode 100644 index 000000000..56837031d --- /dev/null +++ b/src/ailists/setupsilo.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x14 +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupstat.c b/src/ailists/setupstat.c new file mode 100644 index 000000000..e8045ae5e --- /dev/null +++ b/src/ailists/setupstat.c @@ -0,0 +1,1394 @@ +// +// WAR! +// + +#include "stagesetup.h" + +// Characters +#define CHR_MAIAN_LEADER 0x3d +#define CHR_MAIAN_TEMPLATE 0x3e +#define CHR_SKEDAR_TEMPLATE 0x3f +#define CHR_KING1 0x40 +#define CHR_KING2 0x41 +#define CHR_KING3 0x42 +#define CHR_BLONDE 0x43 +#define CHR_MAIAN1 0x44 +#define CHR_MAIAN2 0x45 +#define CHR_MAIAN3 0x46 +#define CHR_MAIAN4 0x47 +#define CHR_MAIAN5 0x48 + +// Objects +#define OBJ_BRIDGE 0x05 +#define OBJ_MINE1 0x2f +#define OBJ_MINE2 0x30 +#define OBJ_MINE3 0x31 +#define OBJ_MINE4 0x32 +#define OBJ_MINE5 0x33 +#define OBJ_MINE6 0x40 + +// Stage flags +#define STAGEFLAG_LEADER_DEAD 0x00000100 +#define STAGEFLAG_KING1_DEAD 0x00000200 +#define STAGEFLAG_KING2_DEAD 0x00000400 +#define STAGEFLAG_KING3_DEAD 0x00000800 + +// AI Lists +#define AILIST_DEFEND 0x0401 +#define AILIST_INIT_KING 0x0402 +#define AILIST_INIT_LEADER 0x0403 +#define AILIST_MAIAN 0x0404 +#define AILIST_INIT_MAIAN 0x0405 +#define AILIST_SKEDAR 0x0406 +#define AILIST_KING1_SKEDAR 0x0407 +#define AILIST_KING2_SKEDAR 0x0408 +#define AILIST_KING3_SKEDAR 0x0409 +#define AILIST_INTRO 0x040a +#define AILIST_OUTRO 0x040b +#define AILIST_HIDE 0x040c +#define AILIST_BLOW_MINES 0x040d + +// Other +#define GROUP_MAIANS 1 +#define GROUP_KING1_SKEDAR 2 +#define GROUP_KING2_SKEDAR 3 +#define GROUP_KING3_SKEDAR 4 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_STAT_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_STAT_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_STAT_002) + briefing(BRIEFINGTYPE_TEXT_A, L_STAT_003) + + beginobjective(0, L_STAT_004, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Kill Skedar King." + complete_flags(STAGEFLAG_KING1_DEAD) + fail_flags(STAGEFLAG_LEADER_DEAD) + endobjective + + beginobjective(1, L_STAT_005, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Kill Skedar King 2." + complete_flags(STAGEFLAG_KING2_DEAD) + endobjective + + beginobjective(2, L_STAT_006, (DIFFBIT_PA | DIFFBIT_PD)) // "Kill Skedar King 3." + complete_flags(STAGEFLAG_KING3_DEAD) + endobjective + + chr(0, CHR_MAIAN_LEADER, PAD_STAT_004F, BODY_ELVIS1, HEAD_MAIAN_S, AILIST_INIT_LEADER, 0x004e, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x003d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CALLISTO) + + chr(0, CHR_MAIAN_TEMPLATE, PAD_STAT_0045, BODY_CISOLDIER, HEAD_RANDOM, AILIST_HIDE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x003e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + + chr(0, CHR_KING1, PAD_STAT_007C, BODY_SKEDARKING, HEAD_RANDOM, AILIST_INIT_KING, 0x007c, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_WARFIRSTKING | CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKMINIGUN, 0x0040, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_REAPER) + + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA, CHR_KING2, PAD_STAT_0110, BODY_SKEDARKING, HEAD_RANDOM, AILIST_INIT_KING, 0x0091, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSKROCKET, 0x0041, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SLAYER) + + chr(SPAWNFLAG_ONLYONPA, CHR_KING3, PAD_STAT_0094, BODY_SKEDARKING, HEAD_RANDOM, AILIST_INIT_KING, 0x0094, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) +#if VERSION >= VERSION_NTSC_1_0 + weapon(0x0100, MODEL_KINGSCEPTRE, 0x0042, OBJFLAG_AIUNDROPPABLE | OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_ROCKETLAUNCHER_34) +#else + weapon(0x0100, MODEL_KINGSCEPTRE, 0x0042, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_ROCKETLAUNCHER_34) +#endif + + chr(SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, CHR_BLONDE, PAD_STAT_0077, BODY_SKEDAR, HEAD_MRBLONDE, AILIST_KING1_SKEDAR, 0x0022, -1, 1000, 200, CHRFLAG0_SKIPSAFETYCHECKS, CHRFLAG1_ALLOWSOFTCOVER | CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAULER, 0x0043, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_MAULER) + + chr(0, CHR_SKEDAR_TEMPLATE, PAD_STAT_007D, BODY_CISOLDIER, HEAD_RANDOM, AILIST_HIDE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRAR34, 0x003f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_AR34) + + chr(0, CHR_MAIAN1, PAD_STAT_0009, BODY_ELVIS1, HEAD_MAIAN_S, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x0044, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CALLISTO) + + chr(0, CHR_MAIAN2, PAD_STAT_00A4, BODY_ELVIS1, HEAD_MAIAN_S, GAILIST_IDLE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_ALLY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x0045, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CALLISTO) + + chr(0, CHR_MAIAN3, PAD_STAT_0008, BODY_ELVIS1, HEAD_MAIAN_S, AILIST_HIDE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_01, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x0046, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CALLISTO) + + chr(0, CHR_MAIAN4, PAD_STAT_000C, BODY_ELVIS1, HEAD_MAIAN_S, AILIST_HIDE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_01, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x0047, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CALLISTO) + + chr(0, CHR_MAIAN5, PAD_STAT_000D, BODY_ELVIS1, HEAD_MAIAN_S, AILIST_HIDE, -1, -1, 200, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_AIVSAI, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_NOOP_00200000 | CHRFLAG1_IGNORECOVER | CHRFLAG1_PUNCHHARDER, TEAM_01, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRMAIANSMG, 0x0048, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CALLISTO) + + conditional_scenery(1, 0, 2) + debris(0x0100, MODEL_SKCREV_UNEXP1, PAD_STAT_00E5, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#if VERSION >= VERSION_NTSC_1_0 + debris(0x0100, MODEL_SKCREV_EXP1, PAD_STAT_00E6, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + debris(0x0100, MODEL_SKCREV_EXP1, PAD_STAT_00E6, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_SKTNL_UNEXP1, PAD_STAT_00E7, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + debris(0x0100, MODEL_SKTNL_EXP1, PAD_STAT_00E8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + debris(0x0100, MODEL_SKTNL_EXP1, PAD_STAT_00E8, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + tag(0x1e, 5) + tag(0x1f, 5) + tag(0x20, 5) + tag(0x21, 5) + tag(0x22, 5) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_ML, PAD_STAT_014B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_MR, PAD_STAT_014C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_BL, PAD_STAT_014D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_BR, PAD_STAT_014E, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_FL_NOSHAD_T, PAD_STAT_014A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + tag(0x01, 3) + tag(0x2a, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN4, PAD_STAT_0111, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x02, 3) + tag(0x2b, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_STAT_010A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x03, 3) + tag(0x2c, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN3, PAD_STAT_010B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x2d, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN2, PAD_STAT_010C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x2e, 2) + conditional_scenery(1, 0, 0) + debris(0x0100, MODEL_SK_TEMPLECOLUMN3, PAD_STAT_010D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_80000000, 0, 1000) + tag(0x27, 1) + tag(0x28, 1) + tag(0x29, 1) + tag(0x2f, 5) + tag(0x30, 5) + tag(0x31, 5) + tag(0x32, 5) + tag(0x33, 5) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_00D5, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_010A, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_010B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_010C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_010D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x3d, 1) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_003B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + stdobject(0x0100, MODEL_SK_SUNNOSHAD1, PAD_STAT_014F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_SK_SUNNOSHAD2, PAD_STAT_0150, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00EB, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00EC, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00ED, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00EE, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x3e, 2) + tag(0x3f, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00EF, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F0, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x09, 2) + tag(0x0a, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F1, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F2, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x0d, 2) + tag(0x0e, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F3, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F4, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F5, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F6, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x0f, 2) + tag(0x10, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F7, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F8, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x11, 2) + tag(0x12, 2) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00F9, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_SK_DOOR1, PAD_STAT_00FA, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_DOOR_STICKY, 1000, 0x0000e666, 0x00010000, 0x00001999, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x0000012c, 0x00000000, 0xffffffff, 0x00000400) + tag(0x0c, 1) + fan(0x0100, MODEL_SK_UNDER_GENERATOR, PAD_STAT_0126, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_SK_UNDER_TRANS, PAD_STAT_0127, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_SK_UNDER_TRANS, PAD_STAT_0128, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + tag(0x04, 1) + stdobject(0x0080, MODEL_SKPUZZLEOBJECT, PAD_STAT_00D4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x05, 1) + lift(0x0100, MODEL_SKEDARBRIDGE, PAD_STAT_0136, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0136, 0x0136, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + tag(0x0b, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_STAT_0137, OBJFLAG_00000002, 0, 0, 1000, 3, 3, 3, 0) + tag(0x23, 1) + stdobject(0x0019, MODEL_RUBBLE1, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x24, 1) + stdobject(0x0019, MODEL_RUBBLE2, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x25, 1) + stdobject(0x0019, MODEL_RUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x26, 1) + stdobject(0x0019, MODEL_RUBBLE4, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x37, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x38, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE4, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x39, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE5, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3a, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE6, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3b, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x3c, 1) + stdobject(0x0019, MODEL_SK_JONRUBBLE3, -1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x36, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_00FC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_00FB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_00FD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_00FE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_0100, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_00FF, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_0101, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_0102, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_0104, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_0103, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_0106, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_0105, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_BOT, PAD_STAT_0107, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000eb68, 0x0000eb68, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000000) + door(0x0100, MODEL_SK_CRYOPOD1_TOP, PAD_STAT_0108, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x00010000, 0x00010000, 0x0001aaaa, 0x00002aaa, 0x00002aaa, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x40, 1) + stdobject(0x0019, MODEL_CHRREMOTEMINE, PAD_STAT_003B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + pad_effect(PADEFFECT_SPARKS, 0x0112) + pad_effect(PADEFFECT_SPARKS, 0x0117) + pad_effect(PADEFFECT_SPARKS, 0x0113) + pad_effect(PADEFFECT_SPARKS, 0x0114) + pad_effect(PADEFFECT_SPARKS, 0x0115) + pad_effect(PADEFFECT_SPARKS, 0x0116) + pad_effect(PADEFFECT_SPARKS, 0x0118) + pad_effect(PADEFFECT_SPARKS, 0x0119) + pad_effect(PADEFFECT_SPARKS, 0x011a) + pad_effect(PADEFFECT_SPARKS, 0x011b) + pad_effect(PADEFFECT_SPARKS, 0x011c) + pad_effect(PADEFFECT_SPARKS, 0x011d) + pad_effect(PADEFFECT_SPARKS, 0x011e) + pad_effect(PADEFFECT_SPARKS, 0x011f) + pad_effect(PADEFFECT_SPARKS, 0x0120) + pad_effect(PADEFFECT_SPARKS, 0x0121) + pad_effect(PADEFFECT_SPARKS, 0x0122) + pad_effect(PADEFFECT_SPARKS, 0x0123) + pad_effect(PADEFFECT_SPARKS, 0x0124) + pad_effect(PADEFFECT_SPARKS, 0x0125) + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_MAIAN) + intro_weapon(WEAPON_PHOENIX, -1) + ammo(AMMOTYPE_PISTOL, 300) + ammo(AMMOTYPE_ROCKET, 3) + ammo(AMMOTYPE_SMG, 100) + spawn(PAD_STAT_00D7) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1000_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func0403_init_maian_leader[] = { + stop_chr + yield + set_alertness(100) + set_accuracy(100) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(300) + set_recovery_speed(100) + set_shield(0) + set_ailist(CHR_SELF, AILIST_DEFEND) + endlist +}; + +u8 func0402_init_king[] = { + set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) + set_alertness(100) + set_accuracy(100) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(300) + set_recovery_speed(100) + set_shield(0) + set_self_chrflag(CHRCFLAG_UNEXPLODABLE) + set_ailist(CHR_SELF, AILIST_DEFEND) + endlist +}; + +u8 func0401_defend[] = { + set_shotlist(AILIST_DEFEND) + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) + goto_next(0x06) + + // Dying + label(0x2d) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Not dying - go to pad + label(0x06) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) + + label(0x03) + restart_timer + if_chr_distance_to_pad_gt(CHR_SELF, 500, PAD_PRESET, /*goto*/ 0x06) + go_to_target_pad(GOPOSFLAG_JOG) + + label(0x06) + go_to_target_pad(GOPOSFLAG_RUN) + + // Wait until at pad or 1 second has passed + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x2d) + endloop(0x04) + + // Timer expired - loop again + label(0x2d) + goto_first(0x03) + + // At pad + label(0x06) + stop_chr + + // Wait for enemy to come into sight, or to be pushed away from pad + beginloop(0x09) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x06) + endloop(0x09) + + // Pushed away from pad - return to it + label(0x06) + goto_first(0x03) + + // Line of sight to enemy + // The first king attacks immediately, while the other kings and Maian + // leader have a 2 second delay. Suspect this is a @bug; the logic would + // make more sense if it were the other way around. + label(0x08) + if_self_flag_bankx_eq(CHRFLAG1_WARFIRSTKING, TRUE, BANK_1, /*goto*/ 0x2d) + restart_timer + + beginloop(0x8f) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x8f) + + label(0x2d) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) + set_returnlist(CHR_SELF, AILIST_DEFEND) + set_shotlist(AILIST_DEFEND) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + label(0x2d) + goto_first(0x03) + + endlist +}; + +u8 func1003_spawn_maians[] = { + yield + + // Wait for intro to finish + beginloop(0x58) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x2e) + label(0x2d) + endloop(0x58) + + label(0x2e) + yield + yield + yield + yield + yield + label(0x04) + yield + label(0x06) + set_morale(50) + + // Loop until a Maian is able to be spawned or counter depleted + beginloop(0x8d) + if_morale_lt(1, /*goto*/ 0x06) + try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_0053, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_0050, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004D, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004C, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004E, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004A, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) + reloop(0x8d) + + // Successful spawn + label(0x8e) + yield + subtract_morale(1) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + if_num_chrs_in_squadron_gt(7, GROUP_MAIANS, /*goto*/ 0x2d) + reloop(0x8d) + + // Wait 5 seconds + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x2d) + endloop(0x08) + + // If a spot has freed up, go back to the spawning part to spawn another + label(0x2d) + if_num_chrs_in_squadron_gt(7, GROUP_MAIANS, /*goto*/ 0x2d) + endloop(0x8d) + + // Still no free spot, so go back to the 5 second wait + label(0x2d) + goto_first(0x08) + + // Counter depleted + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0405_init_maian[] = { + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_RUNFASTER) + set_chr_team(CHR_SELF, TEAM_ALLY) + set_squadron(GROUP_MAIANS) + rebuild_teams + rebuild_squadrons + try_equip_weapon(MODEL_CHRMAIANSMG, WEAPON_CALLISTO, 0x00000000, /*goto*/ 0x06) + label(0x06) + try_inherit_properties(CHR_MAIAN_TEMPLATE, /*goto*/ 0x2d) + label(0x2d) + set_accuracy(100) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 200) + add_health_or_armor(0) + set_recovery_speed(100) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_MAIAN) + endlist +}; + +u8 func0404_maian[] = { + set_returnlist(CHR_SELF, AILIST_MAIAN) + set_shotlist(AILIST_MAIAN) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + + label(0x03) + set_target_chr(CHR_KING1) + if_chr_deadish(CHR_KING1, /*goto*/ 0x8f) + goto_next(0x2d) + + // King 1 dead + label(0x8f) + set_target_chr(CHR_KING2) + if_chr_deadish(CHR_KING2, /*goto*/ 0x90) + goto_next(0x2d) + + // King 2 dead + label(0x90) + set_target_chr(CHR_KING3) + run_to_pad(PAD_STAT_0094) + goto_next(0x04) + + // Go to king + label(0x2d) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x06) + endloop(0x04) + + // King died while running to him + label(0x06) + goto_first(0x03) + + // Maian has line of sight to king + label(0x08) + if_chr_deadish(CHR_TARGET, /*goto*/ 0x06) + set_returnlist(CHR_SELF, AILIST_MAIAN) + set_shotlist(AILIST_MAIAN) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // King died while fighting + label(0x06) + goto_first(0x03) + + endlist +}; + +u8 func1004_spawn_king1_skedar[] = { + // Wait for intro to finish + beginloop(0x58) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x2e) + label(0x2d) + endloop(0x58) + + label(0x2e) + yield + yield + yield + yield + yield + label(0x04) + yield + label(0x06) + set_morale(65) + + // Loop until a Skedar is able to be spawned or counter depleted + beginloop(0x8d) + if_stage_flag_eq(STAGEFLAG_KING1_DEAD, TRUE, /*goto*/ 0x0e) + if_morale_lt(1, /*goto*/ 0x06) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0079, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_007D, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0083, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0085, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + reloop(0x8d) + + // Successful spawn + label(0x8e) + yield + subtract_morale(1) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + if_num_chrs_in_squadron_gt(5, 0x02, /*goto*/ 0x2d) + reloop(0x8d) + + // Wait for 10 seconds if Maian squad is somewhat full, + // or wait 1 second if Maian squad is somewhat empty. + label(0x2d) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_KING1_DEAD, TRUE, /*goto*/ 0x0e) + if_num_chrs_in_squadron_gt(3, GROUP_MAIANS, /*goto*/ 0x2e) + if_timer_gt(60, /*goto*/ 0x2d) + label(0x2e) + if_timer_gt(600, /*goto*/ 0x2d) + endloop(0x08) + + // If squad is still full, wait another 1 or 10 seconds + label(0x2d) + if_num_chrs_in_squadron_gt(5, GROUP_KING1_SKEDAR, /*goto*/ 0x2d) + goto_first(0x8d) + + // Spawn more + label(0x2d) + goto_first(0x08) + + // Counter depleted + label(0x06) + + // King 1 dead + label(0x0e) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_spawn_king2_skedar[] = { + // Wait for intro to finish + beginloop(0x58) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x2e) + label(0x2d) + endloop(0x58) + + // Wait for king 1 to die + label(0x2e) + yield + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_KING1_DEAD, TRUE, /*goto*/ 0x06) + endloop(0x04) + + // Loop until a Skedar is able to be spawned or counter depleted + label(0x06) + set_morale(50) + + beginloop(0x8d) + if_stage_flag_eq(STAGEFLAG_KING2_DEAD, TRUE, /*goto*/ 0x0e) + if_morale_lt(1, /*goto*/ 0x06) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_008E, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0090, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_008F, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0091, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) + reloop(0x8d) + + // Successful spawn + label(0x8e) + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + yield + subtract_morale(1) + rebuild_teams + rebuild_squadrons + if_num_chrs_in_squadron_gt(3, GROUP_KING2_SKEDAR, /*goto*/ 0x2d) + reloop(0x8d) + + // Wait 15 seconds or until king 2 dead + label(0x2d) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_KING2_DEAD, TRUE, /*goto*/ 0x0e) + if_timer_gt(900, /*goto*/ 0x2d) + endloop(0x08) + + // If squad still full, wait another 15 seconds, otherwise loop back to + // the spawning code. + label(0x2d) + if_num_chrs_in_squadron_gt(3, GROUP_KING2_SKEDAR, /*goto*/ 0x2d) + endloop(0x8d) + + label(0x2d) + goto_first(0x08) + + // Counter depleted + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_spawn_king3_skedar[] = { + // Wait for intro to finish + beginloop(0x58) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x2e) + label(0x2d) + endloop(0x58) + + // Wait for king 2 to die + label(0x2e) + yield + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_KING2_DEAD, TRUE, /*goto*/ 0x06) + endloop(0x04) + + // Loop until a Skedar is able to be spawned or counter depleted + label(0x06) + set_morale(50) + + beginloop(0x8d) + if_stage_flag_eq(STAGEFLAG_KING3_DEAD, TRUE, /*goto*/ 0x0e) + if_morale_lt(1, /*goto*/ 0x06) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0095, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0096, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_012E, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0132, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) + reloop(0x8d) + + // Successful spawn + label(0x8e) + yield + subtract_morale(1) + rebuild_teams + rebuild_squadrons + if_num_chrs_in_squadron_gt(5, 0x04, /*goto*/ 0x2d) + reloop(0x8d) + + // Squad full - wait 15 seconds or for king 3 to die + label(0x2d) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_KING3_DEAD, TRUE, /*goto*/ 0x0e) + if_timer_gt(900, /*goto*/ 0x2d) + endloop(0x08) + + // Spawn more or wait another 15 seconds + label(0x2d) + if_num_chrs_in_squadron_gt(5, GROUP_KING3_SKEDAR, /*goto*/ 0x2d) + endloop(0x8d) + + label(0x2d) + goto_first(0x08) + + // Countdown depleted + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0407_king1_skedar[] = { + try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x00000000, /*goto*/ 0x06) + label(0x06) + try_inherit_properties(CHR_SKEDAR_TEMPLATE, /*goto*/ 0x2d) + label(0x2d) + set_squadron(GROUP_KING1_SKEDAR) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + set_accuracy(10) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 150) + add_health_or_armor(80) + set_recovery_speed(100) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_SKEDAR) + endlist +}; + +u8 func0408_king2_skedar[] = { + try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x00000000, /*goto*/ 0x06) + label(0x06) + try_inherit_properties(CHR_SKEDAR_TEMPLATE, /*goto*/ 0x2d) + label(0x2d) + set_squadron(GROUP_KING2_SKEDAR) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + set_accuracy(10) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 150) + add_health_or_armor(80) + set_recovery_speed(100) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_SKEDAR) + endlist +}; + +u8 func0409_king3_skedar[] = { + try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x00000000, /*goto*/ 0x06) + label(0x06) + try_inherit_properties(CHR_SKEDAR_TEMPLATE, /*goto*/ 0x2d) + label(0x2d) + set_squadron(GROUP_KING3_SKEDAR) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) + set_accuracy(10) + set_reaction_speed(50) + set_chr_maxdamage(CHR_SELF, 150) + add_health_or_armor(80) + set_recovery_speed(100) + set_shield(0) + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, AILIST_SKEDAR) + endlist +}; + +u8 func0406_skedar[] = { + set_shotlist(AILIST_SKEDAR) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + label(0x03) + + // Go to Maian leader + set_target_chr(CHR_MAIAN_LEADER) + try_run_to_target(/*goto*/ 0x04) + + beginloop(0x04) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) + endloop(0x04) + + label(0x08) + set_returnlist(CHR_SELF, AILIST_SKEDAR) + set_shotlist(AILIST_SKEDAR) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func1005_check_leader_dead[] = { + beginloop(0x03) + if_chr_deadish(CHR_MAIAN_LEADER, /*goto*/ 0x2d) + endloop(0x03) + + label(0x2d) + show_hudmsg(CHR_BOND, L_STAT_007) // "Maian leader has been killed." + set_stage_flag(STAGEFLAG_LEADER_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1009_check_king1_dead[] = { + set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + + beginloop(0x03) + if_chr_deadish(CHR_KING1, /*goto*/ 0x2d) + endloop(0x03) + + label(0x2d) + show_hudmsg(CHR_BOND, L_STAT_008) // "Skedar King has been killed." + set_stage_flag(STAGEFLAG_KING1_DEAD) + unlock_door(0x3e, 0x40) + unlock_door(0x3f, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_check_king2_dead[] = { + set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) + + beginloop(0x03) + if_chr_deadish(CHR_KING2, /*goto*/ 0x2d) + endloop(0x03) + + label(0x2d) + show_hudmsg(CHR_BOND, L_STAT_008) // "Skedar King has been killed." + set_stage_flag(STAGEFLAG_KING2_DEAD) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_king3_dead[] = { + set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0e) + + beginloop(0x03) + if_chr_deadish(CHR_KING3, /*goto*/ 0x2d) + endloop(0x03) + + label(0x2d) + show_hudmsg(CHR_BOND, L_STAT_008) // "Skedar King has been killed." + set_stage_flag(STAGEFLAG_KING3_DEAD) + label(0x0e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_check_end_level[] = { + // Wait for all objectives complete + beginloop(0x03) + if_all_objectives_complete(/*goto*/ 0x2d) + endloop(0x03) + + // Wait 2 seconds + label(0x2d) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x2d) + endloop(0x08) + + // Check Jo not dead + label(0x2d) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) + goto_next(0x06) + + // Check Velvet not dead + label(0x2d) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) + goto_next(0x06) + + // Mission failed + label(0x2d) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x06) + set_ailist(CHR_SELF, AILIST_OUTRO) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_hide[] = { + label(0x03) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100d_king1_invincible[] = { + beginloop(0x03) + if_chr_in_room(CHR_BOND, 0x00, 0x0070, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0071, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0072, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0073, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0074, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0075, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0076, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0077, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0078, /*goto*/ 0x2d) + if_chr_in_room(CHR_BOND, 0x00, 0x0079, /*goto*/ 0x2d) + set_chr_chrflag(CHR_KING1, CHRCFLAG_INVINCIBLE) + reloop(0x03) + + label(0x2d) + unset_chr_chrflag(CHR_KING1, CHRCFLAG_INVINCIBLE) + endloop(0x03) + + endlist +}; + +u8 unregistered_function[] = { + yield + + // Wait for intro to finish + beginloop(0x58) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x2e) + label(0x2d) + endloop(0x58) + + label(0x2e) + yield + yield + yield + yield + yield + + // Remove Blonde if counterop doesn't exist + label(0x03) + if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x2d) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2d) + remove_chr(CHR_BLONDE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_INTRO) + set_chr_hiddenflag(CHR_ANTI, CHRHFLAG_00020000) + set_chr_hiddenflag(CHR_BLONDE, CHRHFLAG_00020000) + camera_movement(ANIM_CUT_STAT_INTRO_CAM) + cmd0175(60) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + unset_chr_chrflag(CHR_MAIAN1, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_MAIAN1, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN1, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN1, 4) + + unset_chr_chrflag(CHR_MAIAN2, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_MAIAN2, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN2, 4) + + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_PHOENIX, WEAPON_NONE) + + // Wait 200 frames (3.3 secs) or until button pressed + beginloop(0x96) + if_controller_button_pressed(/*goto*/ 0x82) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x96) + + // Timer expired - play a sound (explosion?) + label(0x06) + play_sound(SFX_MAIAN_05E2, CHANNEL_10) + + // Wait for camera to finish or button to be pressed + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x82) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x82) + label(0x2d) + endloop(0x08) + + // Outro done + label(0x82) + mute_channel(CHANNEL_10) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ANTI, CHRHFLAG_00020000) + + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN1, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(CHR_MAIAN3, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN3, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN3, 2) + + unset_chr_chrflag(CHR_MAIAN4, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN4, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN3, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN4, 2) + + set_ailist(CHR_MAIAN1, AILIST_INIT_MAIAN) + set_ailist(CHR_MAIAN2, AILIST_INIT_MAIAN) + stop_cutscene_track + stop_ambient_track + enter_firstperson + yield + label(0x2d) + set_ailist(CHR_SELF, AILIST_BLOW_MINES) + endlist +}; + +u8 func040b_outro[] = { + set_invincible(CHR_BOND) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_OUTRO) + camera_movement(ANIM_CUT_STAT_OUTRO_CAM) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + + unset_chr_chrflag(CHR_MAIAN3, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_MAIAN3, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN3, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_OUTRO_MAIAN1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN3, 4) + + unset_chr_chrflag(CHR_MAIAN4, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_MAIAN4, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN4, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_OUTRO_MAIAN2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN4, 4) + + unset_chr_chrflag(CHR_MAIAN5, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_MAIAN5, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_MAIAN5, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_STAT_OUTRO_MAIAN3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN5, 4) + + show_nonessential_chrs(FALSE) + + // Wait 10 frames or for button press + restart_timer + + beginloop(0x96) + if_controller_button_pressed(/*goto*/ 0x82) + if_timer_gt(10, /*goto*/ 0x06) + endloop(0x96) + + // Play sound + label(0x06) + play_sound(SFX_MAIAN_05E3, CHANNEL_10) + + // Wait 70 frames or for button press + beginloop(0x97) + if_controller_button_pressed(/*goto*/ 0x82) + if_timer_gt(70, /*goto*/ 0x06) + endloop(0x97) + + // Play sound + label(0x06) + play_sound(SFX_MAIAN_05E5, CHANNEL_10) + + // Wait 180 frames or for button press + beginloop(0x98) + if_controller_button_pressed(/*goto*/ 0x82) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x98) + + // Play sound + label(0x06) + play_sound(SFX_MAIAN_05E7, CHANNEL_10) + + // Wait for outro to finish + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2d) + goto_next(0x82) + label(0x2d) + if_controller_button_pressed(/*goto*/ 0x82) + label(0x2d) + endloop(0x08) + + label(0x82) + label(0x06) + mute_channel(CHANNEL_10) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100f_blow_mines[] = { + yield + + #define wait(loopid) \ + restart_timer \ + \ + beginloop(loopid) \ + if_timer_gt(120, /*goto*/ 0x2d) \ + endloop(loopid) \ + \ + label(0x2d) + + wait(0x94) + destroy_object(OBJ_MINE6) + wait(0x95) + destroy_object(OBJ_MINE1) + wait(0x8f) + destroy_object(OBJ_MINE2) + wait(0x90) + destroy_object(OBJ_MINE3) + wait(0x91) + destroy_object(OBJ_MINE4) + wait(0x92) + destroy_object(OBJ_MINE5) + wait(0x93) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_init_lighting[] = { + yield + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0016, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0017, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0018, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0019, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x001f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0020, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0021, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0022, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0023, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0031, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0040, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0041, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0042, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0043, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0044, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0049, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0049, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x004a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x004f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0058, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0059, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1000_counterop, 0x1000 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1003_spawn_maians, 0x1003 }, + { func1004_spawn_king1_skedar, 0x1004 }, + { func1005_check_leader_dead, 0x1005 }, + { func1007_check_end_level, 0x1007 }, + { func1008_spawn_king2_skedar, 0x1008 }, + { func1009_check_king1_dead, 0x1009 }, + { func100a_check_king2_dead, 0x100a }, + { func100b_check_king3_dead, 0x100b }, + { func100c_spawn_king3_skedar, 0x100c }, + { func100d_king1_invincible, 0x100d }, + { func100f_blow_mines, 0x100f }, + { func1010_init_lighting, 0x1010 }, + { func100f_blow_mines, 0x040d }, + { func040c_hide, 0x040c }, + { func0401_defend, 0x0401 }, + { func0402_init_king, 0x0402 }, + { func0403_init_maian_leader, 0x0403 }, + { func0404_maian, 0x0404 }, + { func0405_init_maian, 0x0405 }, + { func0406_skedar, 0x0406 }, + { func0407_king1_skedar, 0x0407 }, + { func0408_king2_skedar, 0x0408 }, + { func0409_king3_skedar, 0x0409 }, + { func1002_intro, 0x040a }, + { func040b_outro, 0x040b }, + { func1002_intro, 0x0c00 }, + { func040b_outro, 0x0c01 }, + { NULL, 0 }, +}; diff --git a/src/ailists/setuptra.c b/src/ailists/setuptra.c new file mode 100644 index 000000000..4fad1578b --- /dev/null +++ b/src/ailists/setuptra.c @@ -0,0 +1,3910 @@ +// +// Escape +// + +#include "stagesetup.h" + +// Characters +#define CHR_JONATHAN 0x21 +#define CHR_ELVIS 0x22 + +// Objects +#define OBJ_HOVERBED 0x00 // with Elvis on it +#define OBJ_MEDPACK_BOND 0x01 +#define OBJ_TERMINAL1 0x03 +#define OBJ_TERMINAL2 0x04 +#define OBJ_WALLMINE 0x02 +#define OBJ_HOVERBED_EMPTY 0x11 +#define OBJ_MEDPACK_SWITCH 0x14 +#define OBJ_UFO1 0x1f +#define OBJ_UFO2 0x22 +#define OBJ_MEDPACK_COOP 0x20 +#define OBJ_WALLOBJECT 0x21 +#define OBJ_MEDPACK_GLASS 0x2a +#define OBJ_HOVERBIKE 0x35 +#define OBJ_WALLDOOR 0x38 +#define OBJ_FALCON2SCOPE1 0x39 +#define OBJ_FALCON2SCOPE2 0x3a +#define OBJ_REMOTEMINES 0x3b + +// Stage flags +#define STAGEFLAG_INTRO_DONE 0x00000001 +#define STAGEFLAG_TRIGGER_MEDPACK_FINISH 0x00000002 +#define STAGEFLAG_JON_SAID_MAINT_HATCH 0x00000004 +#define STAGEFLAG_TRIGGER_JETBIKE_MESSAGE 0x00000008 +#define STAGEFLAG_UFO_LEAVING 0x00000010 +#define STAGEFLAG_GAS_ON 0x00000020 +#define STAGEFLAG_JON_SHOT_WHILE_PLANTING 0x00000040 +#define STAGEFLAG_MEDPACK_SWITCH_DESTROYED 0x00000080 +#define STAGEFLAG_COLLECTED_MEDPACK 0x00000100 +#define STAGEFLAG_00000200 0x00000200 // never set +#define STAGEFLAG_MET_JON 0x00000400 +#define STAGEFLAG_ELVIS_REVIVED 0x00000800 +#define STAGEFLAG_ELVIS_DEAD 0x00001000 +#define STAGEFLAG_ENTERED_HANGAR 0x00002000 +#define STAGEFLAG_ESCAPED 0x00004000 +#define STAGEFLAG_ELVIS_STASHED 0x00008000 +#define STAGEFLAG_JON_ENTERED_MINE_ROOM 0x00010000 +#define STAGEFLAG_JON_PLANTING_EXPLOSIVES 0x00020000 +#define STAGEFLAG_JON_FINISHED_EXPLOSIVES 0x00040000 +#define STAGEFLAG_JON_DEAD 0x00080000 +#define STAGEFLAG_WALL_EXPLODED 0x00100000 +#define STAGEFLAG_HANGAR_TERMINAL_DESTROYED 0x00200000 +#define STAGEFLAG_INNER_DOOR_OPENING 0x00400000 +#define STAGEFLAG_OUTER_DOOR_OPENING 0x00800000 +#define STAGEFLAG_STARTED_OUTRO 0x01000000 +#define STAGEFLAG_JON_WAITING_AT_UFO 0x02000000 +#define STAGEFLAG_HANGAR_CONVERSATION_FINISHED 0x04000000 +#define STAGEFLAG_HANGAR_X_MUSIC_STARTED 0x08000000 +#define STAGEFLAG_JO_DOING_TERMINALS 0x10000000 +#define STAGEFLAG_JO_ESCAPE_STARTED 0x20000000 +#define STAGEFLAG_MEDPACK_STARTED 0x40000000 +#define STAGEFLAG_BOTH_HANGAR_DOORS_OPEN 0x80000000 + +// AI Lists +#define AILIST_GAS_DAMAGE 0x0401 +#define AILIST_JONATHAN_WAITING_FOR_MEETUP 0x0402 +#define AILIST_INIT_JONATHAN 0x0403 +#define AILIST_JONATHAN_FOLLOWING_AND_MINE 0x0404 +#define AILIST_JONATHAN_SHOT_WHILE_PLANTING 0x0405 +#define AILIST_SPAWNGROUP1_GUARD 0x0407 +#define AILIST_SPAWNGROUP2_GUARD 0x0408 +#define AILIST_SPAWNGROUP3_GUARD 0x0409 +#define AILIST_SPAWNGROUP4_GUARD 0x040a +#define AILIST_ELVIS_FOLLOW 0x040b +#define AILIST_HIDDEN_GUARDTYPE1 0x040c +#define AILIST_HIDDEN_GUARDTYPE2 0x040d +#define AILIST_HIDDEN_BIOTECH 0x040e +#define AILIST_INIT_ELVIS 0x0412 +#define AILIST_JONATHAN_HANGAR 0x0413 +#define AILIST_OUTRO 0x0414 +#define AILIST_UFO_EXIT 0x0415 +#define AILIST_SPAWN_DURING_FOLLOW 0x0416 +#define AILIST_INIT_FOLLOWER_CLONE 0x0417 +#define AILIST_FOLLOWER_CLONE 0x0418 +#define AILIST_INIT_BIOTECH 0x0419 +#define AILIST_INIT_SUPERDRAGON_GUARD 0x041a +#define AILIST_JONATHAN_AFTER_TERMINALS 0x041b +#define AILIST_ELVIS_GO_TO_UFO 0x041c + +// Other +#define SPAWNGROUP1 0x09 +#define SPAWNGROUP2 0x0a +#define SPAWNGROUP3 0x0b +#define SPAWNGROUP4 0x0d + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_TRA_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_TRA_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_TRA_002) + briefing(BRIEFINGTYPE_TEXT_A, L_TRA_003) + + beginobjective(0, L_TRA_009, (DIFFBIT_PA | DIFFBIT_PD)) // "Locate alien tech medpack" + complete_flags(STAGEFLAG_COLLECTED_MEDPACK) + fail_flags(STAGEFLAG_00000200) + fail_flags(STAGEFLAG_MEDPACK_SWITCH_DESTROYED) + endobjective + + beginobjective(1, L_TRA_010, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Rendezvous with CI spy" + complete_flags(STAGEFLAG_MET_JON) + fail_flags(STAGEFLAG_JON_DEAD) + endobjective + + beginobjective(2, L_TRA_012, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate secret hangar" + complete_flags(STAGEFLAG_ENTERED_HANGAR) + endobjective + + beginobjective(3, L_TRA_011, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Revive Maian Bodyguard" + complete_flags(STAGEFLAG_ELVIS_REVIVED) + endobjective + + beginobjective(4, L_TRA_013, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Escape from Area 51" + complete_flags(STAGEFLAG_ESCAPED) + fail_flags(STAGEFLAG_HANGAR_TERMINAL_DESTROYED) + fail_flags(STAGEFLAG_ELVIS_DEAD) + endobjective + + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x23, PAD_TRA_03BE, BODY_BIOTECH, HEAD_DUNCAN2, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_ANTINONINTERACTABLE, 0x24, PAD_TRA_012E, BODY_BIOTECH, HEAD_JAMIE, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_00000200, 0x00, PAD_TRA_03E0, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x01, PAD_TRA_03E1, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0001, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x02, PAD_TRA_03E2, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x03, PAD_TRA_03DF, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0003, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x04, PAD_TRA_03E3, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x05, PAD_TRA_03E4, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0005, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x06, PAD_TRA_03E5, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x07, PAD_TRA_03E6, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0007, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x08, PAD_TRA_03E7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_INIT_SUPERDRAGON_GUARD, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x09, PAD_TRA_03E9, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SPAWN_DURING_FOLLOW, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0009, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x0a, PAD_TRA_03EA, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SPAWN_DURING_FOLLOW, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x0b, PAD_TRA_03EB, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SPAWN_DURING_FOLLOW, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x0c, PAD_TRA_03EC, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_SPAWN_DURING_FOLLOW, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_05, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x0d, PAD_TRA_03E6, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x0e, PAD_TRA_03E5, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ONLYONSA | SPAWNFLAG_ONLYONPA | SPAWNFLAG_00000200, 0x0f, PAD_TRA_03FA, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) +#if VERSION < VERSION_NTSC_1_0 + // Same chr as above but only appears on Agent, and at a different pad + chr(SPAWNFLAG_ONLYONA | SPAWNFLAG_00000200, 0x0f, PAD_TRA_0153, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x000f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) +#endif + chr(SPAWNFLAG_00000200, 0x10, PAD_TRA_03F1, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1, 8, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x11, PAD_TRA_03F2, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1, 8, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0011, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x12, PAD_TRA_03F3, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1, 8, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x13, PAD_TRA_03F4, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1, 8, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_PREWARNED, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0013, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x14, PAD_TRA_016A, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x15, PAD_TRA_03F7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0015, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x16, PAD_TRA_03F8, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE1, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0C, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x21, PAD_TRA_03F9, BODY_A51AIRMAN, HEAD_JONATHAN, AILIST_INIT_JONATHAN, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2, CHRFLAG1_AIVSAI_ADVANTAGED | CHRFLAG1_PUNCHHARDER, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0021, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_DY357MAGNUM) + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, 0x22, PAD_TRA_010A, BODY_ELVIS1, HEAD_ELVIS, GAILIST_IDLE, -1, -1, 1000, 100, CHRFLAG0_HOLD_POSITION | CHRFLAG0_CANLOSEGUN, 0, TEAM_ALLY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + chr(0, 0x17, PAD_TRA_0119, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0017, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(0, 0x18, PAD_TRA_0111, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(0, 0x19, PAD_TRA_010C, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0019, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(0, 0x1a, PAD_TRA_00ED, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0D, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1b, PAD_TRA_00E1, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001b, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1c, PAD_TRA_00DB, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1d, PAD_TRA_00B7, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001d, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1e, PAD_TRA_00A8, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x1f, PAD_TRA_00A1, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x001f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x20, PAD_TRA_00A0, BODY_AREA51GUARD, HEAD_RANDOM, AILIST_HIDDEN_GUARDTYPE2, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0F, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + chr(SPAWNFLAG_00000200, 0x25, PAD_TRA_013A, BODY_BIOTECH, HEAD_BIOTECH, AILIST_HIDDEN_BIOTECH, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0025, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x26, PAD_TRA_013C, BODY_BIOTECH, HEAD_BIOTECH, AILIST_HIDDEN_BIOTECH, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0026, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x27, PAD_TRA_013A, BODY_BIOTECH, HEAD_BIOTECH, AILIST_HIDDEN_BIOTECH, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0027, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x28, PAD_TRA_0134, BODY_BIOTECH, HEAD_BIOTECH, AILIST_HIDDEN_BIOTECH, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0028, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x29, PAD_TRA_0118, BODY_BIOTECH, HEAD_BIOTECH, AILIST_INIT_BIOTECH, -1, -1, 1000, 6, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x0029, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x2a, PAD_TRA_0115, BODY_BIOTECH, HEAD_BIOTECH, AILIST_INIT_BIOTECH, -1, -1, 1000, 6, CHRFLAG0_AIVSAI | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_00, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDRUGGUN, 0x002a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_TRANQUILIZER) + chr(SPAWNFLAG_00000200, 0x2b, PAD_TRA_03BC, BODY_AREA51GUARD, HEAD_BEAU1, AILIST_HIDDEN_BIOTECH, -1, -1, 1000, 100, CHRFLAG0_AIVSAI | CHRFLAG0_HOLD_POSITION | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_0E, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSUPERDRAGON, 0x002b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SUPERDRAGON) + tag(0x00, 1) + hover_prop(0x0100, MODEL_HOVERBED, PAD_TRA_03BD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_INTERACTABLE | OBJFLAG3_HOVERBEDSHIELD, 1000, 0x00010000) + tag(0x11, 1) + hover_prop(0x0100, MODEL_A51TROLLEY, PAD_TRA_0120, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE, 1000, 0x00010000) + hover_prop(0x0100, MODEL_HOVERBED, PAD_TRA_0122, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_HOVERBEDSHIELD, 1000, 0x00010000) + tag(0x35, 1) + hoverbike(0x0100, MODEL_HOVBIKE, PAD_TRA_03FB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE | OBJFLAG3_GEOCYL, 1000) + hover_prop(0x0100, MODEL_HOVERCRATE1, PAD_TRA_011D, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_DEACTIVATED | OBJFLAG_20000000, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, OBJFLAG3_PUSHABLE | OBJFLAG3_GRABBABLE, 1000, 0x02010000) + tag(0x17, 2) + tag(0x18, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_027F, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_027E, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_027D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_027C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x15, 2) + tag(0x16, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_027A, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_027B, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0278, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0279, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0277, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0276, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x19, 2) + tag(0x1a, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0274, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0275, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0273, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0272, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0270, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0271, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_026F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_026E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_026C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_026D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_026B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_026A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x3c, 2) + tag(0x3d, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0268, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0269, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x1b, 2) + tag(0x1c, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0266, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0267, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x1d, 2) + tag(0x1e, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0280, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0281, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02B7, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02B8, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02B9, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02BA, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02BB, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02BC, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x06, 2) + tag(0x07, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0283, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0282, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0284, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_0285, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_028B, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_028A, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_TRA_0286, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0287, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) + tag(0x33, 2) + tag(0x34, 2) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_TRA_0289, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0288, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_TRA_0289, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0288, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000078, 0x00000000, 0xffffffff, 0x00000000) +#endif + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02A4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + tag(0x32, 1) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02A5, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + tag(0x0c, 1) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000040, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + tag(0x0b, 1) + door(0x0100, MODEL_A51_HORIZ_DOOR_SECRET, PAD_TRA_028E, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + tag(0x0a, 1) + door(0x0100, MODEL_A51_HORIZ_DOOR_SECRET, PAD_TRA_02C5, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000002, 0x0000003c, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_0292, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_0293, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_0294, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_0295, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0d, 1) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_02AE, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_0299, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_0298, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_TRA_02A8, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000040, 0x00000258, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02A7, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000258, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_029A, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_029B, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x31, 1) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_029C, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_029D, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_SLIDING, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x30, 1) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_029E, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_029F, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000c000, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_SLIDING, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0e, 2) + tag(0x0f, 2) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_02A1, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_02A0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_028C, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_028D, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_028F, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x10, 1) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_0290, OBJFLAG_DEACTIVATED, 0, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x05, 1) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_0291, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + tag(0x08, 2) + tag(0x09, 2) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_02A2, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000a666, 0x0000a666, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_02A3, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000a666, 0x0000a666, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02E5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_TRA_02E6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_02E7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02E8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_TRA_02E9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_02EA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02EB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_TRA_02EC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_02ED, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02EE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_TRA_02EF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_02F0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02F1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_TRA_02F2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_02F3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02F4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_TRA_02F5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_02F6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE1, PAD_TRA_02F7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x38, 4) + tag(0x21, 4) + blocked_path(2, 0x0173, 0x013f) + conditional_scenery(1, 2, 3) + door(0x0100, MODEL_A51_UNEXP2, PAD_TRA_0424, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) + stdobject(0x0100, MODEL_A51_UNEXP3, PAD_TRA_0425, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_A51_EXP2, PAD_TRA_0423, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_02B3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_ST, PAD_TRA_02B4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_RIGHT, PAD_TRA_02AF, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0x00000001, 0x00000300) + door(0x0100, MODEL_A51_VERT_DOOR_LEFT, PAD_TRA_02B0, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000cccc, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000010, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_TRA_0321, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_TRA_0327, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_TRA_0322, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_TRA_0328, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) +#else + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_TRA_0321, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) + door(0x0100, MODEL_DOOR_ROLLERTRAIN, PAD_TRA_0327, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000c000, 0x000031c7, 0x000031c7, 0x000002fc, DOORFLAG_0004, DOORTYPE_VERTICAL, 0x00000002, 0x0000012c, 0x00000000, 0x00000000, 0x00000000) +#endif + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02B2, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, DOORFLAG_AUTOMATIC, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02B1, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02BD, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02BE, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02BF, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02C0, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02C1, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02C2, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02C3, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02C4, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000000, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + tag(0x02, 1) + stdobject(0x0100, MODEL_CHRREMOTEMINE, PAD_TRA_013F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_REMOVEWHENDESTROYED | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x03, 1) + singlemonitor(0x0100, MODEL_SINISTERSTATION, PAD_TRA_048E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + tag(0x04, 1) + singlemonitor(0x0033, MODEL_SINISTERSTATION, PAD_TRA_03FD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000, 3) + glass(0x0100, MODEL_MEDLABWIN1, PAD_TRA_0436, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_TRA_0437, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_TRA_0438, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN1, PAD_TRA_0439, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_TRA_043A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + glass(0x0100, MODEL_MEDLABWIN2, PAD_TRA_043B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_INVINCIBLE | OBJFLAG_AISEETHROUGH, OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x1f, 1) + stdobject(0x0100, MODEL_ELVIS_SAUCER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x22, 1) + stdobject(0x0100, MODEL_ELVIS_SAUCER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0461, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0462, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0463, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0464, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0465, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0466, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0467, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0468, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0469, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_046A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_046B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_046C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_046D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_046E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_046F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0470, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0471, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0472, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0473, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0474, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0476, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0477, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0479, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_047A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_047B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_047C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_047D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_047E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_047F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0480, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0481, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0482, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0483, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0484, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0485, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0486, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0487, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0488, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_TRA_0489, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0491, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0492, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0493, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0494, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0495, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0496, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0497, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0498, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_0499, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_049A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_049B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_049C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_049D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_049E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_049F, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_04A0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_04A1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_04A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51WASTEBIN, PAD_TRA_04A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51DIVIDE, PAD_TRA_04AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_A51_CRATE3, PAD_TRA_031A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x23, 7) + tag(0x24, 7) + tag(0x25, 7) + tag(0x26, 7) + tag(0x27, 7) + tag(0x28, 7) + tag(0x29, 7) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04B8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04B9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04BA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04BB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04BC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_04BE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE | OBJFLAG3_LONGPUSHRANGE, 1000) + tag(0x2a, 1) + glass(0x0100, MODEL_MEDLABWIN2, PAD_TRA_043C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF, 0, 1000) + tag(0x12, 2) + tag(0x13, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_GL, PAD_TRA_0264, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, DOORFLAG_WINDOWED, DOORTYPE_VERTICAL, 0x00000040, 0x00000258, 0x01f407d0, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_0265, OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x0000f333, 0x0001aaaa, 0x0001aaaa, 0x00000ccc, 0, DOORTYPE_VERTICAL, 0x00000040, 0x00000258, 0x00000000, 0xffffffff, 0x00000000) + tag(0x14, 1) + stdobject(0x0100, MODEL_A51DESKENT, PAD_TRA_048A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, OBJFLAG3_INTERACTABLE, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_048B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_048C, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_LAB_CONTAINER, PAD_TRA_048D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x01, 1) + weapon(0x0100, MODEL_CHRBRIEFCASE, PAD_TRA_037F, OBJFLAG_00000001, 0, 0, WEAPON_AUTOSURGEON) + rename_object(-1, WEAPON_AUTOSURGEON, L_TRA_020, L_TRA_021, L_TRA_022, L_TRA_023, L_TRA_024) // "Obtain alien medpack." + tag(0x20, 1) + weapon(0x0100, MODEL_CHRBRIEFCASE, -1, OBJFLAG_00000001, 0, 0, WEAPON_AUTOSURGEON) + rename_object(-1, WEAPON_AUTOSURGEON, L_TRA_020, L_TRA_021, L_TRA_022, L_TRA_023, L_TRA_024) // "Obtain alien medpack." + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_04D0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_04D1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_04D2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_04D3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04D8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04D9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04DA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04DB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04DD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04DE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04DF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04E0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_G5_MAINFRAME, PAD_TRA_04E1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x2b, 1) + stdobject(0x0100, MODEL_A51TABLE, PAD_TRA_0129, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + tag(0x2c, 2) + tag(0x2d, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02DC, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x0000028f, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02DD, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x0000028f, 0, DOORTYPE_VERTICAL, 0x00000000, 0x9ffffff6, 0x00000000, 0xffffffff, 0x00000000) + tag(0x2e, 2) + tag(0x2f, 2) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02DE, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x0000028f, 0, DOORTYPE_VERTICAL, 0x00000000, 0x00000258, 0x00000000, 0x00000001, 0x00000400) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02DF, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x0000028f, 0, DOORTYPE_VERTICAL, 0x00000000, 0x9ffffff6, 0x00000000, 0xffffffff, 0x00000000) + tag(0x46, 2) + tag(0x3e, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_033C, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033c, 0x033d, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_045C, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x48, 2) + tag(0x40, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_0340, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0340, 0x0341, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_0459, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x4a, 2) + tag(0x42, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_0344, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0344, 0x0345, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_045A, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x4c, 2) + tag(0x44, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_0348, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0348, 0x0349, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_045B, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x47, 2) + tag(0x3f, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_033F, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x033f, 0x033e, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_045E, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x49, 2) + tag(0x41, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_0343, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0343, 0x0342, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_045F, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x4b, 2) + tag(0x43, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_0347, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0347, 0x0346, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_0460, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + tag(0x4d, 2) + tag(0x45, 2) + lift(0x0100, MODEL_CHAMBER, PAD_TRA_034B, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x034b, 0x034a, -1, -1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x00000000) + singlemonitor(0x0100, MODEL_MODEMBOX, PAD_TRA_045D, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000, 18) + stdobject(0x0100, MODEL_A51_EXP1, PAD_TRA_0421, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_A51GRATE, PAD_TRA_0443, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_A51GRATE, PAD_TRA_0444, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x4e, 1) + lift(0x0100, MODEL_A51_LIFT_THINWALL, PAD_TRA_0336, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0336, 0x0337, -1, -1, 0x00000001, 0x00000002, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x20000000) + door(0x0100, MODEL_A51LIFTDOOR, PAD_TRA_02E4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + door(0x0100, MODEL_A51LIFTDOOR, PAD_TRA_02E3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, OBJFLAG3_80000000, 1000, 0x0000cccc, 0x00010000, 0x00000888, 0x00000888, 0x00000147, DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x0000003c, 0x00000000, 0x00000000, 0x00000300) + lift_door(-2, -3, 0) + lift_door(-2, -4, 1) + stdobject(0x0100, MODEL_A51GRATE, PAD_TRA_0449, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x4f, 4) + tag(0x50, 4) + tag(0x51, 4) + tag(0x52, 4) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02AA, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02AB, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_A51_HORIZ_DOOR_BOT, PAD_TRA_02AC, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0000003c, 0x00000000, 0x00000001, 0x00000100) + door(0x0100, MODEL_A51_HORIZ_DOOR_TOP, PAD_TRA_02AD, OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x0000f333, 0x00085555, 0x00085555, 0x00001999, 0, DOORTYPE_VERTICAL, 0x00000080, 0x0fffffff, 0x00000000, 0xffffffff, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + tag(0x53, 2) + tag(0x54, 2) + door(0x0100, MODEL_A51GATE_L, PAD_TRA_02B5, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0x00000001, 0x00001800) + door(0x0100, MODEL_A51GATE_R, PAD_TRA_02B6, OBJFLAG_00000010 | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000cccc, 0x00010000, 0x00000ccc, 0x00014000, 0x00000111, 0, DOORTYPE_SLIDING, 0x00000008, 0x00000384, 0x00000000, 0xffffffff, 0x00001800) +#endif + tag(0x36, 1) + shield(0x0100, MODEL_CHRSHIELD, 0x0028, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x37, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_TRA_037F, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x39, 2) + tag(0x3a, 2) + weapon(0x0100, MODEL_CHRFALCON2SCOPE, 0x0023, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_FALCON2_SCOPE) + weapon(0x0100, MODEL_CHRFALCON2SCOPE, 0x0024, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_20000000, 0, 0, WEAPON_FALCON2_SCOPE) + link_guns(-1, -2) + tag(0x3b, 1) + weapon(0x0100, MODEL_MULTI_AMMO_CRATE, PAD_TRA_0567, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, 0, WEAPON_REMOTEMINE) + pad_effect(0x00000001, 0x00000129) + endprops +}; + +s32 intro[] = { + spawn(PAD_TRA_012F) + intro_weapon(WEAPON_FALCON2_SCOPE, -1) + ammo(AMMOTYPE_PISTOL, 100) + ammo(AMMOTYPE_REMOTE_MINE, 2) + outfit(OUTFIT_LAB) + endintro +}; + +u8 func1400_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + yield + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1022_gas_damage_bond[] = { + set_target_chr(CHR_BOND) + set_ailist(CHR_SELF, AILIST_GAS_DAMAGE) + endlist +}; + +u8 func1023_gas_damage_coop[] = { + set_target_chr(CHR_COOP) + if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x32) + set_ailist(CHR_SELF, AILIST_GAS_DAMAGE) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0401_gas_damage[] = { + beginloop(0x12) + if_stage_flag_eq(STAGEFLAG_INTRO_DONE, TRUE, /*goto*/ 0x32) + endloop(0x12) + + label(0x32) + restart_timer + + beginloop(0x04) + if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x008f, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0090, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0092, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0093, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0094, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0095, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0096, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0097, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0098, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + restart_timer + + // @bug: Only Jo gets motion blur? + label(0x08) + yield + call_rng + if_rand_gt(50, /*goto*/ 0x32) + add_motion_blur(CHR_BOND, 7, TRUE) + label(0x32) + if_timer_lt(460, /*goto*/ 0x32) + restart_timer + damage_chr_by_amount(CHR_TARGET, 2, 2) + label(0x32) + if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x008f, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0090, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0092, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0093, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0094, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0095, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0096, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0097, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0098, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) + if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + goto_first(0x08) + + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_jon_msgs_gravedanger[] = { + beginloop(0x0d) + if_stage_flag_eq(STAGEFLAG_INTRO_DONE, TRUE, /*goto*/ 0x32) + endloop(0x0d) + + label(0x32) + restart_timer + + beginloop(0x04) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + restart_timer +#if VERSION >= VERSION_NTSC_1_0 + speak(CHR_BOND, L_TRA_014, SFX_814F, CHANNEL_4, COLOR_03_RED) // "Joanna - this is Jonathan. You're in grave danger." +#else + speak(CHR_BOND, L_TRA_014, SFX_814C, CHANNEL_4, COLOR_03_RED) // "Joanna - this is Jonathan. You're in grave danger." +#endif + + beginloop(0x08) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_015, SFX_8150, CHANNEL_4, COLOR_03_RED) // "They've flooded the area with nerve gas." + + beginloop(0x09) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_016, SFX_8151, CHANNEL_4, COLOR_03_RED) // "Get our friend to the containment lab. There's a h..." + + beginloop(0x0a) + if_timer_gt(270, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_017, SFX_8152, CHANNEL_4, COLOR_03_RED) // "I'll contact you when you get there - good luck!" + + beginloop(0x0c) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_jon_msgs_meetup[] = { + beginloop(0x04) + if_object_in_room(OBJ_HOVERBED, 0x00df, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_ELVIS_STASHED) + mute_channel(CHANNEL_0) +#if VERSION >= VERSION_NTSC_1_0 + unset_object_flag2(0x0d, OBJFLAG2_LOCKEDFRONT) +#endif + set_object_flag2(0x0d, OBJFLAG2_LOCKEDBACK) + unlock_door(0x0d, 0x20) + release_grabbed_object(CHR_BOND) + yield + unset_object_flag3(OBJ_HOVERBED, OBJFLAG3_GRABBABLE) + unset_object_flag3(OBJ_HOVERBED, OBJFLAG3_PUSHABLE) + restart_timer + speak(CHR_BOND, L_TRA_018, SFX_8153, CHANNEL_4, COLOR_03_RED) // "Good work, Jo. We need to meet up. They're getting..." + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_019, SFX_8154, CHANNEL_4, COLOR_03_RED) // "Use the maintenance hatch I've opened in one of th..." + + beginloop(0x09) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_stage_flag(STAGEFLAG_JON_SAID_MAINT_HATCH) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_check_medpack_collected[] = { + beginloop(0x04) + if_chr_has_object(CHR_BOND, OBJ_MEDPACK_BOND, /*goto*/ 0x06) + if_chr_has_object(CHR_COOP, OBJ_MEDPACK_BOND, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_COLLECTED_MEDPACK) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0403_init_jonathan[] = { + set_self_chrflag(CHRCFLAG_PUSHABLE) + set_self_chrflag(CHRCFLAG_NOAUTOAIM) + if_difficulty_gt(DIFF_A, /*goto*/ 0x32) + + // Agent only + beginloop(0x0d) + chr_move_to_pad(CHR_JONATHAN, PAD_TRA_0398, 0x00, /*goto*/ 0x32) + endloop(0x0d) + + // All difficulties + label(0x32) + add_health_or_armor(1200) + set_alertness(150) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_JONATHAN_WAITING_FOR_MEETUP) + endlist +}; + +u8 func0402_jonathan_waiting_for_meetup[] = { + set_shotlist(AILIST_JONATHAN_WAITING_FOR_MEETUP) + if_chr_deadish(CHR_SELF, /*goto*/ 0x32) + goto_next(0x67) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x67) + set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) + set_self_chrflag(CHRCFLAG_RUNFASTER) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x06) + endloop(0x04) + + label(0x06) + lock_door(0x0d, 0x20) + lock_door(0x33, 0x20) + lock_door(0x34, 0x20) + speak(CHR_P1P2, L_TRA_025, MP3_02B3, CHANNEL_4, COLOR_03_RED) // "Joanna - over here." + label(0x08) + restart_timer + do_preset_animation(PRESETANIM_TALK3) + + beginloop(0x09) + if_within_targets_fovx_by_angle(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) + + beginloop(0x0a) + if_sound_finished(CHANNEL_4, /*goto*/ 0x32) + reloop(0x0a) + + label(0x32) + if_timer_lt(150, /*goto*/ 0x32) + if_distance_to_target_lt(300, /*goto*/ 0x06) + label(0x32) + endloop(0x0a) + + label(0x06) + speak(CHR_P1P2, L_TRA_026, MP3_02B4, CHANNEL_4, COLOR_03_RED) // "We need to get back to our friend." + set_stage_flag(STAGEFLAG_MET_JON) + do_preset_animation(PRESETANIM_TALKRANDOM) + restart_timer + + beginloop(0x0c) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + stop_chr + set_ailist(CHR_SELF, AILIST_JONATHAN_FOLLOWING_AND_MINE) + endlist +}; + +u8 func0404_jonathan_following_and_mine[] = { +#define LABEL_FOLLOW 0x5a + + set_chr_team(CHR_SELF, TEAM_ALLY) + yield + rebuild_teams + rebuild_squadrons + set_returnlist(CHR_SELF, AILIST_JONATHAN_FOLLOWING_AND_MINE) + set_shotlist(AILIST_JONATHAN_FOLLOWING_AND_MINE) + if_chr_deadish(CHR_SELF, /*goto*/ 0x32) + goto_next(0x06) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x32) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x0d) + label(0x32) + goto_next(0x63) + + // Alive + label(0x06) + restart_timer + + beginloop(0x64) + if_chr_stopped(/*goto*/ 0x63) + endloop(0x64) + + label(0x63) + if_stage_flag_eq(STAGEFLAG_JON_SHOT_WHILE_PLANTING, TRUE, /*goto*/ 0x0e) + set_target_chr(CHR_P1P2) + + label(LABEL_FOLLOW) + if_distance_to_target_gt(200, /*goto*/ 0x5c) + + // distance <= 200 (waiting) + stop_chr + restart_timer + + beginloop(0x5b) + label(0x32) + if_can_see_target(/*goto*/ 0x06) + goto_next(0x5c) + + label(0x06) + if_distance_to_target_gt(200, /*goto*/ 0x5c) + endloop(0x5b) + + // distance > 200 + label(0x5c) + restart_timer + if_distance_to_target_lt(300, /*goto*/ 0x32) + + // distance >= 300 + try_run_to_target(/*goto*/ 0x5d) + + // distance > 200 and distance < 300 + label(0x32) + try_walk_to_target(/*goto*/ 0x5d) + + // Moving towards Jo + label(0x5d) + restart_timer + yield + + label(0x06) + if_enemy_distance_lt_and_los(1500, /*goto*/ 0x09) + + // distance >= 1500 and no line of sight + // Note the timer check is pointless here because it is restarted in + // each loop iteration. + label(0x32) + set_target_chr(CHR_P1P2) + if_distance_to_target_lt(200, /*goto*/ 0x5e) + if_timer_gt(120, /*goto*/ 0x5e) + if_chr_stopped(/*goto*/ 0x5e) + goto_first(0x5d) + + label(0x5e) + if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x32) + if_stage_flag_eq(STAGEFLAG_JON_ENTERED_MINE_ROOM, TRUE, /*goto*/ 0x32) + if_chr_in_room(CHR_JONATHAN, 0x00, 0x00dc, /*goto*/ 0x0a) + if_chr_in_room(CHR_JONATHAN, 0x00, 0x00dd, /*goto*/ 0x0a) + goto_first(LABEL_FOLLOW) + + // Unreachable + if_chr_in_room(CHR_P1P2, 0x00, 0x00dc, /*goto*/ 0x0a) + if_chr_in_room(CHR_P1P2, 0x00, 0x00dd, /*goto*/ 0x0a) + + label(0x32) + goto_first(LABEL_FOLLOW) + + // Saw enemy + label(0x09) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // In mine room + label(0x0a) + unset_self_chrflag(CHRCFLAG_PUSHABLE) + set_stage_flag(STAGEFLAG_JON_ENTERED_MINE_ROOM) + speak(CHR_P1P2, L_TRA_027, MP3_02B5, CHANNEL_4, COLOR_03_RED) // "Right, we're near. Cover me, Jo..." + set_shotlist(AILIST_JONATHAN_SHOT_WHILE_PLANTING) + label(0x0b) + jog_to_pad(PAD_TRA_038B) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + play_x_track(XREASON_DEFAULT, 10, 30) + restart_timer + try_face_entity(ATTACKFLAG_AIMATPAD, 0x0173, /*goto*/ 0xc4) + + beginloop(0xc4) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0xc4) + + label(0x06) + restart_timer + set_stage_flag(STAGEFLAG_JON_PLANTING_EXPLOSIVES) + + label(0xc2) + call_rng + if_rand_lt(86, /*goto*/ 0x6a) + if_rand_lt(172, /*goto*/ 0x6b) + chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x0e) + + label(0x6a) + chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + goto_next(0x0e) + + label(0x6b) + chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) + + label(0x0e) + set_shotlist(AILIST_JONATHAN_SHOT_WHILE_PLANTING) + resume_timer + unset_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + + // Mine planting loop (33.3 seconds) + beginloop(0x0d) + if_timer_gt(2000, /*goto*/ 0x06) + if_chr_idle(/*goto*/ 0x32) + goto_first(0xc2) + + label(0x32) + endloop(0x0d) + + label(0x06) + set_shotlist(AILIST_JONATHAN_FOLLOWING_AND_MINE) + set_stage_flag(STAGEFLAG_JON_FINISHED_EXPLOSIVES) + unset_stage_flag(STAGEFLAG_JON_SHOT_WHILE_PLANTING) + set_self_chrflag(CHRCFLAG_PUSHABLE) + speak(CHR_P1P2, L_TRA_028, MP3_02B6, CHANNEL_4, COLOR_03_RED) // "Okay - stand back." + run_to_pad(PAD_TRA_0140) + + beginloop(0x0f) + if_chr_stopped(/*goto*/ 0x12) + endloop(0x0f) + + label(0x12) + stop_chr + + beginloop(0x10) + if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x06) + endloop(0x10) + + label(0x06) + unlock_door(0x0a, 0x02) + speak(CHR_P1P2, L_TRA_032, MP3_02B7, CHANNEL_4, COLOR_03_RED) // "Okay, Jo - let's go." + restart_timer + + beginloop(0x11) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x11) + + label(0x06) + goto_first(LABEL_FOLLOW) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0413_jonathan_hangar[] = { + set_returnlist(CHR_SELF, AILIST_JONATHAN_HANGAR) + set_shotlist(AILIST_JONATHAN_HANGAR) + if_chr_deadish(CHR_SELF, /*goto*/ 0x32) + goto_next(0x06) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x32) + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x63) + + // Injured + label(0x06) + restart_timer + + beginloop(0x64) + if_chr_stopped(/*goto*/ 0x63) + endloop(0x64) + + // Attack enemy (jumped to from further below) + label(0x09) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + + // Alive and well + label(0x63) + set_target_chr(CHR_P1P2) + label(0x12) + jog_to_pad(PAD_TRA_015F) + + beginloop(0x13) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x32) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_distance_to_pad_lt(CHR_SELF, 3510, PAD_TRA_001E, /*goto*/ 0x06) +#endif + if_chr_stopped(/*goto*/ 0x06) + endloop(0x13) + + label(0x32) + goto_first(0x09) + + // Waiting at pad + label(0x06) + set_stage_flag(STAGEFLAG_JON_WAITING_AT_UFO) + stop_chr + set_target_chr(CHR_P1P2) + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x14) + + // Wait until both Joanna and Elvis within 400 units + beginloop(0x14) + set_target_chr(CHR_ELVIS) + if_distance_to_target_gt(400, /*goto*/ 0x32) + set_target_chr(CHR_P1P2) + if_distance_to_target_gt(400, /*goto*/ 0x32) + if_target_in_sight(/*goto*/ 0x06) + label(0x32) + endloop(0x14) + + // Start conversation + label(0x06) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + restart_timer + chr_do_animation(ANIM_TALKING_0232, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_ELVIS, 2) + speak(CHR_P1P2, L_TRA_059, MP3_029A, CHANNEL_5, COLOR_06_WHITE) // "Oh, no! We have a problem. It's a single seater!" + + beginloop(0x7d) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x7d) + + label(0x32) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x7d) + + label(0x06) + restart_timer + chr_do_animation(ANIM_TALKING_0233, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_ELVIS, 2) + speak(CHR_P1P2, L_TRA_060, MP3_029B, CHANNEL_5, COLOR_06_WHITE) // "Two can get in but no more." + + beginloop(0x7e) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x7e) + + label(0x32) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x7e) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_041, MP3_02A7, CHANNEL_5, COLOR_09_BLUE) // "It's the only way out of here." + + beginloop(0x15) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x15) + + label(0x32) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x15) + + label(0x06) + restart_timer + chr_do_animation(ANIM_TALKING_0232, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_ELVIS, 2) + speak(CHR_P1P2, L_TRA_061, MP3_029C, CHANNEL_5, COLOR_06_WHITE) // "Plus, it's got no style, you know what I'm saying?" + + beginloop(0x7f) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x7f) + + label(0x32) + if_timer_gt(200, /*goto*/ 0x06) + endloop(0x7f) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_042, MP3_02A8, CHANNEL_5, COLOR_09_BLUE) // "You're the only one who can fly it, Elvis, so get ..." + + beginloop(0x17) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + endloop(0x17) + + label(0x32) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x17) + + label(0x06) + restart_timer + chr_do_animation(ANIM_TALKING_0231, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_JONATHAN, 2) + speak(CHR_P1P2, L_TRA_045, MP3_02B9, CHANNEL_5, COLOR_03_RED) // "One of us will have to stay behind and open the ha..." + + beginloop(0x1a) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x1a) + + label(0x32) + if_timer_gt(240, /*goto*/ 0x06) + endloop(0x1a) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_043, MP3_02A9, CHANNEL_5, COLOR_09_BLUE) // "But we can't leave you behind." + + beginloop(0x18) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x18) + + label(0x32) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x18) + + label(0x06) + restart_timer + speak(CHR_BOND, L_TRA_044, MP3_02AA, CHANNEL_5, COLOR_09_BLUE) // "There must be a way out of here." + + beginloop(0x19) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) + if_sound_finished(CHANNEL_5, /*goto*/ 0x32) + reloop(0x19) + + label(0x32) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x19) + + label(0x06) + restart_timer + chr_do_animation(ANIM_TALKING_0232, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_JONATHAN, 2) + speak(CHR_P1P2, L_TRA_046, MP3_02BA, CHANNEL_5, COLOR_03_RED) // "I'll get out on that hoverbike. Cover me while I o..." + + beginloop(0x1b) + if_timer_gt(120, /*goto*/ 0x66) + reloop(0x1b) + + label(0x66) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) + set_ailist(CHR_ELVIS, AILIST_ELVIS_GO_TO_UFO) + + label(0x06) + set_stage_flag(STAGEFLAG_HANGAR_CONVERSATION_FINISHED) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + restart_timer + jog_to_pad(PAD_TRA_016F) + + // Once Jon starts jogging, 4 seconds will pass before he starts checking + // other things. One of these is a Y check, where the X music will start + // once he's a certain way up the ramp. The other is a distance to Jo check + // where she'll take over. + beginloop(0x1c) + if_timer_lt(240, /*goto*/ 0x32) + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x32) + if_chr_y(CHR_SELF, -600, OPERATOR_GREATER_THAN, /*goto*/ 0x33) + set_target_chr(CHR_P1P2) + if_distance_to_target_lt(300, /*goto*/ 0x59) + label(0x32) + if_chr_stopped(/*goto*/ 0x06) + reloop(0x1c) + + // Jon is up the ramp + label(0x33) + set_stage_flag(STAGEFLAG_HANGAR_X_MUSIC_STARTED) + play_x_track(XREASON_DEFAULT, 10, 90) + run_to_pad(PAD_TRA_016F) + set_stage_flag(STAGEFLAG_HANGAR_X_MUSIC_STARTED) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x1c) + + // At first terminal + label(0x06) + chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x1d) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x1d) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x32) + set_stage_flag(STAGEFLAG_INNER_DOOR_OPENING) + open_door(0x2c) + open_door(0x2d) + set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) + show_hudmsg(CHR_P1P2, L_TRA_039) // "Inner hangar door is opening." + + label(0x32) + set_self_flag_bankx(CHRFLAG0_FORCESAFETYCHECKS, BANK_0) + run_to_pad(PAD_TRA_0171) + + beginloop(0x1e) + if_chr_distance_to_pad_lt(CHR_SELF, 3690, PAD_TRA_0014, /*goto*/ 0x06) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x1e) + + // At second terminal + label(0x06) + chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x1f) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x1f) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x20) + set_stage_flag(STAGEFLAG_OUTER_DOOR_OPENING) + open_door(0x2e) + open_door(0x2f) + set_object_flag(0x2e, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2f, OBJFLAG_DOOR_KEEPOPEN) + show_hudmsg(CHR_P1P2, L_TRA_037) // "Outer hangar door is opening." + + beginloop(0x20) + set_ailist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) + endloop(0x20) + + // Jo taking over + label(0x59) + speak(CHR_BOND, L_TRA_047, MP3_02AC, CHANNEL_5, COLOR_09_BLUE) // "Jonathan, go with Elvis. I'll see to the consoles." + restart_timer + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x46) + + beginloop(0x46) + if_target_in_fov_left(10, /*goto*/ 0x06) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x46) + + label(0x06) + restart_timer + + beginloop(0x4a) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x4a) + + label(0x06) + set_stage_flag(STAGEFLAG_JO_DOING_TERMINALS) + set_stage_flag(STAGEFLAG_HANGAR_X_MUSIC_STARTED) + play_x_track(XREASON_DEFAULT, 10, 90) + set_ailist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) + + // Elvis dead + label(0xc3) + set_returnlist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) + set_ailist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) + endlist +}; + +u8 func041c_elvis_go_to_ufo[] = { + set_returnlist(CHR_SELF, AILIST_ELVIS_GO_TO_UFO) + set_shotlist(AILIST_ELVIS_GO_TO_UFO) + if_chr_deadish(CHR_SELF, /*goto*/ 0x32) + goto_next(0x06) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + run_to_pad(PAD_TRA_03FE) + + beginloop(0x08) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x08) + + label(0x06) + stop_chr + + beginloop(0x6a) + endloop(0x6a) + + endlist +}; + +u8 func041b_jonathan_after_terminals[] = { + set_returnlist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) + set_shotlist(AILIST_JONATHAN_AFTER_TERMINALS) + if_chr_deadish(CHR_SELF, /*goto*/ 0x32) + goto_next(0x06) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + run_to_pad(PAD_TRA_015F) // conversation corner + + beginloop(0x4b) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_distance_to_pad_lt(CHR_SELF, 3510, PAD_TRA_0014, /*goto*/ 0x06) +#endif + if_chr_stopped(/*goto*/ 0x06) + endloop(0x4b) + + label(0x06) + jog_to_pad(PAD_TRA_0168) // corner near ramp + + beginloop(0x4c) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x09) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x4c) + + label(0x06) + stop_chr + + beginloop(0x4d) + if_enemy_distance_lt_and_los(2540, /*goto*/ 0x09) + endloop(0x4d) + + label(0x09) + set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) + endlist +}; + +u8 func0405_jonathan_shot_while_planting[] = { + set_stage_flag(STAGEFLAG_JON_SHOT_WHILE_PLANTING) + label(0x04) + pause_timer + if_just_injured(CHR_SELF, /*goto*/ 0x06) + goto_next(0x63) + + // Injured + label(0x06) + restart_timer + + beginloop(0x64) + if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) + if_num_times_shot_lt(1, /*goto*/ 0x06) + if_timer_lt(20, /*goto*/ 0x06) + speak(CHR_P1P2, L_TRA_051, SFX_8155, CHANNEL_5, COLOR_03_RED) // "Damn it, Joanna... cover me!" + set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) + label(0x06) + if_chr_stopped(/*goto*/ 0x63) + endloop(0x64) + + // Not injured, or recovered + label(0x63) + label(0x0b) + walk_to_pad(PAD_TRA_038B) + + beginloop(0x0c) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x0c) + + label(0x06) + try_face_entity(ATTACKFLAG_AIMATPAD, 0x0173, /*goto*/ 0xc4) + + beginloop(0xc4) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0xc4) + + label(0x06) + set_shotlist(AILIST_JONATHAN_FOLLOWING_AND_MINE) + set_ailist(CHR_SELF, AILIST_JONATHAN_FOLLOWING_AND_MINE) + endlist +}; + +/** + * @unused + */ +u8 func0406_unused_0406[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_alertness(100) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * Waits until the meetup with Jon is done and the player is in the hallway. + * Spawns 15 guards total, maximum 4 alive at any time. Every 60 seconds, checks + * to see whether it should spawn more. Stops once 15 have been spawned or Jon + * has finished planting the explosives. + */ +u8 func1008_spawngroup1[] = { + // Wait until meeting done and player in the T-junction corridor + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_chr_in_room(CHR_P1P2, 0x00, 0x003f, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_morale(15) + + beginloop(0x5f) + // Keep doing this until explosives finished, or 15 guards spawned + if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x06) + if_morale_lt(1, /*goto*/ 0x06) + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_00C7, AILIST_SPAWNGROUP1_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + reloop(0x5f) + + // Spawned a guard + label(0x60) + yield + if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x06) + subtract_morale(1) + if_num_chrs_in_squadron_gt(3, SPAWNGROUP1, /*goto*/ 0x32) + reloop(0x5f) + + label(0x32) + restart_timer + + beginloop(0x08) + if_timer_gt(3600, /*goto*/ 0x32) + endloop(0x08) + + label(0x32) + endloop(0x5f) + + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_spawngroup1_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_squadron(SPAWNGROUP1) + run_to_pad(PAD_TRA_013E) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) + endlist +}; + +/** + * Spawns 12 guards while Jon is planing the explosives. Maximum 4 alive at any + * time. No delay between them; once one dies another is immediately spawned. + * Location is spawned guard is one of 2 places, 50% chance of each. Spawning + * stops when wall explodes. + */ +u8 func1013_spawngroup2[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_JON_PLANTING_EXPLOSIVES, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_morale(12) + + beginloop(0x5f) + if_morale_lt(1, /*goto*/ 0x06) + call_rng + if_rand_gt(128, /*goto*/ 0x32) + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0144, AILIST_SPAWNGROUP2_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + goto_next(0x06) + + label(0x32) + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0138, AILIST_SPAWNGROUP2_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + goto_next(0x06) + + label(0x60) + yield + if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x06) + subtract_morale(1) + rebuild_teams + rebuild_squadrons + label(0x08) + yield + if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x06) + if_num_chrs_in_squadron_gt(4, SPAWNGROUP2, /*goto*/ 0x32) + call_rng + if_rand_gt(5, /*goto*/ 0x32) + endloop(0x5f) + + label(0x32) + goto_first(0x08) + + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1013_spawngroup2_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_squadron(SPAWNGROUP2) + rebuild_teams + rebuild_squadrons +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * SA/PA only. Waits until medpack is started, then spawns up to 4 guards. + * + * The intended behavior is to spawn them all pretty much immediately with a + * random delay in between, then wait for them all to be dead, then complete the + * medpack. But two errors make make this not work as intended. + * + * The first error is that if any spawn fails (eg. due to the player looking at + * the pad) then the ailist jumps straight to the end where it waits for the + * group to be dead, and does not spawn any more guards. + * + * The second error is in the handler for if_all_chrs_in_squadron_are_dead. The + * implementation of this command has a bug which makes it only check if the + * most recently spawned guard is dead. If there are no chrs in the squadron + * (eg. if the first guard fails to spawn) then this check doesn't pass either. + * + * In other words: + * 1) killing the most recently spawned guard will cause the medpack to finish, + * 2) the spawning process stops if any spawn fails due to the player looking at + * the pad, and + * 3) at least one guard must spawn for an early medpack finish. + */ +u8 func1014_spawngroup3[] = { + if_difficulty_lt(DIFF_SA, /*goto*/ 0x32) + goto_next(0x04) + + // Agent - do nothing + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA and PA + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MEDPACK_STARTED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_morale(4) + + beginloop(0x5f) + if_morale_lt(1, /*goto*/ 0x06) + call_rng + if_rand_gt(128, /*goto*/ 0x32) + + // @bug: If either of these fail to spawn, the ailist jumps straight to + // the end rather than attempting to respawn them. + + // Spawn at top of ramp + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0117, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + goto_next(0x06) + + // Spawn in mine room + label(0x32) + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_013E, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + goto_next(0x06) + + // Spawned a guard + label(0x60) + yield + if_stage_flag_eq(STAGEFLAG_ELVIS_REVIVED, TRUE, /*goto*/ 0x06) + subtract_morale(1) + rebuild_teams + rebuild_squadrons + + // Wait for Elvis to be revived, or 5 in 256 chance of spawning another + // guard anyway. Note that the if_num_chrs_in_squadron_gt check can't + // pass because this squadron never has more than 4 chrs in it. + label(0x08) + yield + if_stage_flag_eq(STAGEFLAG_ELVIS_REVIVED, TRUE, /*goto*/ 0x06) + if_num_chrs_in_squadron_gt(6, SPAWNGROUP3, /*goto*/ 0x32) + call_rng + if_rand_gt(5, /*goto*/ 0x32) + endloop(0x5f) + + label(0x32) + goto_first(0x08) + + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + + beginloop(0x0d) + if_all_chrs_in_squadron_are_dead(SPAWNGROUP3, /*goto*/ 0x06) + endloop(0x0d) + + label(0x06) + set_stage_flag(STAGEFLAG_TRIGGER_MEDPACK_FINISH) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1014_spawngroup3_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_squadron(SPAWNGROUP3) + rebuild_teams + rebuild_squadrons +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) +#endif + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +/** + * Start spawning guards when the hangar X music starts. Stop spawning when 12 + * reached, or when both hangar doors are open. + */ +u8 func1015_spawngroup4[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + label(0x06) + set_morale(12) + + beginloop(0x5f) + call_rng + if_rand_gt(128, /*goto*/ 0x32) + + // @bug: This is spawning guards using the same function as the previous + // spawn group. This causes the guards to set their group to spawngroup3 + // which causes the if_num_chrs_in_squadron_gt check further below to + // never pass. + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0140, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + goto_next(0x06) + + label(0x32) + try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0117, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) + goto_next(0x06) + + label(0x60) + yield + if_stage_flag_eq(STAGEFLAG_BOTH_HANGAR_DOORS_OPEN, TRUE, /*goto*/ 0x06) + subtract_morale(1) + rebuild_teams + rebuild_squadrons + + label(0x08) + yield + if_morale_lt(1, /*goto*/ 0x06) + if_num_chrs_in_squadron_gt(6, SPAWNGROUP4, /*goto*/ 0x32) + call_rng + if_rand_gt(2, /*goto*/ 0x32) + endloop(0x5f) + + label(0x32) + goto_first(0x08) + + label(0x06) + yield + yield + yield + yield + yield + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func1015_spawngroup4_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) + label(0x06) + set_chr_team(CHR_SELF, TEAM_ENEMY) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) + set_squadron(SPAWNGROUP4) + rebuild_teams + rebuild_squadrons + run_to_pad(PAD_TRA_0168) + set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) + endlist +}; + +u8 func1009_blow_up_wall[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + restart_timer + + beginloop(0x08) + if_timer_gt(300, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + unset_object_flag(OBJ_WALLMINE, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_WALLMINE, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_WALLOBJECT, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_WALLDOOR, OBJFLAG_INVINCIBLE) + yield + yield + destroy_object(OBJ_WALLMINE) + set_stage_flag(STAGEFLAG_WALL_EXPLODED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_check_hangar_accessed[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x00e7, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + set_stage_flag(STAGEFLAG_ENTERED_HANGAR) + show_hudmsg(CHR_P1P2, L_TRA_031) // "The secret hangar has been located." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100b_check_jonathan_dead[] = { + if_difficulty_lt(DIFF_PA, /*goto*/ 0x32) + goto_next(0x04) + + // A and SA + label(0x32) + give_object_to_chr(OBJ_MEDPACK_BOND, CHR_BOND) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x32) + give_object_to_chr(OBJ_MEDPACK_COOP, CHR_COOP) + goto_next(0x04) + + label(0x32) + disable_object(OBJ_MEDPACK_COOP) + + // All difficulties + beginloop(0x04) + if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_STARTED_OUTRO, TRUE, /*goto*/ 0x32) + show_hudmsg(CHR_BOND, L_TRA_029) // "Jonathan has been killed." + set_stage_flag(STAGEFLAG_JON_DEAD) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_medpack_activation[] = { + beginloop(0x67) + if_stage_flag_eq(STAGEFLAG_ENTERED_HANGAR, TRUE, /*goto*/ 0x04) + endloop(0x67) + + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0c) + if_chr_activated_object(CHR_P1P2, OBJ_HOVERBED, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_AUTOSURGEON, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + set_stage_flag(STAGEFLAG_MEDPACK_STARTED) + show_hudmsg(CHR_P1P2, L_TRA_033) // "Alien medpack activated." +#if VERSION >= VERSION_NTSC_1_0 + assign_sound(SFX_814C, CHANNEL_7) +#else + assign_sound(SFX_043C, CHANNEL_7) +#endif + control_sound_from_object(CHANNEL_7, OBJ_HOVERBED, TRUE) + restart_timer + + beginloop(0x12) + if_timer_gt(120, /*goto*/ 0x32) + endloop(0x12) + + label(0x32) +#if VERSION >= VERSION_NTSC_1_0 + assign_sound(SFX_814D, CHANNEL_7) +#else + assign_sound(SFX_047C, CHANNEL_7) +#endif + control_sound_from_object(CHANNEL_7, OBJ_HOVERBED, TRUE) + restart_timer + + beginloop(0x08) + if_timer_gt(2000, /*goto*/ 0x09) + if_stage_flag_eq(STAGEFLAG_TRIGGER_MEDPACK_FINISH, TRUE, /*goto*/ 0x09) + endloop(0x08) + + label(0x09) + mute_channel(CHANNEL_7) +#if VERSION >= VERSION_NTSC_1_0 + assign_sound(SFX_814E, CHANNEL_7) +#else + assign_sound(SFX_043D, CHANNEL_7) +#endif + control_sound_from_object(CHANNEL_7, 0x00, TRUE) + show_hudmsg(CHR_P1P2, L_TRA_035) // "Alien medpack has been administered." + yield + + beginloop(0x0c) +#if VERSION >= VERSION_NTSC_1_0 + chr_toggle_p1p2(CHR_SELF) +#endif + if_chr_in_room(CHR_P1P2, 0x00, 0x00df, /*goto*/ 0x32) + endloop(0x0c) + + label(0x32) + if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x32) + if_chr_deadish(CHR_BOND, /*goto*/ 0x33) + goto_next(0x06) + + // Joanna is dead + label(0x33) + if_chr_deadish(CHR_COOP, /*goto*/ 0x32) + goto_next(0x06) + + // Everyone is alive + label(0x06) + set_ailist(CHR_JONATHAN, GAILIST_IDLE) + set_ailist(CHR_ELVIS, GAILIST_IDLE) + set_ailist(CHR_SELF, 0x0411) + + // Jonathan is dead + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0412_init_elvis[] = { + stop_chr +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_PUSHABLE) +#endif + set_stage_flag(STAGEFLAG_ELVIS_REVIVED) + label(0x0a) + label(0x06) + add_health_or_armor(200) + set_chr_maxdamage(CHR_SELF, 1) + set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040b_elvis_follow[] = { + set_target_chr(CHR_JONATHAN) + + label(0x5a) + restart_timer + + beginloop(0x5b) + // @bug: The pad and distance arguments are swapped here, so this is + // actually checking if Elvis is within 3510 units of pad 0x1e. This + // pad is up near the start of Infiltration so this will never pass. +#if VERSION >= VERSION_NTSC_1_0 + if_chr_distance_to_pad_lt(CHR_SELF, 3510, 30, /*goto*/ 0x08) +#else + if_chr_distance_to_pad_lt(CHR_SELF, 3510, 20, /*goto*/ 0x08) +#endif + if_can_see_target(/*goto*/ 0x06) + goto_next(0x5c) + + label(0x06) + if_distance_to_target_gt(200, /*goto*/ 0x5c) + endloop(0x5b) + + label(0x5c) + restart_timer + try_run_to_target(/*goto*/ 0x5d) + + label(0x5d) + restart_timer + yield + label(0x06) +#if VERSION >= VERSION_NTSC_1_0 + if_chr_distance_to_pad_lt(CHR_SELF, 300, PAD_TRA_015F, /*goto*/ 0x08) +#else + if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_TRA_015F, /*goto*/ 0x08) +#endif + label(0x32) + set_target_chr(CHR_JONATHAN) + if_distance_to_target_lt(200, /*goto*/ 0x5e) + if_timer_gt(120, /*goto*/ 0x5e) + if_chr_stopped(/*goto*/ 0x5e) + goto_first(0x5d) + + label(0x5e) + goto_first(0x5a) + + label(0x08) + stop_chr + + beginloop(0x09) + endloop(0x09) + + endlist +}; + +u8 func100f_terminals[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, OBJ_TERMINAL1, /*goto*/ 0x08) + if_chr_activated_object(CHR_P1P2, OBJ_TERMINAL2, /*goto*/ 0x0a) + reloop(0x04) + + // Terminal 1 + label(0x08) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_TERMINAL1, TRUE) + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x32) + show_hudmsg(CHR_P1P2, L_TRA_080) // "Console is not active." + goto_next(0x0f) + + // Terminal 1 active + label(0x32) + if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x0f) + show_hudmsg(CHR_P1P2, L_TRA_039) // "Inner hangar door is opening." + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, FALSE, /*goto*/ 0x32) + set_stage_flag(STAGEFLAG_INNER_DOOR_OPENING) + label(0x32) + open_door(0x2c) + open_door(0x2d) + set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) + reloop(0x04) + + // Terminal 2 + label(0x0a) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_TERMINAL2, TRUE) + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x32) + show_hudmsg(CHR_P1P2, L_TRA_080) // "Console is not active." + goto_next(0x0f) + + // Terminal 2 active + label(0x32) + if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x0f) + show_hudmsg(CHR_P1P2, L_TRA_037) // "Outer hangar door is opening." + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, FALSE, /*goto*/ 0x32) + set_stage_flag(STAGEFLAG_OUTER_DOOR_OPENING) + label(0x32) + open_door(0x2e) + open_door(0x2f) + set_object_flag(0x2e, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2f, OBJFLAG_DOOR_KEEPOPEN) + reloop(0x04) + + // Wait 2 seconds + label(0x0f) + restart_timer + + beginloop(0x10) + if_timer_gt(120, /*goto*/ 0x32) + endloop(0x10) + + label(0x32) + endloop(0x04) + + endlist +}; + +u8 func100d_check_terminals_destroyed[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x06) + if_object_in_good_condition(OBJ_TERMINAL1, /*goto*/ 0x06) + if_door_state(0x2c, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x06) + goto_next(0x08) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x06) + if_object_in_good_condition(OBJ_TERMINAL2, /*goto*/ 0x06) + if_door_state(0x2e, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x06) + goto_first(0x08) + + label(0x06) + endloop(0x04) + + label(0x08) + show_hudmsg(CHR_BOND, L_TRA_036) // "Mission critical object destroyed." + set_stage_flag(STAGEFLAG_HANGAR_TERMINAL_DESTROYED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_check_elvis_dead[] = { + beginloop(0x04) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + if_stage_flag_eq(STAGEFLAG_STARTED_OUTRO, TRUE, /*goto*/ 0x32) + set_stage_flag(STAGEFLAG_ELVIS_DEAD) + show_hudmsg(CHR_BOND, L_TRA_030) // "Elvis has been killed." + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_check_end_level[] = { + beginloop(0x04) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x32) + if_objective_complete(0, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) +#if VERSION < VERSION_NTSC_1_0 +#endif + if_objective_complete(1, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) +#if VERSION < VERSION_NTSC_1_0 +#endif + if_difficulty_lt(DIFF_SA, /*goto*/ 0x32) + if_objective_complete(3, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) +#if VERSION < VERSION_NTSC_1_0 +#endif + if_objective_complete(2, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) + if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, FALSE, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) +#if VERSION < VERSION_NTSC_1_0 +#endif + if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) + if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) + if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0f) + + if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x0f) + + if_chr_deadish(CHR_BOND, /*goto*/ 0x32) + goto_next(0x06) + + // Joanna is dead + label(0x32) + if_chr_deadish(CHR_COOP, /*goto*/ 0x33) + goto_next(0x06) + + // Both Joanna and Velvet are dead + label(0x33) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Mission complete + label(0x06) + if_stage_flag_eq(STAGEFLAG_JO_DOING_TERMINALS, FALSE, /*goto*/ 0x32) + set_ailist(CHR_SELF, AILIST_UFO_EXIT) + + label(0x32) + set_invincible(CHR_BOND) + set_ailist(CHR_SELF, AILIST_OUTRO) + + // Jonathan and/or Elvis are dead + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_unlock_doors_when_jo_escaping[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_JO_ESCAPE_STARTED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unlock_door(0x06, 0x40) + unlock_door(0x07, 0x40) + unlock_door(0x08, 0x04) + unlock_door(0x09, 0x04) + unlock_door(0x1d, 0x40) + unlock_door(0x1e, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1012_hoverbike_auto_doors[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_JO_ESCAPE_STARTED, TRUE, /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_0176, /*goto*/ 0x08) + if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_0158, /*goto*/ 0x09) + if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_00DB, /*goto*/ 0x0a) + if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_00A1, /*goto*/ 0x0c) + if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_009E, /*goto*/ 0x0d) + reloop(0x04) + + // Pad/door 1 + label(0x08) + if_door_state(0x0a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_object_flag(0x0a, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x0a) + reloop(0x04) + + // Pad/door 2 + label(0x09) + if_door_state(0x0b, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_object_flag(0x0b, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x0b) + reloop(0x04) + + // Pad/door 3 + label(0x0a) + if_door_state(0x08, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_object_flag(0x08, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x09, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x08) + open_door(0x09) + reloop(0x04) + + // Pad/door 4 + label(0x0c) + if_door_state(0x0c, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_object_flag(0x0c, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x0c) + reloop(0x04) + + // Pad/door 5 + label(0x0d) + if_door_state(0x05, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) + reloop(0x04) + + label(0x06) + set_object_flag(0x05, OBJFLAG_DOOR_KEEPOPEN) + open_door(0x05) + endloop(0x04) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040c_hidden_guardtype1[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1016_enable_guards_after_meetup[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + enable_chr(0x0d) + enable_chr(0x0e) + enable_chr(0x0f) + enable_chr(0x10) + enable_chr(0x11) + enable_chr(0x12) + enable_chr(0x13) + enable_chr(0x14) + enable_chr(0x15) + enable_chr(0x16) + unset_chr_chrflag(0x0d, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0d, CHRCFLAG_INVINCIBLE) + set_ailist(0x0d, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x0e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0e, CHRCFLAG_INVINCIBLE) + set_ailist(0x0e, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x0f, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x0f, CHRCFLAG_INVINCIBLE) + set_ailist(0x0f, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x10, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x10, CHRCFLAG_INVINCIBLE) + set_ailist(0x10, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x11, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x11, CHRCFLAG_INVINCIBLE) + set_ailist(0x11, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x12, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x12, CHRCFLAG_INVINCIBLE) + set_ailist(0x12, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x13, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x13, CHRCFLAG_INVINCIBLE) + set_ailist(0x13, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x14, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x14, CHRCFLAG_INVINCIBLE) + set_ailist(0x14, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x15, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x15, CHRCFLAG_INVINCIBLE) + set_ailist(0x15, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) + set_ailist(0x16, AILIST_INIT_SUPERDRAGON_GUARD) + rebuild_teams + rebuild_squadrons + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1017_check_both_hangar_doors_open[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) + if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + show_hudmsg(CHR_BOND, L_TRA_053) // "The hangar doors are now open." + set_stage_flag(STAGEFLAG_BOTH_HANGAR_DOORS_OPEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040d_hidden_guardtype2[] = { + set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1018_unhide_guards_when_jo_escaping[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_JO_ESCAPE_STARTED, TRUE, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) + set_ailist(0x16, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x17, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x17, CHRCFLAG_INVINCIBLE) + set_ailist(0x17, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x18, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x18, CHRCFLAG_INVINCIBLE) + set_ailist(0x18, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x19, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x19, CHRCFLAG_INVINCIBLE) + set_ailist(0x19, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x1a, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1a, CHRCFLAG_INVINCIBLE) + set_ailist(0x1a, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x1b, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1b, CHRCFLAG_INVINCIBLE) + set_ailist(0x1b, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x1c, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1c, CHRCFLAG_INVINCIBLE) + set_ailist(0x1c, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x1d, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1d, CHRCFLAG_INVINCIBLE) + set_ailist(0x1d, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x1e, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1e, CHRCFLAG_INVINCIBLE) + set_ailist(0x1e, AILIST_INIT_SUPERDRAGON_GUARD) + unset_chr_chrflag(0x1f, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x1f, CHRCFLAG_INVINCIBLE) + set_ailist(0x1f, AILIST_INIT_SUPERDRAGON_GUARD) + unlock_door(0x0c, 0x40) + unlock_door(0x15, 0x40) + unlock_door(0x16, 0x40) + unlock_door(0x17, 0x40) + unlock_door(0x18, 0x40) + unlock_door(0x19, 0x40) + unlock_door(0x1a, 0x40) + unlock_door(0x1b, 0x40) + unlock_door(0x1c, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func040e_hidden_biotech[] = { + label(0x04) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1019_enable_biotechs_after_stash[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_ELVIS_STASHED, TRUE, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + unset_chr_chrflag(0x25, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x25, CHRCFLAG_INVINCIBLE) + set_ailist(0x25, AILIST_INIT_BIOTECH) + unset_chr_chrflag(0x26, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x26, CHRCFLAG_INVINCIBLE) + set_ailist(0x26, AILIST_INIT_BIOTECH) + unset_chr_chrflag(0x27, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x27, CHRCFLAG_INVINCIBLE) + set_ailist(0x27, AILIST_INIT_BIOTECH) + unset_chr_chrflag(0x28, CHRCFLAG_HIDDEN) + unset_chr_chrflag(0x28, CHRCFLAG_INVINCIBLE) + set_ailist(0x28, AILIST_INIT_BIOTECH) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1002_intro[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_ESCAPE_INTRO) + camera_movement(ANIM_CUT_TRA_INTRO_CAM) + cmd0175(60) + + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + + set_chr_chrflag(0x23, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x23, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x23, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x23, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_INTRO_BIO1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x23, 4) + + set_chr_chrflag(0x24, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(0x24, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x24, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x24, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_INTRO_BIO2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x24, 4) + + set_object_flag2(OBJ_HOVERBED, OBJFLAG2_04000000) + set_object_flag3(OBJ_HOVERBED, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_INTRO_BED, OBJ_HOVERBED, 0x04, 0xffff) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 90) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0x68) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + label(0x06) + + wait_until(2, 0xc5) + speak(CHR_BOND, L_TRA_081, SFX_81BA, CHANNEL_7, COLOR_02_WHITE) // "What the hell do you think you're doing? This is s..." + + wait_until(60, 0x6a) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(115, 0x6b) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(156, 0x6c) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(205, 0x6d) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(260, 0x6e) + play_sound(SFX_0161, CHANNEL_5) + + wait_until(341, 0x6f) + play_sound(SFX_0162, CHANNEL_6) + open_door(0x0e) + open_door(0x0f) + + wait_until(444, 0x70) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(468, 0x71) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(490, 0x72) + play_sound(SFX_0164, CHANNEL_5) + + wait_until(528, 0x73) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(545, 0x8a) + speak(CHR_BOND, L_TRA_084, MP3_0758, CHANNEL_7, COLOR_09_BLUE) // "I don't care much for procedures!" + + wait_until(588, 0x74) + play_sound(SFX_0162, CHANNEL_5) + + wait_until(632, 0x75) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(698, 0x76) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(706, 0x77) + + wait_until(770, 0xc6) + speak(CHR_BOND, L_TRA_082, MP3_0436, CHANNEL_7, COLOR_02_WHITE) // "Director Easton will hear about this, young lady." + + wait_until(810, 0xbe) + close_door(0x0e) + close_door(0x0f) + + wait_until(830, 0x78) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(872, 0x79) + play_sound(SFX_0162, CHANNEL_4) + + wait_until(998, 0xc7) + speak(CHR_BOND, L_TRA_083, MP3_0437, CHANNEL_7, COLOR_02_WHITE) // "You can't take that! It's government property! Thi..." + + wait_until(1032, 0x7b) + play_sound(SFX_0161, CHANNEL_5) + + wait_until(1224, 0x7c) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(1260, 0x7d) + play_sound(SFX_0163, CHANNEL_4) + + wait_until(1286, 0x7e) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(1325, 0x7f) + play_sound(SFX_01B9, CHANNEL_6) + + wait_until(1334, 0x80) + play_sound(SFX_00FB, CHANNEL_10) + + wait_until(1342, 0x81) + play_sound(SFX_00FB, CHANNEL_10) + + wait_until(1353, 0x82) + play_sound(SFX_00F9, CHANNEL_10) + + wait_until(1362, 0x83) + + wait_until(1372, 0x84) + play_sound(SFX_00FA, CHANNEL_10) + + wait_until(1388, 0x85) + play_sound(SFX_01BA, CHANNEL_5) + + wait_until(1396, 0x86) + play_sound(SFX_00FC, CHANNEL_10) + + wait_until(1432, 0xbf) + open_door(0x10) + + wait_until(1510, 0x8f) + play_sound(SFX_0162, CHANNEL_4) + + wait_until(1544, 0x90) + play_sound(SFX_0163, CHANNEL_6) + + wait_until(1590, 0x91) + play_sound(SFX_0164, CHANNEL_4) + + wait_until(1624, 0x92) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(1662, 0x93) + play_sound(SFX_0162, CHANNEL_4) + + wait_until(1716, 0x94) + play_sound(SFX_01B9, CHANNEL_6) + + wait_until(1730, 0x95) + play_sound(SFX_00FE, CHANNEL_10) + play_sound(SFX_00FA, CHANNEL_10) + + wait_until(1736, 0x96) + speak(CHR_BOND, L_TRA_063, MP3_0438, CHANNEL_7, COLOR_02_WHITE) // "Let's see how that overconfident thief deals with ..." + set_stage_flag(STAGEFLAG_GAS_ON) + + wait_until(1773, 0x9a) + play_sound(SFX_01BB, CHANNEL_5) + + wait_until(1822, 0xc0) + close_door(0x10) + + wait_until(1826, 0x9f) + play_sound(SFX_00FD, CHANNEL_10) + + wait_until(1834, 0xa0) + play_sound(SFX_00FD, CHANNEL_10) + + wait_until(1850, 0xa1) + play_sound(SFX_00FA, CHANNEL_10) + + wait_until(1926, 0xa4) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(2146, 0xa5) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(2180, 0xa6) + play_sound(SFX_0507, CHANNEL_5) + + wait_until(2202, 0xa7) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(2218, 0xa8) + speak(CHR_BOND, L_TRA_064, MP3_0439, CHANNEL_7, COLOR_09_BLUE) // "What's that noise? Can't be... Gas!" + + wait_until(2271, 0xa9) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(2300, 0xaa) + play_sound(SFX_0163, CHANNEL_5) + + wait_until(2362, 0xab) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(2384, 0xac) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(2428, 0xad) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(2458, 0xae) + play_sound(SFX_0161, CHANNEL_6) + + wait_until(2582, 0xaf) + speak(CHR_BOND, L_TRA_065, MP3_043A, CHANNEL_7, COLOR_02_WHITE) // "Noooo, that wasn't meant to happen!" + + wait_until(2725, 0xb1) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2748, 0xb2) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2768, 0x97) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2810, 0x98) + play_sound(SFX_0429, CHANNEL_10) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2877, 0x99) + play_sound(SFX_0429, CHANNEL_10) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2904, 0xb3) + play_sound(SFX_0429, CHANNEL_10) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2924, 0xb5) + play_sound(SFX_0429, CHANNEL_10) + play_sound(SFX_0429, CHANNEL_10) + + wait_until(2930, 0xb4) + play_sound(SFX_COUGH_04AF, CHANNEL_10) + + wait_until(3024, 0x89) + play_sound(SFX_00FA, CHANNEL_10) + play_sound(SFX_00F9, CHANNEL_10) + + wait_until(3060, 0xb0) + play_sound(SFX_COUGH_04B0, CHANNEL_10) + + wait_until(3178, 0xb6) + play_sound(SFX_007D, CHANNEL_6) + + wait_until(3242, 0xb7) + play_sound(SFX_01DC, CHANNEL_6) + play_sound(SFX_00FC, CHANNEL_10) + + wait_until(3290, 0xb8) + play_sound(SFX_01DC, CHANNEL_6) + play_sound(SFX_00FD, CHANNEL_10) + + wait_until(3334, 0xb9) + play_sound(SFX_00FA, CHANNEL_10) + + wait_until(3894, 0xba) + speak(CHR_BOND, L_TRA_067, MP3_043B, CHANNEL_7, COLOR_09_BLUE) // "You idiot! We'd better get out of here." + + wait_until(4146, 0xbb) + play_sound(SFX_0162, CHANNEL_6) + + wait_until(4316, 0xbc) + play_sound(SFX_0164, CHANNEL_6) + + wait_until(4336, 0xbd) + play_sound(SFX_0163, CHANNEL_5) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x32) + goto_next(0x68) + + label(0x32) + if_controller_button_pressed(/*goto*/ 0x68) + label(0x32) + endloop(0x08) + + label(0x68) + set_stage_flag(STAGEFLAG_INTRO_DONE) + set_stage_flag(STAGEFLAG_GAS_ON) + mute_channel(CHANNEL_7) + mute_channel(CHANNEL_6) + mute_channel(CHANNEL_10) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + + unset_chr_chrflag(0x23, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(0x23, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_INTRO_BIO1, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x23, 2) + + unset_chr_chrflag(0x24, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(0x24, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_INTRO_BIO2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x24, 2) + + unset_object_flag2(OBJ_HOVERBED, OBJFLAG2_04000000) + set_object_flag3(OBJ_HOVERBED, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_INTRO_BED, OBJ_HOVERBED, 0x04, 0xfffe) + + drop_concealed_items(0x23) + drop_concealed_items(0x24) + stop_cutscene_track + stop_ambient_track + enter_firstperson + revoke_control(CHR_BOND, 0) + yield + grab_object(CHR_BOND, OBJ_HOVERBED) + grant_control(CHR_BOND) + yield + kill(0x23) + kill(0x24) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c01_midcutscene[] = { + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_ESCAPE_MIDCUTSCENE) + camera_movement(ANIM_CUT_TRA_MID_CAM) + cmd0175(60) + disable_object(OBJ_HOVERBED) +#if VERSION >= VERSION_NTSC_1_0 + set_target_chr(CHR_BOND) + if_chr_deadish(CHR_BOND, /*goto*/ 0x33) + goto_next(0x06) + + label(0x33) + if_chr_deadish(CHR_COOP, /*goto*/ 0x06) + set_target_chr(CHR_COOP) + + label(0x06) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) +#endif + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_JONATHAN, GAILIST_IDLE) + +#if VERSION >= VERSION_NTSC_1_0 + set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) +#else + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) +#endif + chr_do_animation(ANIM_CUT_TRA_MID_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, 4) + + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_MID_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) + + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_MID_JON, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 4) + + set_object_flag2(OBJ_HOVERBED_EMPTY, OBJFLAG2_04000000) + set_object_flag3(OBJ_HOVERBED_EMPTY, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_MID_BED, OBJ_HOVERBED_EMPTY, 0x04, 0xffff) + + show_nonessential_chrs(FALSE) + if_object_in_room(OBJ_HOVERBIKE, 0x00df, /*goto*/ 0x06) + goto_next(0x32) + + label(0x06) + move_object_to_pad(OBJ_HOVERBIKE, PAD_TRA_038A) + label(0x32) + restart_timer + set_cutscene_weapon(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, WEAPON_NONE, WEAPON_NONE) + + wait_until(83, 0x6a) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_069, MP3_043C, CHANNEL_7, COLOR_06_WHITE) // "***aahh...! aahaa...! aaaaahhh! aha. ahh.***" + + wait_until(116, 0x6b) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) + + wait_until(124, 0x6c) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_4) + + wait_until(142, 0x6d) + play_sound(SFX_FOOTSTEP_80C6, CHANNEL_6) + + wait_until(148, 0x6e) + play_sound(SFX_FOOTSTEP_80C7, CHANNEL_4) + + wait_until(172, 0x6f) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) + + wait_until(176, 0x70) + play_sound(SFX_FOOTSTEP_80C7, CHANNEL_4) + + wait_until(214, 0x71) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) + + wait_until(690, 0x72) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_070, MP3_043D, CHANNEL_7, COLOR_06_WHITE) // "I'm alive. I thought I'd be chopped up like the ot..." + + wait_until(1392, 0x73) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_071, MP3_043E, CHANNEL_7, COLOR_09_BLUE) // "You... You speak our language?" + + wait_until(1400, 0x74) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) + + wait_until(1554, 0x75) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_072, MP3_043F, CHANNEL_7, COLOR_03_RED) // "Watch her... she's sharp." + + wait_until(1688, 0x76) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_073, MP3_0440, CHANNEL_7, COLOR_06_WHITE) // "Earrggghh...eerggh..." + + wait_until(1962, 0x77) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_074, MP3_0441, CHANNEL_7, COLOR_09_BLUE) // "What's wrong?" + + wait_until(1988, 0x78) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) + + wait_until(2014, 0x79) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_4) + + wait_until(2113, 0x7a) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_075, MP3_0442, CHANNEL_7, COLOR_06_WHITE) // "I have a headache. And with a head this big, that'..." + + wait_until(2470, 0x7b) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_076, MP3_0443, CHANNEL_7, COLOR_09_BLUE) // "Can you walk? We must leave before they get organi..." + + wait_until(2480, 0x7c) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) + + wait_until(2526, 0x7d) + play_sound(SFX_FOOTSTEP_80C6, CHANNEL_6) + + wait_until(2624, 0x7e) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) + + wait_until(2642, 0x7f) + play_sound(SFX_FOOTSTEP_80C6, CHANNEL_4) + + wait_until(2678, 0x80) + play_sound(SFX_FOOTSTEP_80C7, CHANNEL_6) + + wait_until(2712, 0x81) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_4) + + wait_until(2726, 0x82) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) + + wait_until(2728, 0x83) + play_sound(SFX_FOOTSTEP_80C7, CHANNEL_7) + + wait_until(2806, 0x84) + play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) + + wait_until(2824, 0x85) + play_sound(SFX_FOOTSTEP_80C5, CHANNEL_4) + + wait_until(2842, 0x86) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_077, MP3_0444, CHANNEL_7, COLOR_06_WHITE) // "I think so. What's your name?" + + wait_until(3024, 0x87) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_078, MP3_0445, CHANNEL_7, COLOR_09_BLUE) // "I'm Agent Dark. Or Joanna, if you prefer." + + wait_until(3270, 0x88) + speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_079, MP3_0446, CHANNEL_7, COLOR_06_WHITE) // "Well, Joanna, I'm Protector One. But you can call ..." + + wait_until(3308, 0x89) + play_sound(SFX_FOOTSTEP_80C6, CHANNEL_6) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x32) + goto_next(0x68) + + label(0x32) + if_controller_button_pressed(/*goto*/ 0x68) + label(0x32) + endloop(0x08) + + label(0x68) + set_stage_flag(STAGEFLAG_INTRO_DONE) + mute_channel(CHANNEL_7) + stop_cutscene_track + stop_ambient_track + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_MID_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, 2) + + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_MID_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) + + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_MID_JON, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 2) + + unset_object_flag2(OBJ_HOVERBED_EMPTY, OBJFLAG2_04000000) + set_object_flag3(OBJ_HOVERBED_EMPTY, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_MID_BED, OBJ_HOVERBED_EMPTY, 0x04, 0xfffe) + + unset_object_flag2(0x0a, OBJFLAG2_AICANNOTUSE) + unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) + set_ailist(CHR_JONATHAN, AILIST_JONATHAN_HANGAR) + set_ailist(CHR_ELVIS, AILIST_INIT_ELVIS) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x32) + chr_move_to_pad(CHR_COOP, PAD_TRA_0156, 0x01, /*goto*/ 0x32) + label(0x32) + show_nonessential_chrs(TRUE) + set_ailist(CHR_SELF, GAILIST_END_CINEMA) + endlist +}; + +u8 func101b_gas_sound[] = { + beginloop(0x67) + if_stage_flag_eq(STAGEFLAG_GAS_ON, TRUE, /*goto*/ 0x04) + endloop(0x67) + + label(0x04) + yield + assign_sound(SFX_816A, CHANNEL_0) + play_sound_from_object(CHANNEL_0, 0x2b, 1, 8000, 3000) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0c02_outro[] = { + open_door(0x2c) + open_door(0x2e) + set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) + label(0x32) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_ESCAPE_OUTRO_LONG) + camera_movement(ANIM_CUT_TRA_OUTRO_CAM_01) + label(0x32) + disable_object(OBJ_UFO2) + + enable_object(OBJ_UFO1) + set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) + set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_01, OBJ_UFO1, 0x04, 0xffff) + + set_stage_flag(STAGEFLAG_STARTED_OUTRO) + remove_chr(CHR_ELVIS) + remove_chr(CHR_JONATHAN) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + show_nonessential_chrs(FALSE) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x32) + goto_next(0x68) + + label(0x32) + if_controller_button_pressed(/*goto*/ 0x68) + label(0x32) + endloop(0x08) + + label(0x68) + label(0x32) + camera_movement(ANIM_CUT_TRA_OUTRO_CAM_02) + + enable_object(OBJ_UFO1) + set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) + set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_02, OBJ_UFO1, 0x04, 0xffff) + + set_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(0x2b, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(0x2b, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2b, 4) + + open_door(0x2c) + open_door(0x2e) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x32) + goto_next(0x69) + + label(0x32) + if_controller_button_pressed(/*goto*/ 0x69) + label(0x32) + endloop(0x09) + + label(0x69) + label(0x06) + disable_object(OBJ_UFO2) + if_stage_flag_eq(STAGEFLAG_JO_DOING_TERMINALS, FALSE, /*goto*/ 0x32) + stop_cutscene_track + stop_ambient_track + + label(0x32) + goto_next(0x06) + + // Unreachable + label(0x09) + set_stage_flag(STAGEFLAG_UFO_LEAVING) + set_ailist(CHR_SELF, GAILIST_END_CINEMA) + + label(0x06) + set_stage_flag(STAGEFLAG_ESCAPED) + yield + yield + set_invincible(CHR_BOND) + revoke_control(CHR_BOND, 4) + hide_countdown_timer + stop_countdown_timer + unset_savefile_flag(GAMEFILEFLAG_DEFENSE_JON) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Makes the UFO exit, when Jo is doing terminals and has to escape via + * hoverbike. + */ +u8 func0415_ufo_exit[] = { + configure_environment(0x0000, AIENVCMD_PLAYUFOHUM, 5) + disable_object(OBJ_UFO2) + enable_object(OBJ_UFO1) + set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) + set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_01, OBJ_UFO1, 0x04, 0xffff) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) + set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNEXPLODABLE) + set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNEXPLODABLE) + set_stage_flag(STAGEFLAG_UFO_LEAVING) + restart_timer + + beginloop(0x08) + if_timer_gt(600, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + configure_environment(0x0000, AIENVCMD_STOPUFOHUM, 0) + stop_ambient_track + disable_object(OBJ_UFO1) + set_ailist(CHR_SELF, GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1021_jo_escaping[] = { + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_UFO_LEAVING, TRUE, /*goto*/ 0x32) + endloop(0x08) + + label(0x32) + set_stage_flag(STAGEFLAG_JO_ESCAPE_STARTED) + restart_timer + + beginloop(0x0f) + if_timer_gt(180, /*goto*/ 0x32) + endloop(0x0f) + + label(0x32) + set_stage_flag(STAGEFLAG_TRIGGER_JETBIKE_MESSAGE) + + beginloop(0x0a) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x0014, /*goto*/ 0x06) + endloop(0x0a) + + label(0x06) + set_stage_flag(STAGEFLAG_ESCAPED) + yield + yield + set_invincible(CHR_BOND) + revoke_control(CHR_BOND, 4) + hide_countdown_timer + stop_countdown_timer + label(0x62) + set_savefile_flag(GAMEFILEFLAG_DEFENSE_JON) + play_cutscene_track(MUSIC_ESCAPE_OUTRO_LONG) + camera_movement(ANIM_CUT_TRA_OUTRO_CAM_02) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) + set_ailist(CHR_P1P2, GAILIST_IDLE) + + enable_object(OBJ_UFO1) + set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) + set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_02, OBJ_UFO1, 0x04, 0xffff) + + set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) + unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) + set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_TRA_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) + + beginloop(0x09) + if_camera_animating(/*goto*/ 0x32) + goto_next(0x69) + + label(0x32) + if_controller_button_pressed(/*goto*/ 0x69) + label(0x32) + endloop(0x09) + + label(0x69) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Unreachable + end_level + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This is most likely a hidden guard. Spawns clones after meeting Jon until he + * enters the mine room. + * + * There are 4 of these guards, and each one will have one clone alive at a + * time. + */ +u8 func0416_spawn_during_follow[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_self_chrflag(CHRCFLAG_00040000) + set_self_chrflag(CHRCFLAG_CLONEABLE) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + + beginloop(0x04) + if_can_see_target(/*goto*/ 0x32) + if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) + label(0x32) + reloop(0x04) + + // Met Jon + label(0x06) + label(0x54) + if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x54) + reloop(0x04) + + label(0x54) + try_spawn_clone2(CHR_SELF, AILIST_INIT_FOLLOWER_CLONE, 0, /*goto*/ 0x32) + reloop(0x04) + + // Spawned + label(0x32) + restart_timer + + beginloop(0x08) + if_stage_flag_eq(STAGEFLAG_JON_ENTERED_MINE_ROOM, TRUE, /*goto*/ 0x32) + if_timer_gt(1800, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + endloop(0x04) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0417_init_follower_clone[] = { + set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) + label(0x04) + rebuild_teams + rebuild_squadrons + try_inherit_properties(0x09, /*goto*/ 0x06) + label(0x06) + set_ailist(CHR_SELF, AILIST_FOLLOWER_CLONE) + endlist +}; + +u8 func0418_follower_clone[] = { + call_rng + if_rand_lt(128, /*goto*/ 0x32) + set_target_chr(CHR_COOP) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x32) + goto_next(0x06) + + label(0x32) + set_target_chr(CHR_BOND) + label(0x06) + set_ailist(CHR_SELF, GAILIST_ALERTED) + endlist +}; + +u8 func0419_init_biotech[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(20) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(0) + set_recovery_speed(0) + set_shield(0) + set_returnlist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +u8 func041a_init_superdragon_guard[] = { + set_chr_dodge_rating(2, 10) + set_accuracy(10) + set_reaction_speed(40) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func101a_medpack_switch[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_object_in_good_condition(OBJ_MEDPACK_SWITCH, /*goto*/ 0x32) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + set_stage_flag(STAGEFLAG_MEDPACK_SWITCH_DESTROYED) + show_hudmsg(CHR_BOND, L_TRA_036) // "Mission critical object destroyed." + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x32) + if_chr_activated_object(CHR_P1P2, OBJ_MEDPACK_SWITCH, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + assign_sound(SFX_043A, CHANNEL_7) + control_sound_from_object(CHANNEL_7, OBJ_MEDPACK_SWITCH, TRUE) + show_hudmsg(CHR_P1P2, L_TRA_054) // "Medical containment doors unlocked." + unlock_door(0x12, 0x40) + unlock_door(0x13, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Warps Jon to the catwalk outside the mine room. + */ +u8 unregistered_function1[] = { + // Wait until met Jon + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x08) + endloop(0x04) + + // Wait until player in mine room + beginloop(0x08) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x00dc, /*goto*/ 0x32) + if_chr_in_room(CHR_P1P2, 0x00, 0x00dd, /*goto*/ 0x32) + endloop(0x08) + + label(0x32) + set_ailist(CHR_JONATHAN, 0x040f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * @unused + */ +u8 func040f_warp_jon_to_catwalk[] = { + set_target_chr(CHR_BOND) + if_can_see_target(/*goto*/ 0x06) + set_target_chr(CHR_COOP) + if_can_see_target(/*goto*/ 0x06) + stop_chr + yield + chr_move_to_pad(CHR_JONATHAN, PAD_TRA_0152, 0x00, /*goto*/ 0x32) + label(0x32) + yield + set_ailist(CHR_JONATHAN, AILIST_JONATHAN_FOLLOWING_AND_MINE) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101d_msg_medpackaroundhere[] = { + beginloop(0x04) + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x00d2, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + + beginloop(0x6a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x32) + endloop(0x6a) + + label(0x32) + speak(CHR_P1P2, L_TRA_055, MP3_03C0, CHANNEL_6, COLOR_09_BLUE) // "The medpack's got to be somewhere around here." + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101e_msg_hookup[] = { + restart_timer + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_JON_SAID_MAINT_HATCH, TRUE, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + + beginloop(0x6a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x32) + endloop(0x6a) + + label(0x32) + speak(CHR_BOND, L_TRA_056, MP3_03C1, CHANNEL_6, COLOR_09_BLUE) // "Time to hook up with Jonathan, before he gets into..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101f_msg_oil[] = { + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_JON_SAID_MAINT_HATCH, TRUE, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) + if_chr_in_room(CHR_P1P2, 0x00, 0x00dc, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + yield + yield + yield + + beginloop(0x6a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x32) + endloop(0x6a) + + label(0x32) + speak(CHR_P1P2, L_TRA_057, MP3_03C2, CHANNEL_6, COLOR_09_BLUE) // "That smell... oil... I smelt that in the other han..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1020_msg_jetbike[] = { + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_JETBIKE_MESSAGE, TRUE, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + + beginloop(0x6a) + if_sound_finished(CHANNEL_6, /*goto*/ 0x32) + endloop(0x6a) + + label(0x32) + speak(CHR_BOND, L_TRA_058, MP3_03C3, CHANNEL_6, COLOR_09_BLUE) // "The jetbike should get me out before they lock the..." + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1024_wall_immune_to_explosives[] = { + set_object_flag(OBJ_WALLOBJECT, OBJFLAG_INVINCIBLE) + set_object_flag(OBJ_WALLDOOR, OBJFLAG_INVINCIBLE) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x32) + endloop(0x04) + + label(0x32) + unset_object_flag(OBJ_WALLOBJECT, OBJFLAG_INVINCIBLE) + unset_object_flag(OBJ_WALLDOOR, OBJFLAG_INVINCIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * Wait until barrel destroyed then unset immune to explosives on the medpack + * glass. This wouldn't have worked as intended, as destroying any one barrel + * would cause the glass to become suscepitble to explosives. + */ +#define glass_explosives_thing(barrel) \ + beginloop(0x04) \ + if_object_in_good_condition(barrel, /*goto*/ 0x32) \ + unset_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) \ + restart_timer \ + \ + beginloop(0x08) \ + if_timer_gt(60, /*goto*/ 0x06) \ + endloop(0x08) \ + \ + label(0x06) \ + set_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) \ + set_ailist(CHR_SELF, GAILIST_IDLE) \ + label(0x32) \ + endloop(0x04) \ + \ + set_ailist(CHR_SELF, GAILIST_IDLE) + +u8 unregistered_function2[] = { + set_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) + glass_explosives_thing(0x23) + endlist +}; + +u8 unregistered_function3[] = { + glass_explosives_thing(0x24) + endlist +}; + +u8 unregistered_function4[] = { + glass_explosives_thing(0x25) + endlist +}; + +u8 unregistered_function5[] = { + glass_explosives_thing(0x26) + endlist +}; + +u8 unregistered_function6[] = { + glass_explosives_thing(0x27) + endlist +}; + +u8 unregistered_function7[] = { + glass_explosives_thing(0x28) + endlist +}; + +u8 unregistered_function8[] = { + glass_explosives_thing(0x29) + endlist +}; + +u8 func1026_ufo_spinning[] = { + enable_object(OBJ_UFO2) + set_object_flag2(OBJ_UFO2, OBJFLAG2_04000000) + set_object_flag3(OBJ_UFO2, OBJFLAG3_00000010) + + label(0x03) + object_do_animation(ANIM_0459, OBJ_UFO2, 0x04, 0xffff) + restart_timer + + beginloop(0x08) + if_timer_gt(184, /*goto*/ 0x32) + endloop(0x08) + + label(0x32) + goto_first(0x03) + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102e_keep_hangar_doors_open[] = { + beginloop(0x67) + if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x0f) + if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x04) + endloop(0x67) + + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x0f) + if_door_state(0x2c, DOORSTATE_CLOSING, /*goto*/ 0x08) + if_door_state(0x2e, DOORSTATE_CLOSING, /*goto*/ 0x09) + reloop(0x04) + + // Door 1 closing + label(0x08) + if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x32) + if_door_state(0x2c, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x09) + reloop(0x04) + + label(0x32) + open_door(0x2c) + open_door(0x2d) + set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) + reloop(0x04) + + // Door 2 closing + label(0x09) + if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x32) + reloop(0x04) + + label(0x32) + open_door(0x2e) + open_door(0x2f) + set_object_flag(0x2e, OBJFLAG_DOOR_KEEPOPEN) + set_object_flag(0x2f, OBJFLAG_DOOR_KEEPOPEN) + endloop(0x04) + + // Terminal destroyed + label(0x0f) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func102f_toggle_remotemines[] = { + restart_timer + beginloop(0x08) + if_timer_gt(2400, /*goto*/ 0x32) + if_stage_flag_eq(STAGEFLAG_ELVIS_STASHED, TRUE, /*goto*/ 0x06) + endloop(0x08) + + label(0x32) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x06) + unset_object_flag(OBJ_REMOTEMINES, OBJFLAG_UNCOLLECTABLE) + unset_object_flag2(OBJ_REMOTEMINES, OBJFLAG2_INVISIBLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1030_setup_medpack_glass[] = { + if_difficulty_gt(DIFF_A, /*goto*/ 0x32) + unset_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) + destroy_object(OBJ_MEDPACK_GLASS) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // SA and PA + label(0x32) + unlock_door(0x3c, 0x40) + unlock_door(0x3d, 0x40) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1031_disable_chambers[] = { + set_object_flag(0x46, OBJFLAG_DEACTIVATED) + set_object_flag(0x47, OBJFLAG_DEACTIVATED) + set_object_flag(0x48, OBJFLAG_DEACTIVATED) + set_object_flag(0x49, OBJFLAG_DEACTIVATED) + set_object_flag(0x4a, OBJFLAG_DEACTIVATED) + set_object_flag(0x4b, OBJFLAG_DEACTIVATED) + set_object_flag(0x4c, OBJFLAG_DEACTIVATED) + set_object_flag(0x4d, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1032_unlock_door_after_hangar[] = { + // Wait for locate hangar objective complete + beginloop(0x04) + if_objective_complete(2, /*goto*/ 0x06) + endloop(0x04) + + label(0x06) + unlock_door(0x0a, 0x02) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +/** + * This is the lift near the wall you blow up in Rescue. + */ +u8 func1433_start_lift[] = { + activate_lift(1, 0x4e) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func101c_setup_rtracker[] = { + yield + set_object_flag3(OBJ_FALCON2SCOPE1, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_FALCON2SCOPE2, OBJFLAG3_RTRACKED_BLUE) + set_object_flag3(OBJ_REMOTEMINES, OBJFLAG3_RTRACKED_BLUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1434_setup_environment[] = { + yield + configure_environment(0x0000, AIENVCMD_00, FALSE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x00d3, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d6, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d8, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00d9, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00da, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00db, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0079, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0080, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0090, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0091, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0092, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0093, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0094, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0095, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0096, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0097, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0098, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0099, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x009a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x009b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00aa, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ab, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ac, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ad, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ae, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00af, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00b9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ba, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00be, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00bf, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c7, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c8, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00c9, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ca, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ce, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cf, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00d0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00d1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00d2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00dc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00dd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00de, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00df, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e0, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e1, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e3, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e4, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e5, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00e6, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00f2, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fa, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fc, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fd, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00fe, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00ff, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0100, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0101, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0102, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0103, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0104, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0105, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0106, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0107, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0108, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0109, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010b, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010c, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010d, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x010e, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00cb, AIENVCMD_ROOM_SETAMBIENT, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +struct ailist ailists[] = { + { func1400_setup_counterop, 0x1400 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_intro, 0x1002 }, + { func1004_jon_msgs_gravedanger, 0x1004 }, + { func1005_jon_msgs_meetup, 0x1005 }, + { func1007_check_medpack_collected, 0x1007 }, + { func1008_spawngroup1, 0x1008 }, + { func1009_blow_up_wall, 0x1009 }, + { func100a_check_hangar_accessed, 0x100a }, + { func100b_check_jonathan_dead, 0x100b }, + { func100c_medpack_activation, 0x100c }, + { func100d_check_terminals_destroyed, 0x100d }, + { func100e_check_elvis_dead, 0x100e }, + { func100f_terminals, 0x100f }, + { func1010_check_end_level, 0x1010 }, + { func1011_unlock_doors_when_jo_escaping, 0x1011 }, + { func1012_hoverbike_auto_doors, 0x1012 }, + { func1013_spawngroup2, 0x1013 }, + { func1014_spawngroup3, 0x1014 }, + { func1015_spawngroup4, 0x1015 }, + { func1016_enable_guards_after_meetup, 0x1016 }, + { func1017_check_both_hangar_doors_open, 0x1017 }, + { func1018_unhide_guards_when_jo_escaping, 0x1018 }, + { func1019_enable_biotechs_after_stash, 0x1019 }, + { func101a_medpack_switch, 0x101a }, + { func101b_gas_sound, 0x101b }, + { func101c_setup_rtracker, 0x101c }, + { func101d_msg_medpackaroundhere, 0x101d }, + { func101e_msg_hookup, 0x101e }, + { func101f_msg_oil, 0x101f }, + { func1020_msg_jetbike, 0x1020 }, + { func1021_jo_escaping, 0x1021 }, + { func1022_gas_damage_bond, 0x1022 }, + { func1023_gas_damage_coop, 0x1023 }, + { func1024_wall_immune_to_explosives, 0x1024 }, + { func1026_ufo_spinning, 0x1026 }, + { func102e_keep_hangar_doors_open, 0x102e }, + { func102f_toggle_remotemines, 0x102f }, + { func1030_setup_medpack_glass, 0x1030 }, + { func1031_disable_chambers, 0x1031 }, + { func1032_unlock_door_after_hangar, 0x1032 }, + { func1433_start_lift, 0x1433 }, + { func1434_setup_environment, 0x1434 }, + { func1002_intro, 0x0c00 }, + { func0c01_midcutscene, 0x0c01 }, + { func0c02_outro, 0x0c02 }, + { func0401_gas_damage, 0x0401 }, + { func0402_jonathan_waiting_for_meetup, 0x0402 }, + { func0403_init_jonathan, 0x0403 }, + { func0404_jonathan_following_and_mine, 0x0404 }, + { func0405_jonathan_shot_while_planting, 0x0405 }, + { func0406_unused_0406, 0x0406 }, + { func1008_spawngroup1_guard, 0x0407 }, + { func1013_spawngroup2_guard, 0x0408 }, + { func1014_spawngroup3_guard, 0x0409 }, + { func1015_spawngroup4_guard, 0x040a }, + { func040b_elvis_follow, 0x040b }, + { func040c_hidden_guardtype1, 0x040c }, + { func0413_jonathan_hangar, 0x0413 }, + { func040d_hidden_guardtype2, 0x040d }, + { func040e_hidden_biotech, 0x040e }, + { func040f_warp_jon_to_catwalk, 0x040f }, + { func1002_intro, 0x0410 }, + { func0c01_midcutscene, 0x0411 }, + { func0412_init_elvis, 0x0412 }, + { func0c02_outro, 0x0414 }, + { func0415_ufo_exit, 0x0415 }, + { func0416_spawn_during_follow, 0x0416 }, + { func0417_init_follower_clone, 0x0417 }, + { func0418_follower_clone, 0x0418 }, + { func0419_init_biotech, 0x0419 }, + { func041a_init_superdragon_guard, 0x041a }, + { func041b_jonathan_after_terminals, 0x041b }, + { func041c_elvis_go_to_ufo, 0x041c }, + { NULL, 0 }, +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; diff --git a/src/ailists/setupuff.c b/src/ailists/setupuff.c new file mode 100644 index 000000000..843b097b5 --- /dev/null +++ b/src/ailists/setupuff.c @@ -0,0 +1,39 @@ +// +// Stage ID 0x4d +// + +#include "stagesetup.h" + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + endprops +}; + +s32 intro[] = { + outfit(OUTFIT_DEFAULT) + endintro +}; + +struct path paths[] = { + { NULL, 0, 0 }, +}; + +struct ailist ailists[] = { + { NULL, 0 }, +}; + diff --git a/src/ailists/setupwax.c b/src/ailists/setupwax.c new file mode 100644 index 000000000..11c5cc809 --- /dev/null +++ b/src/ailists/setupwax.c @@ -0,0 +1,2248 @@ +// +// Mr. Blonde's Revenge +// + +#include "stagesetup.h" + +// Characters +#define CHR_CHIEF 0x21 +#define CHR_CASS 0x22 + +// Objects +#define OBJ_LIGHTSWITCH 0x14 +#define OBJ_CHIEF_LIFT 0x4e +#define OBJ_BLONDE_LIFT 0x4f +#define OBJ_SHUTTLE1 0x51 +#define OBJ_BOND_BOMB 0x52 +#define OBJ_COOP_BOMB 0x53 +#define OBJ_PLANTED_BOMB 0x54 +#define OBJ_LOBBYDOOR_LEFT 0x5f +#define OBJ_LOBBYDOOR_RIGHT 0x60 +#define OBJ_SHUTTLE2 0x63 + +// Stage flags +#define STAGEFLAG_LIGHTS_OFF 0x00000100 +#define STAGEFLAG_CASS_DEAD 0x00000200 +#define STAGEFLAG_CASS_CAPTURED 0x00000400 +#define STAGEFLAG_CHIEF_DEAD 0x00000800 +#define STAGEFLAG_BOMB_PLANTED 0x00001000 +#define STAGEFLAG_BOMB_EXPIRED 0x00002000 +#define STAGEFLAG_BOMB_UNPLANTABLE 0x00004000 +#define STAGEFLAG_TRIGGER_YWSM 0x00008000 +#define STAGEFLAG_CASS_SAID_YWSM 0x00010000 // "You won't shoot me" + +// AI Lists +#define AILIST_INIT_HOVERCAR 0x0401 +#define AILIST_INIT_60HP_GUARD 0x040e +#define AILIST_INIT_40HP_GUARD 0x040f +#define AILIST_INIT_SEARCHING_GUARD 0x0410 +#define AILIST_CASS_IN_OFFICE 0x0411 +#define AILIST_INIT_CASS 0x0412 +#define AILIST_CASS_RUNNING 0x0413 +#define AILIST_INIT_CHIEF 0x0414 +#define AILIST_CHIEF 0x0415 +#define AILIST_OUTRO 0x0417 + +extern s32 intro[]; +extern u32 props[]; +extern struct path paths[]; +extern struct ailist ailists[]; + +struct stagesetup setup = { + NULL, + NULL, + NULL, + intro, + props, + paths, + ailists, + NULL, +}; + +u32 props[] = { + briefing(BRIEFINGTYPE_LOCATION, L_WAX_001) + briefing(BRIEFINGTYPE_TEXT_PA, L_WAX_000) + briefing(BRIEFINGTYPE_TEXT_SA, L_WAX_002) + briefing(BRIEFINGTYPE_TEXT_A, L_WAX_003) + + beginobjective(0, L_WAX_005, (DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Plant explosive device in lab lift" + complete_flags(STAGEFLAG_BOMB_PLANTED) + fail_flags(STAGEFLAG_BOMB_EXPIRED) + fail_flags(STAGEFLAG_BOMB_UNPLANTABLE) + endobjective + + beginobjective(1, L_WAX_006, (DIFFBIT_PA | DIFFBIT_PD)) // "Eliminate dataDyne Captain" + complete_flags(STAGEFLAG_CHIEF_DEAD) + endobjective + + beginobjective(2, L_WAX_004, (DIFFBIT_A | DIFFBIT_SA | DIFFBIT_PA | DIFFBIT_PD)) // "Locate and escort Cassandra to helipad" + complete_flags(STAGEFLAG_CASS_CAPTURED) + fail_flags(STAGEFLAG_CASS_DEAD) + endobjective + + tag(0x3d, 1) + fan(0x0100, MODEL_DD_FANROOF, PAD_WAX_0095, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_WAX_0096, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_WAX_0097, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANROOF, PAD_WAX_0098, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000444, 0x00000002, 0x01000000) + fan(0x0100, MODEL_DD_FANWALL, PAD_WAX_0099, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000, 0x00000222, 0x00000002, 0x01000000) + tag(0x2e, 1) + door(0x0100, MODEL_DOOR4A_G5, PAD_WAX_022B, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00001200) + door(0x0100, MODEL_DOOR4B_G5, PAD_WAX_022C, OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_LOCKEDBACK, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x2f, -1) + door(0x0100, MODEL_DD_DECODOOR, PAD_WAX_0226, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_DECODOOR, PAD_WAX_0227, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(OBJ_LOBBYDOOR_LEFT, 1) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_0229, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_022A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(OBJ_LOBBYDOOR_RIGHT, -1) + tag(0x61, 1) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_0229, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, OBJFLAG3_AUTOCUTSCENESOUNDS, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_022A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x62, -1) + tag(0x33, 1) + door(0x0100, MODEL_DD_SECRETDOOR, PAD_WAX_0228, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_AUTOMATIC | DOORFLAG_LONGRANGE, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SECRETDOOR, PAD_WAX_00BC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_AUTOMATIC | DOORFLAG_LONGRANGE, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A0, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDFRONT, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000004, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00B2, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00B3, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A8, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00A9, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AA, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AC, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AD, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AE, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00B1, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0xffffffff, 0x00000000) + tag(0x0e, 2) + tag(0x0f, 2) +#if VERSION >= VERSION_NTSC_1_0 + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AF, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00B0, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) +#else + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00AF, OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000001, 0x00000800) + door(0x0100, MODEL_DD_OFFICEDOOR, PAD_WAX_00B0, OBJFLAG_DEACTIVATED | OBJFLAG_20000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x00640000, 0x00640000, 0x00010000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0xffffffff, 0x00000000) +#endif + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_WAX_00B4, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_WAX_00B5, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_WAX_00B6, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004, DOORTYPE_SLIDING, 0x00000020, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_WAX_00B7, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000000, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + tag(0x40, 1) + door(0x0100, MODEL_DD_SERVICEDOOR, PAD_WAX_00BB, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_DEACTIVATED, OBJFLAG2_LOCKEDBACK | OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000f333, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, DOORFLAG_0004 | DOORFLAG_FLIP, DOORTYPE_SLIDING, 0x00000002, 0x00000384, 0x00000000, 0x00000000, 0x00000800) + door(0x0100, MODEL_DD_WINDDOOR, PAD_WAX_00B8, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_WINDDOOR, PAD_WAX_00B9, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_20000000 | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + door(0x0100, MODEL_DD_WINDDOOR, PAD_WAX_00BA, OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED | OBJFLAG_80000000, 0, 0, 1000, 0x005a0000, 0x03e80000, 0x012c0000, 0x012c0000, 0x00030000, 0, DOORTYPE_SWINGING, 0x00000000, 0x000005dc, 0x00000000, 0x00000000, 0x00000b00) + tag(0x57, 8) + tag(0x58, 8) + tag(0x59, 8) + tag(0x5a, 8) + tag(0x55, 3) + tag(0x50, 3) + tag(OBJ_CHIEF_LIFT, 1) +#if VERSION >= VERSION_NTSC_1_0 + lift(0x0100, MODEL_DD_LIFTR, PAD_WAX_0256, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0256, 0x012e, 0x12f, -1, 0x00000001, 0x00000003, 0x00000002, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_0224, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#else + lift(0x0100, MODEL_DD_LIFTR, PAD_WAX_0256, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x0256, 0x012e, 0x12f, 0x012e, 0x00000001, 0x00000003, 0x00000002, 0x00000003, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_0224, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009C, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009B, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009A, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) +#endif + lift_door(-4, -5, 0) + lift_door(-4, -6, 2) + lift_door(-4, -7, 1) + tag(0x5b, 7) + tag(0x5c, 7) + tag(0x5d, 7) + tag(0x5e, 7) + tag(0x56, 2) + tag(OBJ_BLONDE_LIFT, 1) +#if VERSION >= VERSION_NTSC_1_0 + lift(0x0100, MODEL_DD_LIFTR, PAD_WAX_012D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012d, 0x0255, -1, -1, 0x00000001, 0x00000004, 0x00000000, 0x00000000, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_0225, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00001c00) +#else + lift(0x0100, MODEL_DD_LIFTR, PAD_WAX_012D, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000, 0x012d, 0x0255, 0x012d, 0x0255, 0x00000001, 0x00000004, 0x00000001, 0x00000004, 0x0000071c, 0x0010aaaa, 0x16000000) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009D, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009E, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_009F, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_AICANNOTUSE, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000040, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) + door(0x0100, MODEL_DD_LIFTDOOR, PAD_WAX_0225, OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, 0, 0, 1000, 0x0000e666, 0x00010000, 0x00007fff, 0x00014000, 0x00000666, 0, DOORTYPE_SLIDING, 0x00000000, 0x000001e0, 0x00000000, 0x00000000, 0x00000100) +#endif + lift_door(-4, -5, 0) + lift_door(-2, -6, 1) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00BD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00BE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00BF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C0, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C1, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C2, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C3, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C4, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C5, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C6, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C7, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00C8, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00CA, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00CB, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00CC, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00CD, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00CE, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_00CF, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_0235, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_0236, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_0237, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_0238, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_0239, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0200, MODEL_DD_PLANTSPIKE, PAD_WAX_023A, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_AISEETHROUGH, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_SHOOTTHROUGH, OBJFLAG3_PUSHABLE, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_011B, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_011C, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00DF, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E0, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E1, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E2, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E3, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E4, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E5, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E6, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E7, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0123, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0124, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0125, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0126, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0127, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0128, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0129, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_012A, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E8, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00E9, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00EA, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00EB, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00EC, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00ED, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00EE, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00EF, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F0, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F1, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F2, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F3, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F4, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F5, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F6, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F7, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F8, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00F9, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00FA, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00FB, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00FC, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00FD, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00FE, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_00FF, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0100, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0101, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0102, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0103, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0104, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0105, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0106, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0107, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0108, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0109, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_010A, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_010B, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_010C, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_010D, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_010E, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_010F, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0110, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0111, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0112, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0113, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0114, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0117, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0118, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0119, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_011A, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0248, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0249, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_024A, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_024B, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_024C, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_024D, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_024E, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_024F, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0250, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW_FOYER, PAD_WAX_0251, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + glass(0x0100, MODEL_DD_WINDOW_FOYER, PAD_WAX_0252, OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_WAX_00D3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_WAX_00D4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00D5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00D2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x37, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00D7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00D8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x38, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00D9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_WAX_00D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_00DA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_WAX_0253, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_0254, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + tag(0x3b, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01A4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01A3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01A2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x3c, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01A5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01A6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01A7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x3a, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01A8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01A9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01AA, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x39, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01AB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01AC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01AD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01B0, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01AF, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01AE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01B1, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x0d, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH2, PAD_WAX_013E, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01B3, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01B4, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01B5, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01B2, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x0c, 1) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01B6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOANTI, 0, 1000) + stdobject(0x0100, MODEL_DD_REDSOFA, PAD_WAX_00DB, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(0x36, 1) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_01B7, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_01B8, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_01B9, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + tag(0x35, 1) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00DC, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_REDARM, PAD_WAX_00DD, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_00000100 | OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_022D, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_022E, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_DD_CHAIR, PAD_WAX_0232, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_0231, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, 0, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_0230, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_0233, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_0234, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + chr(SPAWNFLAG_00000200, 0x01, PAD_WAX_01E9, BODY_FEM_GUARD, HEAD_RANDOM, 0x040b, -1, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0001, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x14, PAD_WAX_020F, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0014, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x15, PAD_WAX_020E, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0015, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x16, PAD_WAX_0210, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0016, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x02, PAD_WAX_01EB, BODY_FEM_GUARD, HEAD_RANDOM, 0x040c, -1, -1, 1000, 100, CHRFLAG0_CANT_ALERT_GROUP | CHRFLAG0_CAN_BACKOFF | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0002, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + chr(SPAWNFLAG_00000200, 0x0f, PAD_WAX_021E, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + weapon(0x0100, MODEL_CHRCMP150, 0x000f, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_CMP150) + link_guns(-1, -2) + + chr(SPAWNFLAG_00000200, 0x10, PAD_WAX_021F, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0010, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x11, PAD_WAX_0220, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0011, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x13, PAD_WAX_0222, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, -1, -1, 500, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_02, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0013, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x0e, PAD_WAX_01FE, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_SEARCHING_GUARD, 0x0218, -1, 1000, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x000e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x12, PAD_WAX_01FC, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_SEARCHING_GUARD, 0x0218, -1, 1000, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_SEARCHSAMEROOM, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0012, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x03, PAD_WAX_021C, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, 0x0218, -1, 1000, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0003, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x04, PAD_WAX_021D, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_40HP_GUARD, 0x0218, -1, 1000, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_ACTIVATEALARM | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRCMP150, 0x0004, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_CMP150) + + chr(SPAWNFLAG_00000200, 0x00, PAD_WAX_007D, BODY_FEM_GUARD, HEAD_RANDOM, 0x0402, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_HOLD_POSITION | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0000, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200, 0x0b, PAD_WAX_008E, BODY_FEM_GUARD, HEAD_RANDOM, 0x0403, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x000b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200, 0x09, PAD_WAX_0081, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 100, 100, CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_04, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0009, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1e, PAD_WAX_01CE, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_05, 0x39, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001e, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1f, PAD_WAX_01CF, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_05, 0x3a, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001f, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x20, PAD_WAX_01D0, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_05, 0x3b, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0020, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200, 0x07, PAD_WAX_0058, BODY_FEM_GUARD, HEAD_RANDOM, 0x0404, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0007, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200, 0x0a, PAD_WAX_0057, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_CAN_HEAR_ALARMS | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x000a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200, 0x0c, PAD_WAX_0060, BODY_FEM_GUARD, HEAD_RANDOM, 0x0405, -1, -1, 100, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_STOPTRACKINGIFLOOKEDAT, TEAM_ENEMY, SQUADRON_06, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x000c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x18, PAD_WAX_01C7, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_07, 0x35, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0018, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x19, PAD_WAX_01C8, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_07, 0x36, 0, 0, 2, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x0019, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x1a, PAD_WAX_01C9, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_07, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001a, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1b, PAD_WAX_01CA, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_08, 0x37, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001b, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_FIXEDHEIGHT, 0x1c, PAD_WAX_01CB, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_08, 0x38, 0, 0, 3, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001c, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x1d, PAD_WAX_01CC, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_60HP_GUARD, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_ALERT_ON_HEARSPAWN | CHRFLAG0_CAN_HEARSPAWN | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_08, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRSHOTGUN, 0x001d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_SHOTGUN) + + chr(SPAWNFLAG_00000200, 0x08, PAD_WAX_0028, BODY_DDSHOCK, HEAD_DDSHOCK, 0x0408, -1, -1, 500, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_CAN_RETREAT | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, 0, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0008, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + + chr(SPAWNFLAG_00000200, 0x0d, PAD_WAX_006F, BODY_DDSHOCK, HEAD_DDSHOCK, 0x0409, -1, -1, 100, 100, CHRFLAG0_CHUCKNORRIS | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_THROWGRENADEFIRST, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x000d, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + + chr(SPAWNFLAG_00000200 | SPAWNFLAG_FIXEDHEIGHT, 0x17, PAD_WAX_01C6, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_40HP_GUARD, -1, -1, 2000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR, CHRFLAG1_DOINGIDLEANIMATION | CHRFLAG1_THROWGRENADEFIRST, TEAM_ENEMY, SQUADRON_09, -1, 0, 0, 1, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0017, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + + chr(SPAWNFLAG_00000200, 0x06, PAD_WAX_0011, BODY_DDSHOCK, HEAD_DDSHOCK, 0x0407, 0x001d, -1, 1000, 9, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_NOHEAR, CHRFLAG1_ADJUSTPUNCHSPEED | CHRFLAG1_THROWGRENADEFIRST | CHRFLAG1_LONG_CAMSPY_OBSERVATION, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0006, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + + chr(SPAWNFLAG_00000200, 0x05, PAD_WAX_01C0, BODY_DDSHOCK, HEAD_DDSHOCK, AILIST_INIT_40HP_GUARD, 0x001e, -1, 1000, 100, CHRFLAG0_CAN_EXAMINE_BODY | CHRFLAG0_CHUCKNORRIS | CHRFLAG0_CAN_RETREAT | CHRFLAG0_SURPRISABLE | CHRFLAG0_CAN_THROW_GRENADES | CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CAN_FLEESURRENDER | CHRFLAG0_COVER_TYPE2 | CHRFLAG0_NOHEAR, CHRFLAG1_THROWGRENADEFIRST, TEAM_ENEMY, SQUADRON_01, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRDY357, 0x0005, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_DY357MAGNUM) + + chr(SPAWNFLAG_ANTINONINTERACTABLE | SPAWNFLAG_BLUESIGHT, CHR_CASS, PAD_WAX_0133, BODY_CASSANDRA, HEAD_CASSANDRA, AILIST_INIT_CASS, -1, -1, 1000, 100, CHRFLAG0_SURPRISABLE | CHRFLAG0_FORCESAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_CANLOSEGUN, 0, TEAM_ENEMY, SQUADRON_03, -1, 0, 0, 0, 0, 0) + chr(SPAWNFLAG_FIXEDHEIGHT, CHR_CHIEF, PAD_WAX_0223, BODY_FEM_GUARD, HEAD_RANDOM, AILIST_INIT_CHIEF, -1, -1, 1000, 100, CHRFLAG0_SKIPSAFETYCHECKS | CHRFLAG0_00008000 | CHRFLAG0_SQUADALERTANYDIST | CHRFLAG0_NOHEAR | CHRFLAG0_CANLOSEGUN, CHRFLAG1_DOINGIDLEANIMATION, TEAM_ENEMY, SQUADRON_0B, -1, 0, 0, 0, 0, 0) + weapon(0x0100, MODEL_CHRFALCON2, CHR_CHIEF, OBJFLAG_ASSIGNEDTOCHR, 0, 0, WEAPON_FALCON2) + weapon(0x0100, MODEL_CHRFALCON2, CHR_CHIEF, OBJFLAG_ASSIGNEDTOCHR | OBJFLAG_DEACTIVATED, 0, 0, WEAPON_FALCON2) + + link_guns(-1, -2) + tag(0x1f, 1) + hovercar(0x004c, MODEL_DD_HOVCOP, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x20, 1) + hovercar(0x004c, MODEL_DD_HOVCOP, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x21, 1) + hovercar(0x004c, MODEL_DD_HOVCAR, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x22, 1) + hovercar(0x004c, MODEL_DD_HOVCAR, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x23, 1) + hovercar(0x004c, MODEL_DD_HOVMOTO, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x24, 1) + hovercar(0x004c, MODEL_DD_HOVMOTO, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x25, 1) + hovercar(0x004c, MODEL_DD_HOVTRUCK, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x26, 1) + hovercar(0x004c, MODEL_DD_HOVTRUCK, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x27, 1) + hovercar(0x004c, MODEL_DD_HOVCAB, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + tag(0x28, 1) + hovercar(0x004c, MODEL_DD_HOVCAB, PAD_WAX_0144, OBJFLAG_00000008 | OBJFLAG_20000000, 0, 0, 100, AILIST_INIT_HOVERCAR) + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_DD_AC_UNEXP, PAD_WAX_019F, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_DD_AC_EXP, PAD_WAX_01A1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_DD_AC_EXP, PAD_WAX_01A1, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + conditional_scenery(1, 0, 2) + door(0x0100, MODEL_DD_ACBOT_UNEXP, PAD_WAX_019E, OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_PATHBLOCKER | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE | OBJFLAG_DEACTIVATED, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000 | OBJFLAG2_AICANNOTUSE, OBJFLAG3_04000000, 1000, 0x00000000, 0x00010000, 0x03e80000, 0x03e80000, 0x00010000, 0, DOORTYPE_SLIDING, 0x00000080, 0x00000001, 0x00010000, 0x00000000, 0x00000000) +#if VERSION >= VERSION_NTSC_1_0 + stdobject(0x0100, MODEL_DD_ACBOT_EXP, PAD_WAX_01A0, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#else + stdobject(0x0100, MODEL_DD_ACBOT_EXP, PAD_WAX_01A0, OBJFLAG_00000008 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_00400000 | OBJFLAG_01000000 | OBJFLAG_CANNOT_ACTIVATE, OBJFLAG2_00000100 | OBJFLAG2_00000200 | OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_BULLETPROOF | OBJFLAG2_00200000, 0, 1000) +#endif + stdobject(0x0100, MODEL_A51_CRATE2, PAD_WAX_0140, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_WAX_0141, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_WAX_0142, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_A51_CRATE2, PAD_WAX_0143, OBJFLAG_00000001 | OBJFLAG_00000100 | OBJFLAG_INVINCIBLE, 0, OBJFLAG3_PUSHABLE, 1000) + stdobject(0x0100, MODEL_DD_STONEDESK, PAD_WAX_0134, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_00200000, 0, 1000) + stdobject(0x0100, MODEL_PC1, PAD_WAX_0132, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR, 0, 0, 1000) + camera(0x0100, MODEL_CCTV_PD, PAD_WAX_0136, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 400, 0x0011, 0x00000000, 0x00000000, 0x000002bc) + camera(0x0100, MODEL_CCTV_PD, PAD_WAX_0137, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A, 0, 400, 0x0014, 0x00000000, 0x00000000, 0x000002bc) + camera(0x0100, MODEL_CCTV_PD, PAD_WAX_0138, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 400, 0x0019, 0x00000000, 0x00000000, 0x000002bc) + camera(0x0100, MODEL_CCTV_PD, PAD_WAX_0139, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A, 0, 400, 0x001d, 0x00000000, 0x00000000, 0x000003e8) + camera(0x0100, MODEL_CCTV_PD, PAD_WAX_013A, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A | OBJFLAG2_EXCLUDE_SA, 0, 400, 0x0067, 0x00000000, 0x00000000, 0x000002bc) + camera(0x0100, MODEL_CCTV_PD, PAD_WAX_013B, OBJFLAG_00000002, OBJFLAG2_EXCLUDE_A, 0, 400, 0x0076, 0x00000000, 0x00000000, 0x000002bc) + camera2(0x0000, 0xfffd05c6, 0xfff25662, 0x000013f6, 0x005a0000, 0x00063f8f, 0x00000219) + tag(0x09, -1) + camera2(0x0000, 0xffff51d2, 0xfffd0422, 0x00000c58, 0x00060000, 0x0005f5c2, 0x00000219) + tag(0x15, -1) + camera2(0x0000, 0xffff67da, 0xfffd8eec, 0xfffe7c44, 0x0004a147, 0x0005f851, 0x00000219) + tag(0x16, -1) + tag(0x04, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_WAX_025C, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3, 3, 3, 0) + tag(0x03, 1) + multimonitor(0x0099, MODEL_COMHUB, PAD_WAX_013C, OBJFLAG_00000002, OBJFLAG2_IMMUNETOANTI, 0, 1000, 3, 3, 3, 0) + tag(OBJ_LIGHTSWITCH, 1) + stdobject(0x0100, MODEL_LIGHTSWITCH, PAD_WAX_013D, OBJFLAG_00000002 | OBJFLAG_DEACTIVATED, 0, OBJFLAG3_INTERACTABLE, 1000) + tag(0x10, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_WAX_0258, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x11, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_WAX_0259, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x12, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_WAX_025A, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x13, 1) + multimonitor(0x0099, MODEL_PD_CONSOLE, PAD_WAX_025B, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000080 | OBJFLAG_00000100, 0, 0, 1000, 3, 3, 0, 0) + tag(0x19, 2) + tag(0x1a, 2) + stdobject(0x0100, MODEL_DD_BANNER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_BANNER, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x17, 1) + stdobject(0x0100, MODEL_DDJUMPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1b, 1) + stdobject(0x0024, MODEL_DDJUMPSHIP, -1, OBJFLAG_00000001 | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x18, 1) + stdobject(0x0100, MODEL_ROPE, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1c, 1) + stdobject(0x0051, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1e, 1) + stdobject(0x0024, MODEL_TAXICAB, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x1d, 1) + stdobject(0x0051, MODEL_POLICECAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x30, 1) + stdobject(0x0024, MODEL_POLICECAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x29, 1) + stdobject(0x0019, MODEL_DD_HOVCOP, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2a, 1) + stdobject(0x0019, MODEL_DD_HOVCAR, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2b, 1) + stdobject(0x0019, MODEL_DD_HOVMOTO, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2c, 1) + stdobject(0x0019, MODEL_DD_HOVCAB, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + tag(0x2d, 1) + stdobject(0x0019, MODEL_DD_HOVTRUCK, -1, OBJFLAG_00000001 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE, 0, 0, 1000) + stdobject(0x0100, MODEL_DD_DESK, PAD_WAX_00DE, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR, OBJFLAG2_IMMUNETOGUNFIRE, OBJFLAG3_PUSHABLE, 1000) + tag(OBJ_SHUTTLE1, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, 1000) + tag(OBJ_SHUTTLE2, 1) + stdobject(0x0100, MODEL_SK_SHUTTLE, -1, OBJFLAG_00000008 | OBJFLAG_00000100 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_IGNOREROOMCOLOUR | OBJFLAG_INVINCIBLE | OBJFLAG_00400000, 0, 0, 1000) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0121, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0122, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_011F, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tinted_glass(0x0100, MODEL_DD_WINDOW, PAD_WAX_0120, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000100 | OBJFLAG_00000200 | OBJFLAG_PATHBLOCKER | OBJFLAG_AISEETHROUGH | OBJFLAG_DEACTIVATED, 0, 0, 1000, 0x04b007d0) + tag(0x52, 1) + stdobject(0x0100, MODEL_SKEDARBOMB, PAD_WAX_0011, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + rename_object(-1, WEAPON_SKEDARBOMB, L_WAX_017, L_WAX_018, L_WAX_019, L_WAX_020, L_WAX_021) // "" + tag(0x53, 1) + stdobject(0x0100, MODEL_SKEDARBOMB, PAD_WAX_0011, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_IGNOREFLOORCOLOUR | OBJFLAG_UNCOLLECTABLE | OBJFLAG_BOUNCEIFSHOT | OBJFLAG_01000000, OBJFLAG2_IMMUNETOGUNFIRE | OBJFLAG2_INVISIBLE, 0, 1000) + rename_object(-1, WEAPON_SKEDARBOMB, L_WAX_017, L_WAX_018, L_WAX_019, L_WAX_020, L_WAX_021) // "" + tag(0x54, 1) + stdobject(0x0100, MODEL_SKEDARBOMB, PAD_WAX_0257, OBJFLAG_00000001 | OBJFLAG_00000002 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080 | OBJFLAG_INVINCIBLE, OBJFLAG2_IMMUNETOANTI | OBJFLAG2_INVISIBLE, OBJFLAG3_INTERACTABLE, 1000) + tag(0x41, 1) + shield(0x0100, MODEL_CHRSHIELD, 0x000a, OBJFLAG_00000001 | OBJFLAG_ASSIGNEDTOCHR, OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x42, 1) + shield(0x0100, MODEL_CHRSHIELD, PAD_WAX_025F, OBJFLAG_00000001, OBJFLAG2_EXCLUDE_SA | OBJFLAG2_EXCLUDE_PA | OBJFLAG2_EXCLUDE_PD, 0, 1000) + tag(0x43, 1) + weapon(0x0100, MODEL_CHRPCGUN, PAD_WAX_01D2, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_LAPTOPGUN) + tag(0x44, 1) + weapon(0x0100, MODEL_CHRFALCON2, PAD_WAX_01D5, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_FALCON2) + tag(0x45, 1) + weapon(0x0100, MODEL_CHRFALCON2, PAD_WAX_01D4, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_FALCON2) + tag(0x46, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_WAX_01D6, OBJFLAG_00000001 | OBJFLAG_00000020 | OBJFLAG_00000040 | OBJFLAG_00000080, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_SMG) + tag(0x47, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_WAX_01D7, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x48, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_WAX_01D8, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x49, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_WAX_01D9, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4a, 1) + ammocrate(0x0100, MODEL_CHRFALCON2, PAD_WAX_01DA, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4a, 1) + ammocrate(0x0100, MODEL_CHRFALCON2, PAD_WAX_01DA, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4b, 1) + ammocrate(0x0019, MODEL_MULTI_AMMO_CRATE, PAD_WAX_01DB, OBJFLAG_00000001, OBJFLAG2_IMMUNETOANTI, 0, 1000, AMMOTYPE_PISTOL) + tag(0x4c, 1) + weapon(0x0100, MODEL_CHRCMP150, PAD_WAX_025D, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_CMP150) + tag(0x4d, 1) + weapon(0x0100, MODEL_CHRCMP150, PAD_WAX_025E, OBJFLAG_00000008, OBJFLAG2_IMMUNETOANTI, 0, WEAPON_CMP150) + endprops +}; + +s32 intro[] = { + intro_weapon(WEAPON_MAULER, -1) + ammo(AMMOTYPE_PISTOL, 100) + intro_weapon(WEAPON_EYESPY, -1) + outfit(OUTFIT_MRBLONDE) + intro_weapon(WEAPON_CLOAKINGDEVICE, -1) +#if VERSION == VERSION_PAL_FINAL + ammo(AMMOTYPE_CLOAK, 1500) // 25 seconds +#else + ammo(AMMOTYPE_CLOAK, 1800) // 30 seconds +#endif + ammo(AMMOTYPE_PISTOL, 100) + spawn(PAD_WAX_01F8) + endintro +}; + +s32 path00[] = { + PAD_WAX_0144, + PAD_WAX_0145, + -1, +}; + +s32 path01[] = { + PAD_WAX_0146, + PAD_WAX_0147, + PAD_WAX_0148, + -1, +}; + +s32 path02[] = { + PAD_WAX_0149, + PAD_WAX_014A, + PAD_WAX_014B, + PAD_WAX_014C, + PAD_WAX_014D, + PAD_WAX_014E, + -1, +}; + +s32 path03[] = { + PAD_WAX_0152, + PAD_WAX_0151, + PAD_WAX_0150, + PAD_WAX_014F, + -1, +}; + +s32 path04[] = { + PAD_WAX_0154, + PAD_WAX_0157, + PAD_WAX_0156, + PAD_WAX_0153, + PAD_WAX_0155, + -1, +}; + +s32 path05[] = { + PAD_WAX_0159, + PAD_WAX_015A, + PAD_WAX_015D, + PAD_WAX_015B, + PAD_WAX_015C, + PAD_WAX_0158, + -1, +}; + +s32 path06[] = { + PAD_WAX_015E, + PAD_WAX_015F, + PAD_WAX_0160, + PAD_WAX_0161, + PAD_WAX_0162, + PAD_WAX_0163, + -1, +}; + +s32 path07[] = { + PAD_WAX_0167, + PAD_WAX_0166, + PAD_WAX_0165, + PAD_WAX_0168, + PAD_WAX_0169, + PAD_WAX_0164, + -1, +}; + +s32 path08[] = { + PAD_WAX_016A, + PAD_WAX_016B, + PAD_WAX_016C, + PAD_WAX_016D, + -1, +}; + +s32 path09[] = { + PAD_WAX_016E, + PAD_WAX_016F, + PAD_WAX_0170, + PAD_WAX_0171, + PAD_WAX_0172, + PAD_WAX_0173, + -1, +}; + +s32 path10[] = { + PAD_WAX_0174, + PAD_WAX_0175, + PAD_WAX_0176, + PAD_WAX_0177, + -1, +}; + +s32 path11[] = { + PAD_WAX_0178, + PAD_WAX_0179, + PAD_WAX_017A, + PAD_WAX_017B, + PAD_WAX_017C, + PAD_WAX_017D, + PAD_WAX_017E, + PAD_WAX_017F, + -1, +}; + +s32 path12[] = { + PAD_WAX_0180, + PAD_WAX_0181, + PAD_WAX_0182, + -1, +}; + +s32 path13[] = { + PAD_WAX_0183, + PAD_WAX_0184, + PAD_WAX_0185, + -1, +}; + +s32 path14[] = { + PAD_WAX_0186, + PAD_WAX_0191, + -1, +}; + +s32 path15[] = { + PAD_WAX_0187, + PAD_WAX_0190, + -1, +}; + +s32 path16[] = { + PAD_WAX_0188, + PAD_WAX_018F, + -1, +}; + +s32 path17[] = { + PAD_WAX_0189, + PAD_WAX_018E, + -1, +}; + +s32 path18[] = { + PAD_WAX_018C, + PAD_WAX_018B, + -1, +}; + +s32 path19[] = { + PAD_WAX_018D, + PAD_WAX_018A, + -1, +}; + +s32 path20[] = { + PAD_WAX_0192, + PAD_WAX_019D, + -1, +}; + +s32 path21[] = { + PAD_WAX_0193, + PAD_WAX_019C, + -1, +}; + +s32 path22[] = { + PAD_WAX_0194, + PAD_WAX_019B, + -1, +}; + +s32 path23[] = { + PAD_WAX_0195, + PAD_WAX_019A, + -1, +}; + +s32 path24[] = { + PAD_WAX_0197, + PAD_WAX_0198, + -1, +}; + +s32 path25[] = { + PAD_WAX_0196, + PAD_WAX_0199, + -1, +}; + +s32 path26[] = { + PAD_WAX_007D, + PAD_WAX_007C, + PAD_WAX_0077, + PAD_WAX_0076, + PAD_WAX_008D, + PAD_WAX_008C, + PAD_WAX_008B, + PAD_WAX_0088, + PAD_WAX_008B, + PAD_WAX_008C, + -1, +}; + +s32 path27[] = { + PAD_WAX_008E, + PAD_WAX_008D, + PAD_WAX_008C, + PAD_WAX_008B, + PAD_WAX_0088, + -1, +}; + +s32 path30[] = { + PAD_WAX_000C, + PAD_WAX_000B, + PAD_WAX_000F, + PAD_WAX_0010, + PAD_WAX_0013, + PAD_WAX_0011, + PAD_WAX_0012, + PAD_WAX_0011, + PAD_WAX_0010, + PAD_WAX_000F, + PAD_WAX_000B, + -1, +}; + +s32 path32[] = { + PAD_WAX_0028, + PAD_WAX_0029, + PAD_WAX_002F, + PAD_WAX_0030, + PAD_WAX_002B, + PAD_WAX_002A, + PAD_WAX_002D, + PAD_WAX_002C, + PAD_WAX_002E, + PAD_WAX_0031, + PAD_WAX_0032, + PAD_WAX_003B, + PAD_WAX_003A, + PAD_WAX_0039, + -1, +}; + +s32 path33[] = { + PAD_WAX_0032, + PAD_WAX_003B, + PAD_WAX_003A, + PAD_WAX_0039, + PAD_WAX_0074, + PAD_WAX_006E, + PAD_WAX_006D, + PAD_WAX_0072, + PAD_WAX_0073, + PAD_WAX_0070, + PAD_WAX_0071, + PAD_WAX_006F, + -1, +}; + +s32 path34[] = { + PAD_WAX_01F6, + PAD_WAX_01F5, + PAD_WAX_01F4, + PAD_WAX_01F3, + PAD_WAX_01F2, + PAD_WAX_01F0, + PAD_WAX_01EF, + PAD_WAX_01EE, + PAD_WAX_01EC, + PAD_WAX_01E8, + PAD_WAX_01E6, + PAD_WAX_01E5, + PAD_WAX_01DD, + PAD_WAX_01E4, + PAD_WAX_01E3, + PAD_WAX_01E2, + PAD_WAX_01E1, + -1, +}; + +s32 path35[] = { + PAD_WAX_01EA, + PAD_WAX_01EB, + PAD_WAX_01EF, + PAD_WAX_01F1, + PAD_WAX_01F2, + PAD_WAX_01F3, + PAD_WAX_01F4, + PAD_WAX_01F6, + PAD_WAX_01E2, + PAD_WAX_01DD, + PAD_WAX_01E5, + PAD_WAX_01E6, + -1, +}; + +s32 path36[] = { + PAD_WAX_01E6, + PAD_WAX_01E5, + PAD_WAX_01DD, + PAD_WAX_01E2, + PAD_WAX_01F6, + PAD_WAX_01F4, + PAD_WAX_01F3, + PAD_WAX_01F2, + PAD_WAX_01F1, + PAD_WAX_01EF, + PAD_WAX_01EB, + PAD_WAX_01EA, + -1, +}; + +s32 path37[] = { + PAD_WAX_007C, + PAD_WAX_0078, + PAD_WAX_0077, + PAD_WAX_0076, + PAD_WAX_008E, + PAD_WAX_008D, + PAD_WAX_008C, + PAD_WAX_008B, + PAD_WAX_008A, + PAD_WAX_0089, + PAD_WAX_0088, + PAD_WAX_0090, + PAD_WAX_0075, + PAD_WAX_006F, + PAD_WAX_0071, + PAD_WAX_0070, + PAD_WAX_0073, + PAD_WAX_0066, + PAD_WAX_0058, + PAD_WAX_0059, + PAD_WAX_005A, + PAD_WAX_0067, + PAD_WAX_0068, + PAD_WAX_005B, + PAD_WAX_005C, + PAD_WAX_005D, + PAD_WAX_005E, + PAD_WAX_0061, + -1, +}; + +s32 path31[] = { + PAD_WAX_0011, + PAD_WAX_0013, + PAD_WAX_0014, + PAD_WAX_0015, + PAD_WAX_0016, + PAD_WAX_0017, + -1, +}; + +s32 path28[] = { + PAD_WAX_0058, + PAD_WAX_0067, + PAD_WAX_0068, + PAD_WAX_005B, + PAD_WAX_005D, + -1, +}; + +s32 path29[] = { + PAD_WAX_0060, + PAD_WAX_005F, + PAD_WAX_0056, + PAD_WAX_0055, + PAD_WAX_0051, + PAD_WAX_0052, + PAD_WAX_0053, + -1, +}; + +struct path paths[] = { + { path00, 0, 0 }, + { path01, 1, PATHFLAG_FLYING }, + { path02, 2, PATHFLAG_FLYING }, + { path03, 3, PATHFLAG_FLYING }, + { path04, 4, PATHFLAG_FLYING }, + { path05, 5, PATHFLAG_FLYING }, + { path06, 6, PATHFLAG_FLYING }, + { path07, 7, PATHFLAG_FLYING }, + { path08, 8, PATHFLAG_FLYING }, + { path09, 9, PATHFLAG_FLYING }, + { path10, 10, PATHFLAG_FLYING }, + { path11, 11, PATHFLAG_FLYING }, + { path12, 12, PATHFLAG_FLYING }, + { path13, 13, PATHFLAG_FLYING }, + { path14, 14, PATHFLAG_FLYING }, + { path15, 15, PATHFLAG_FLYING }, + { path16, 16, PATHFLAG_FLYING }, + { path17, 17, PATHFLAG_FLYING }, + { path18, 18, PATHFLAG_FLYING }, + { path19, 19, PATHFLAG_FLYING }, + { path20, 20, PATHFLAG_FLYING }, + { path21, 21, PATHFLAG_FLYING }, + { path22, 22, PATHFLAG_FLYING }, + { path23, 23, PATHFLAG_FLYING }, + { path24, 24, PATHFLAG_FLYING }, + { path25, 25, PATHFLAG_FLYING }, + { path26, 26, PATHFLAG_CIRCULAR }, + { path27, 27, 0 }, + { path28, 28, 0 }, + { path29, 29, 0 }, + { path30, 30, PATHFLAG_CIRCULAR }, + { path31, 31, 0 }, + { path32, 32, 0 }, + { path33, 33, 0 }, + { path34, 34, PATHFLAG_CIRCULAR }, + { path35, 35, PATHFLAG_CIRCULAR }, + { path36, 36, PATHFLAG_CIRCULAR }, + { path37, 37, 0 }, + { NULL, 0, 0 }, +}; + +u8 func0401_init_hovercar[] = { + begin_hovercar_path(0x00) + set_vehicle_speed(0x0c00, 120) + + beginloop(0x04) + endloop(0x04) + + // Everything below here in this function is unreachable + label(0x08) + set_vehicle_speed(0x0600, 120) + goto_first(0x04) + + label(0x09) + set_vehicle_speed(0x0700, 120) + goto_first(0x04) + + label(0x0a) + set_vehicle_speed(0x0800, 120) + goto_first(0x04) + + label(0x0b) + set_vehicle_speed(0x0900, 120) + goto_first(0x04) + + label(0x0c) + set_vehicle_speed(0x0a00, 120) + goto_first(0x04) + + label(0x0d) + set_vehicle_speed(0x0b00, 120) + goto_first(0x04) + + label(0x0e) + set_vehicle_speed(0x0d00, 120) + goto_first(0x04) + + endlist +}; + +u8 func0402_start_path26[] = { + assign_path(26) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0403_start_path27[] = { + assign_path(27) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0404_start_path28[] = { + assign_path(28) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0405_start_path29[] = { + assign_path(29) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0406_start_path30[] = { + assign_path(30) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0407_start_path31[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_returnlist(CHR_SELF, 0x0407) + assign_path(31) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0408_start_path32[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + assign_path(32) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func0409_start_path33[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + assign_path(33) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040a_start_path34[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + assign_path(34) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040b_start_path35[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + assign_path(35) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040c_start_path36[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + assign_path(36) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func040d_start_path37[] = { + assign_path(37) + start_patrol + set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) + endlist +}; + +u8 func1002_lightswitch[] = { + // Wait until switch activated + beginloop(0x04) + if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + play_sound(SFX_PRESS_SWITCH, -1) + if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x06) + + // Turning lights off + set_stage_flag(STAGEFLAG_LIGHTS_OFF) + set_lights_state(0x0044, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_1, 0x00, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_1, 0x00, 0x00, 0x00) + reloop(0x04) + + // Turning lights on + label(0x06) + unset_stage_flag(STAGEFLAG_LIGHTS_OFF) + set_lights_state(0x0044, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0039, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x003c, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x003d, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x003e, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x003b, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0042, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x003f, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x003a, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0041, LIGHTOP_1, 0x64, 0x00, 0x00) + set_lights_state(0x0040, LIGHTOP_1, 0x64, 0x00, 0x00) + endloop(0x04) + + endlist +}; + +u8 func1001_objectives_failed_msg[] = { + set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) + endlist +}; + +u8 func1000_setup_counterop[] = { + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + yield + set_chr_team(CHR_ANTI, TEAM_ENEMY) + give_object_to_chr(OBJ_BOND_BOMB, CHR_BOND) + if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) + give_object_to_chr(OBJ_COOP_BOMB, CHR_COOP) + label(0x2c) + set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) + endlist +}; + +u8 func040e_init_60hp_guard[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func040f_init_40hp_guard[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_ailist(CHR_SELF, GAILIST_UNALERTED) + endlist +}; + +u8 func0410_init_searching_guard[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 40) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_returnlist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) + endlist +}; + +u8 func0412_init_cass[] = { + set_chr_maxdamage(CHR_SELF, 40) +#if VERSION >= VERSION_NTSC_1_0 + set_self_chrflag(CHRCFLAG_PUSHABLE) +#endif + set_ailist(CHR_SELF, AILIST_CASS_IN_OFFICE) + endlist +}; + +u8 func0411_cass_in_office[] = { + if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) + goto_next(0x06) + + // Dying + label(0x2c) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Not dying + label(0x06) + if_has_gun(CHR_SELF, /*goto*/ 0x2c) + set_self_chrflag(CHRCFLAG_INVINCIBLE) + set_stage_flag(STAGEFLAG_TRIGGER_YWSM) + set_shotlist(AILIST_CASS_RUNNING) + restart_timer +#if VERSION >= VERSION_NTSC_1_0 + speak(CHR_TARGET, L_WAX_008, MP3_0523, CHANNEL_6, COLOR_06_WHITE) // "Go to the helipad if you want to live." +#else + speak(CHR_TARGET, L_WAX_008, 0x1523, CHANNEL_6, COLOR_06_WHITE) // "Go to the helipad if you want to live." +#endif + chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + yield + + // Wait 3 seconds + beginloop(0x08) + if_timer_gt(180, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_ailist(CHR_SELF, AILIST_CASS_RUNNING) + + // Waiting for player to enter office + label(0x2c) + if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x5a) + set_shotlist(AILIST_CASS_IN_OFFICE) + set_self_chrflag(CHRCFLAG_00040000) + if_chr_dead(CHR_CASS, /*goto*/ 0x06) + if_chr_knockedout(CHR_CASS, /*goto*/ 0x06) + goto_next(0x2c) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + label(0x2c) + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x54) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x55) + endloop(0x54) + + // Player has entered + label(0x55) + stop_chr + yield + try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x56) + + beginloop(0x56) + if_target_in_fov_left(10, /*goto*/ 0x57) + if_target_out_of_fov_left(246, /*goto*/ 0x57) + endloop(0x56) + + // Draw weapon + label(0x57) + set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) + chr_do_animation(ANIM_DRAW_PISTOL_0245, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x2c) + label(0x2c) + speak(CHR_TARGET, L_WAX_007, SFX_81A3, CHANNEL_6, COLOR_04_ORANGE) // "Get the hell out of my office..." + + beginloop(0x58) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0x58) + + label(0x2c) + set_chr_flag_bankx(0x1e, CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) + set_chr_flag_bankx(0x20, CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) + set_chr_flag_bankx(0x1a, CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) + yield + activate_alarm + + // Wait until player in disarm range + beginloop(0x5a) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_attack_target(/*goto*/ 0x83) + reloop(0x5a) + + label(0x83) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2c) + label(0x2c) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x82) + + // Wait until shooting animation finished + beginloop(0x82) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x82) + + label(0x06) + endloop(0x5a) + + endlist +}; + +u8 func0413_cass_running[] = { + chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) + unset_self_chrflag(CHRCFLAG_INVINCIBLE) + set_shotlist(AILIST_CASS_RUNNING) + if_chr_deadish(CHR_CASS, /*goto*/ 0x06) + goto_next(0x2c) + + // Dying + label(0x06) + set_shotlist(GAILIST_IDLE) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Not dying + label(0x2c) + if_just_injured(CHR_SELF, /*goto*/ 0xb5) + goto_next(0xb1) + + // Shot/hurt - wait until animation finished + beginloop(0xb5) + if_chr_stopped(/*goto*/ 0xb1) + endloop(0xb5) + + // Wait until Blonde's speech has finished ("go to the helipad") + beginloop(0xb1) + if_sound_finished(CHANNEL_6, /*goto*/ 0x03) + endloop(0xb1) + + label(0x03) + // Jog to roof. Keep looping until roof is reached or player has stopped + // looking at Cass. + restart_timer + jog_to_pad(PAD_WAX_0000) + + beginloop(0x08) + if_can_see_target(/*goto*/ 0x2c) + if_chr_stopped(/*goto*/ 0x0d) + goto_next(0x06) + label(0x2c) + endloop(0x08) + + // Player looked away from Cass. + // While still running to pad, wait 2 seconds... + label(0x06) + restart_timer + + beginloop(0x0a) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x0a) + + // Then stop and wait until in sight of player + label(0x2c) + stop_chr + + beginloop(0x09) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_can_see_target(/*goto*/ 0x2c) + endloop(0x09) + + // Consider saying something + label(0x2c) + do_preset_animation(PRESETANIM_TALKRANDOM) + restart_timer + if_stage_flag_eq(STAGEFLAG_CASS_SAID_YWSM, FALSE, /*goto*/ 0x06) + say_quip(CHR_TARGET, 0x2b, 0xff, 0x00, 0xff, BANK_1, 0x0a, 0x04) + + // And wait 2 seconds for the speech to finish + beginloop(0x0b) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x0b) + + // Return to jogging to the roof + label(0x06) + reloop(0x03) + + // At roof, or stopped for some other reason (eg. dead or maybe injured). + // Check distance to pad repeatedly. + label(0x0d) + stop_chr + +#if VERSION >= VERSION_NTSC_1_0 + beginloop(0x0e) + if_chr_distance_to_pad_gt(CHR_SELF, 200, PAD_WAX_0000, /*goto*/ 0x2c) + endloop(0x0e) + + // Continue jogging + label(0x2c) + goto_first(0x03) +#else + // ntsc-beta doesn't loop here, so once Cass stops running she won't start again? + yield +#endif + + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1004_check_cass_dead[] = { + // Wait until Cass dead + beginloop(0x03) + if_chr_deadish(CHR_CASS, /*goto*/ 0x2c) + endloop(0x03) + + label(0x2c) + show_hudmsg(CHR_BOND, L_WAX_014) // "Cassandra has been immobilized." + set_stage_flag(STAGEFLAG_CASS_DEAD) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1005_check_cass_captured[] = { + // Wait until Cass at helipad + beginloop(0x03) + if_chr_deadish(CHR_CASS, /*goto*/ 0x0d) + if_chr_y(CHR_CASS, 0, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + show_hudmsg(CHR_BOND, L_WAX_015) // "Cassandra has been captured successfully." + set_stage_flag(STAGEFLAG_CASS_CAPTURED) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Cass is not at helipad + label(0x2c) + endloop(0x03) + + // Died + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1006_lift_disabling[] = { + // If not PA, return + if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) + goto_next(0x2c) + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Disable chief's lift + label(0x2c) + lock_door(0x50, 0x40) + set_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) + + // Wait until player Y above -4300 + beginloop(0x03) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -4300, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x03) + + // Disable player's lift + label(0x06) + set_lights_state(0x0082, LIGHTOP_2, 0x00, 0x78, 0x00) + play_sound(SFX_8147, -1) + set_object_flag(OBJ_BLONDE_LIFT, OBJFLAG_DEACTIVATED) + unlock_door(0x50, 0x40) + unset_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) + unset_chr_chrflag(CHR_CHIEF, CHRCFLAG_HIDDEN) + set_ailist(CHR_CHIEF, AILIST_CHIEF) + show_hudmsg(CHR_BOND, L_WAX_025) // "Lift has been disabled." + + // Wait until chief dead + beginloop(0x08) + if_chr_deadish(CHR_CHIEF, /*goto*/ 0x2c) + endloop(0x08) + + label(0x2c) + show_hudmsg(CHR_BOND, L_WAX_016) // "Security chief has been eliminated." + set_stage_flag(STAGEFLAG_CHIEF_DEAD) + restart_timer + + // Wait 2 seconds + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x09) + + // Activate lifts and exit + label(0x2c) + unset_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) + unset_object_flag(OBJ_BLONDE_LIFT, OBJFLAG_DEACTIVATED) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0414_init_chief[] = { + set_accuracy(40) + set_reaction_speed(100) + set_chr_maxdamage(CHR_SELF, 60) + add_health_or_armor(40) + set_recovery_speed(0) + set_shield(0) + set_morale(0) + set_self_chrflag(CHRCFLAG_HIDDEN) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0415_chief[] = { + set_shotlist(AILIST_CHIEF) + + // Check if dying + if_chr_deadish(CHR_CHIEF, /*goto*/ 0x2c) + goto_next(0x03) + label(0x2c) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Wait until player in sight + beginloop(0x03) + chr_toggle_p1p2(CHR_SELF) + set_target_chr(CHR_P1P2) + if_target_outside_my_yvisang(/*goto*/ 0x06) + if_target_in_sight(/*goto*/ 0x2c) + label(0x06) + reloop(0x03) + + // Attack while in sight + label(0x2c) + try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2c) + label(0x2c) + try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x82) + + beginloop(0x82) + if_chr_stopped(/*goto*/ 0x06) + endloop(0x82) + + label(0x06) + endloop(0x03) + + endlist +}; + +u8 func100f_disable_chiefs_lift[] = { + // If not PA, return + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + + // Wait until player above -4400 + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -4400, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + reloop(0x04) + + // Wait until chief above -4600 + label(0x06) + if_chr_y(CHR_CHIEF, -4600, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x04) + + // Wait half a second + label(0x06) + restart_timer + + beginloop(0x0a) + if_timer_gt(30, /*goto*/ 0x06) + endloop(0x0a) + + // Disable chief's lift + label(0x06) + set_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) + + // A or SA - return + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1007_bomb_logic[] = { + // Wait until in lab elevator and has bomb equipped + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x2c) + reloop(0x04) + + label(0x2c) + if_chr_weapon_equipped(CHR_P1P2, WEAPON_SKEDARBOMB, /*goto*/ 0x2c) + endloop(0x04) + + // Plant bomb + label(0x2c) + show_hudmsg(CHR_BOND, L_WAX_022) // "Skedar bomb has been placed successfully." + remove_weapon_from_inventory(WEAPON_SKEDARBOMB) + set_stage_flag(STAGEFLAG_BOMB_PLANTED) + disable_object(OBJ_BOND_BOMB) + disable_object(OBJ_COOP_BOMB) + assign_sound(SFX_8144, CHANNEL_1) + play_sound_from_object(CHANNEL_1, OBJ_PLANTED_BOMB, 1, 600, 1200) + unset_object_flag2(OBJ_PLANTED_BOMB, OBJFLAG2_INVISIBLE) + set_object_image(OBJ_PLANTED_BOMB, 0, TVCMDLIST_0F) + unset_object_flag(OBJ_PLANTED_BOMB, OBJFLAG_INVINCIBLE) + + // Start 4 minute timer + set_countdown_timer(240) + show_countdown_timer + start_countdown_timer + + beginloop(0x08) + if_countdown_timer_gt(0, /*goto*/ 0x2d) + goto_next(0x2c) + label(0x2d) + if_object_in_good_condition(OBJ_PLANTED_BOMB, /*goto*/ 0x06) + goto_next(0xb2) + label(0x06) + endloop(0x08) + + // Timer expired + // @bug: This stage flag should be set when the bomb is exploding. It is not + // set when the bomb is damaged. + label(0x2c) + set_countdown_timer(0) + stop_countdown_timer + set_stage_flag(STAGEFLAG_BOMB_EXPIRED) + show_hudmsg(CHR_BOND, L_WAX_023) // "Skedar bomb has detonated." + + // Wait 2 seconds + restart_timer + beginloop(0x09) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0x09) + + // Bomb exploding + label(0xb2) + label(0x2c) + explosions_around_chr(CHR_BOND) + + // Wait 2 seconds for player to die + restart_timer + + beginloop(0xb4) + if_timer_gt(120, /*goto*/ 0x2c) + endloop(0xb4) + + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1008_check_bomb_unplantable[] = { + // If Agent, return + if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) + + // Wait until bomb planted or alarm active + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_BOMB_PLANTED, TRUE, /*goto*/ 0x06) + if_alarm_active(/*goto*/ 0x2c) + reloop(0x04) + + // Bomb planted - return + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Alarm active - lock door and wait for door to be closed or bomb planted + label(0x2c) + lock_door(0x2e, 0x40) + lock_door(0x2f, 0x40) + + beginloop(0xb1) + if_stage_flag_eq(STAGEFLAG_BOMB_PLANTED, TRUE, /*goto*/ 0x0d) + if_door_state(0x2e, DOORSTATE_CLOSED, /*goto*/ 0xb2) + reloop(0xb1) + + // Door is closed + label(0xb2) + yield + chr_toggle_p1p2(CHR_SELF) + if_stage_flag_eq(STAGEFLAG_BOMB_PLANTED, TRUE, /*goto*/ 0x0d) + if_chr_in_room(CHR_BOND, 0x00, 0x002b, /*goto*/ 0x06) + if_chr_in_room(CHR_COOP, 0x00, 0x002b, /*goto*/ 0x06) + goto_next(0x2c) + label(0x06) + endloop(0xb1) + + // Fail mission + label(0x2c) + show_hudmsg(CHR_BOND, L_WAX_024) // "Lift doors locked - bomb cannot be placed." + set_stage_flag(STAGEFLAG_BOMB_UNPLANTABLE) + + // Difficulty is agent or bomb has been planted - return + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + + label(0x2c) + endloop(0x04) + + endlist +}; + +u8 func1009_toggle_top_guards[] = { + disable_chr(0x00) + disable_chr(0x0b) + disable_chr(0x09) + disable_chr(0x1e) + disable_chr(0x1f) + disable_chr(0x20) + disable_chr(0x07) + disable_chr(0x0a) + disable_chr(0x0c) + disable_chr(0x18) + disable_chr(0x19) + disable_chr(0x1a) + disable_chr(0x1b) + disable_chr(0x1c) + disable_chr(0x1d) + disable_chr(0x08) + disable_chr(0x0d) + disable_chr(0x17) + disable_chr(0x06) + disable_chr(0x05) + + // Wait until player above -4100 + beginloop(0x04) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, -4100, OPERATOR_LESS_THAN, /*goto*/ 0x2c) + goto_next(0x06) + label(0x2c) + endloop(0x04) + + // Show chrs + label(0x06) + enable_chr(0x00) + yield + enable_chr(0x0b) + yield + enable_chr(0x09) + yield + enable_chr(0x1e) + yield + enable_chr(0x1f) + yield + enable_chr(0x20) + yield + enable_chr(0x07) + yield + enable_chr(0x0a) + yield + enable_chr(0x0c) + yield + enable_chr(0x18) + yield + enable_chr(0x19) + yield + enable_chr(0x1a) + yield + enable_chr(0x1b) + yield + enable_chr(0x1c) + yield + enable_chr(0x1d) + yield + enable_chr(0x08) + yield + enable_chr(0x0d) + yield + enable_chr(0x17) + yield + enable_chr(0x06) + yield + enable_chr(0x05) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100a_check_for_completion[] = { + // Wait until all objectives complete + beginloop(0x04) + if_all_objectives_complete(/*goto*/ 0x2c) + reloop(0x04) + + // Wait until player at helipad + label(0x2c) + chr_toggle_p1p2(CHR_SELF) + if_chr_y(CHR_P1P2, 0, OPERATOR_LESS_THAN, /*goto*/ 0x2d) + + // Wait 1 second + restart_timer + + beginloop(0x08) + if_timer_gt(60, /*goto*/ 0x06) + endloop(0x08) + + // If either player is alive + label(0x06) + if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) + goto_next(0x06) + + label(0x2c) + if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) + goto_next(0x06) + + // Both players dead + label(0x2c) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + + // At least one player is alive + label(0x06) + set_ailist(CHR_SELF, AILIST_OUTRO) + end_level + + set_ailist(CHR_SELF, GAILIST_IDLE) + + // Player not at helipad + label(0x2d) + endloop(0x04) + + endlist +}; + +u8 func100b_start_lifts[] = { + activate_lift(2, 0x55) + activate_lift(1, 0x56) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100c_lift_doors[] = { + // Wait until player activated a lift door + beginloop(0xc1) + chr_toggle_p1p2(CHR_SELF) + if_chr_activated_object(CHR_P1P2, 0x57, /*goto*/ 0xb1) + if_chr_activated_object(CHR_P1P2, 0x58, /*goto*/ 0xb1) + if_chr_activated_object(CHR_P1P2, 0x59, /*goto*/ 0xb1) + if_chr_activated_object(CHR_P1P2, 0x5a, /*goto*/ 0x2d) + if_chr_activated_object(CHR_P1P2, 0x5b, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x5e, /*goto*/ 0x2c) + if_chr_activated_object(CHR_P1P2, 0x5c, /*goto*/ 0x2d) + if_chr_activated_object(CHR_P1P2, 0x5d, /*goto*/ 0x2d) + reloop(0xc1) + + label(0xb1) + if_door_locked(0x50, 0x40, /*goto*/ 0x2d) + goto_next(0x2c) + + label(0x2c) + play_sound(SFX_DOOR_81B0, -1) + goto_next(0x06) + + // Door locked + label(0x2d) + play_sound(SFX_MENU_SELECT, -1) + + // Wait 2 seconds + label(0x06) + restart_timer + + beginloop(0x08) + if_timer_gt(120, /*goto*/ 0x06) + endloop(0x08) + + label(0x06) + endloop(0xc1) + + endlist +}; + +u8 func0416_intro[] = { + set_object_flag2(0x61, OBJFLAG2_INVISIBLE) + set_object_flag2(0x62, OBJFLAG2_INVISIBLE) + unset_object_flag(0x61, OBJFLAG_00000100) + unset_object_flag(0x62, OBJFLAG_00000100) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_INTRO) + camera_movement(ANIM_CUT_WAX_INTRO_CAM) + cmd0175(60) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_WAX_INTRO_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) + restart_timer + fade_to_color(0x000000ff, 0) + fade_to_color(0x00000000, 110) + set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) + yield + set_cutscene_weapon(CHR_BOND, WEAPON_MAULER, WEAPON_NONE) + open_door(OBJ_LOBBYDOOR_LEFT) + open_door(OBJ_LOBBYDOOR_RIGHT) + + #define wait_until(time, loopid) \ + beginloop(loopid) \ + if_controller_button_pressed(/*goto*/ 0xba) \ + if_timer_gt(time, /*goto*/ 0x06) \ + endloop(loopid) \ + \ + label(0x06) + + wait_until(106, 0xb1) + play_sound(SFX_0162, CHANNEL_10) + play_sound(SFX_047A, CHANNEL_10) + + wait_until(107, 0xb3) + open_door(OBJ_LOBBYDOOR_LEFT) + open_door(OBJ_LOBBYDOOR_RIGHT) + + wait_until(170, 0xb2) + play_sound(SFX_0163, CHANNEL_10) + + wait_until(246, 0xb6) + play_sound(SFX_0161, CHANNEL_10) + + wait_until(280, 0xb7) + close_door(OBJ_LOBBYDOOR_LEFT) + close_door(OBJ_LOBBYDOOR_RIGHT) + + wait_until(290, 0xb9) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0xba) + label(0x2c) + if_controller_button_pressed(/*goto*/ 0xba) + label(0x2c) + endloop(0x08) + + // Controller button pressed or cutscene finished + label(0xba) + disable_object(OBJ_LOBBYDOOR_LEFT) + disable_object(OBJ_LOBBYDOOR_RIGHT) + unset_object_flag2(0x61, OBJFLAG2_INVISIBLE) + unset_object_flag2(0x62, OBJFLAG2_INVISIBLE) + set_object_flag(0x61, OBJFLAG_00000100) + set_object_flag(0x62, OBJFLAG_00000100) + mute_channel(CHANNEL_10) + unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + chr_do_animation(ANIM_CUT_WAX_INTRO_MRB, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) + stop_cutscene_track + stop_ambient_track + enter_firstperson + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func0417_outro[] = { + set_invincible(CHR_BOND) + disable_object(OBJ_SHUTTLE1) + set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) + play_cutscene_track(MUSIC_G5_OUTRO) + camera_movement(ANIM_CUT_WAX_OUTRO_CAM) + set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) + set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) + set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) + set_chr_chrflag(CHR_CASS, CHRCFLAG_INVINCIBLE) + enable_object(OBJ_SHUTTLE2) + set_object_flag2(OBJ_SHUTTLE2, OBJFLAG2_04000000) + set_object_flag3(OBJ_SHUTTLE2, OBJFLAG3_00000010) + object_do_animation(ANIM_CUT_WAX_OUTRO_SKSHUTTLE, OBJ_SHUTTLE2, 0x04, 0xffff) + show_nonessential_chrs(FALSE) + restart_timer + object_set_modelpart_visible(OBJ_SHUTTLE2, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + + beginloop(0x08) + if_camera_animating(/*goto*/ 0x2c) + goto_next(0xba) + label(0x2c) + if_controller_button_pressed(/*goto*/ 0xba) + label(0x2c) + endloop(0x08) + + label(0xba) + disable_object(OBJ_SHUTTLE2) + + label(0x06) + end_level + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func100e_cass_speech[] = { + // Wait until trigger + beginloop(0x04) + if_stage_flag_eq(STAGEFLAG_TRIGGER_YWSM, TRUE, /*goto*/ 0x2c) + endloop(0x04) + + // Wait until channel empty + label(0x2c) + yield + + beginloop(0xb1) + if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) + endloop(0xb1) + + // Speak + label(0x2c) + restart_timer +#if VERSION >= VERSION_NTSC_1_0 + speak(CHR_CASS, L_WAX_013, MP3_02F5 | 0x4000 | 0x2000, CHANNEL_6, COLOR_04_ORANGE) // "You won't shoot me!" +#else + speak(CHR_TARGET, L_WAX_013, MP3_02F5, CHANNEL_6, COLOR_04_ORANGE) // "You won't shoot me!" +#endif + chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) + + beginloop(0x09) + if_timer_gt(80, /*goto*/ 0x06) + endloop(0x09) + + label(0x06) + set_stage_flag(STAGEFLAG_CASS_SAID_YWSM) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1010_init_lighting[] = { + yield + configure_environment(0x0000, AIENVCMD_00, TRUE) + configure_environment(0x0000, AIENVCMD_01, FALSE) + configure_environment(0x0000, AIENVCMD_02, FALSE) + configure_environment(0x0000, AIENVCMD_03, FALSE) + configure_environment(0x0000, AIENVCMD_04, FALSE) + configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) + configure_environment(0x00a2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + configure_environment(0x00a7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +u8 func1011_shuttle_animation[] = { + yield + enable_object(OBJ_SHUTTLE1) + set_object_flag3(OBJ_SHUTTLE1, OBJFLAG3_00000010) + object_set_modelpart_visible(OBJ_SHUTTLE1, MODELPART_SKSHUTTLE_GANGWAY, FALSE) + label(0x09) + restart_timer + + // Some kind of animation on repeat + beginloop(0x08) +#if VERSION >= VERSION_NTSC_1_0 + object_do_animation(ANIM_0489, OBJ_SHUTTLE1, 0x08, 0xffff) +#else + if_all_objectives_complete(/*goto*/ 0x06) + object_do_animation(ANIM_0489, OBJ_SHUTTLE1, 0x04, 0xffff) +#endif + endloop(0x08) + + // Unreachable + label(0x06) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; + +#if VERSION >= VERSION_NTSC_1_0 +u8 func1012_chief_lift[] = { + yield + + // If A or SA, return + if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) + + // Wait until chief dead + beginloop(0x04) + if_objective_complete(1, /*goto*/ 0x2c) + endloop(0x04) + + // Wait 3 seconds + label(0xc1) + label(0x2c) + restart_timer + + beginloop(0xb1) + if_timer_gt(180, /*goto*/ 0x2c) + endloop(0xb1) + + // Activate chief's lift + label(0x2c) + unset_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) + + // The goto first here means that the lift continues to be activated every + // 3 seconds, but it is never deactivated so this is a no op. + goto_first(0xc1) + + // A or SA - return + label(0x0d) + set_ailist(CHR_SELF, GAILIST_IDLE) + endlist +}; +#endif + +struct ailist ailists[] = { + { func0401_init_hovercar, 0x0401 }, + { func0402_start_path26, 0x0402 }, + { func0403_start_path27, 0x0403 }, + { func0404_start_path28, 0x0404 }, + { func0405_start_path29, 0x0405 }, + { func0406_start_path30, 0x0406 }, + { func0407_start_path31, 0x0407 }, + { func0408_start_path32, 0x0408 }, + { func0409_start_path33, 0x0409 }, + { func040a_start_path34, 0x040a }, + { func040b_start_path35, 0x040b }, + { func040c_start_path36, 0x040c }, + { func040d_start_path37, 0x040d }, + { func040e_init_60hp_guard, 0x040e }, + { func040f_init_40hp_guard, 0x040f }, + { func0410_init_searching_guard, 0x0410 }, + { func0411_cass_in_office, 0x0411 }, + { func0412_init_cass, 0x0412 }, + { func0413_cass_running, 0x0413 }, + { func0414_init_chief, 0x0414 }, + { func0415_chief, 0x0415 }, + { func0416_intro, 0x0416 }, + { func0417_outro, 0x0417 }, + { func1000_setup_counterop, 0x1000 }, + { func1001_objectives_failed_msg, 0x1001 }, + { func1002_lightswitch, 0x1002 }, + { func0416_intro, 0x1003 }, + { func1004_check_cass_dead, 0x1004 }, + { func1005_check_cass_captured, 0x1005 }, + { func1006_lift_disabling, 0x1006 }, + { func1007_bomb_logic, 0x1007 }, + { func1008_check_bomb_unplantable, 0x1008 }, + { func1009_toggle_top_guards, 0x1009 }, + { func100a_check_for_completion, 0x100a }, + { func100b_start_lifts, 0x100b }, + { func100c_lift_doors, 0x100c }, + { func100e_cass_speech, 0x100e }, + { func100f_disable_chiefs_lift, 0x100f }, + { func1010_init_lighting, 0x1010 }, + { func1011_shuttle_animation, 0x1011 }, + { func1012_chief_lift, 0x1012 }, + { func0416_intro, 0x0c00 }, + { func0417_outro, 0x0c01 }, + { NULL, 0 }, +}; diff --git a/src/game/chrai.c b/src/game/chrai.c index e527b8b7c..23b7fedac 100644 --- a/src/game/chrai.c +++ b/src/game/chrai.c @@ -52,7918 +52,16 @@ #include "lib/snd.h" #include "types.h" -/** - * @cmd 0000 - */ -static u8 *aiGoToNext(u8 *cmd) -{ - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - - return cmd; -} - -/** - * @cmd 0001 - */ -static u8 *aiGoToFirst(u8 *cmd) -{ - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - - return cmd; -} - -/** - * @cmd 0002 - */ -static u8 *aiLabel(u8 *cmd) -{ - cmd += 3; - return cmd; -} - -/** - * @cmd 0003 - */ -static u8 *aiYield(u8 *cmd) -{ - cmd += 2; - - if (g_Vars.chrdata) { - g_Vars.chrdata->ailist = g_Vars.ailist; - g_Vars.chrdata->aioffset = cmd; - } else if (g_Vars.truck) { - g_Vars.truck->ailist = g_Vars.ailist; - g_Vars.truck->aioffset = cmd; - } else if (g_Vars.heli) { - g_Vars.heli->ailist = g_Vars.ailist; - g_Vars.heli->aioffset = cmd; - } else if (g_Vars.hovercar) { - g_Vars.hovercar->ailist = g_Vars.ailist; - g_Vars.hovercar->aioffset = cmd; - } - - return NULL; -} - -/** - * @cmd 0005 - */ -static u8 *aiSetList(u8 *cmd) -{ - u32 ailistid = cmd[4] | (cmd[3] << 8); - u8 *ailist = ailistFindById(ailistid & 0xffff); - - struct chrdata *chr = g_Vars.chrdata; - - if ((cmd[2] & 0xff) == CHR_SELF) { - g_Vars.ailist = ailist; - return ailist; - } - - chr = chrFindById(chr, cmd[2]); - - if (chr) { - chr->ailist = ailist; - chr->aioffset = ailist; - chr->sleep = 0; - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 0006 - */ -static u8 *aiSetReturnList(u8 *cmd) -{ - u16 ailistid = cmd[4] | (cmd[3] << 8); - struct chrdata *chr; - - if (g_Vars.chrdata) { - if (cmd[2] == CHR_SELF) { - g_Vars.chrdata->aireturnlist = ailistid; - } else { - chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->aireturnlist = ailistid; - } - } - } else if (g_Vars.truck) { - g_Vars.truck->aireturnlist = ailistid; - } else if (g_Vars.heli) { - g_Vars.heli->aireturnlist = ailistid; - } else if (g_Vars.hovercar) { - g_Vars.hovercar->aireturnlist = ailistid; - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 0007 - */ -static u8 *aiSetShotList(u8 *cmd) -{ - u16 ailistid = cmd[3] | (cmd[2] << 8); - - if (g_Vars.chrdata) { - g_Vars.chrdata->aishotlist = ailistid; - } else if (g_Vars.truck) { - osSyncPrintf("set shot list(void) doesn't work for g_Vars.CommandInfo.truck!\n"); - } else if (g_Vars.heli) { - osSyncPrintf("set shot list(void) doesn't work for g_Vars.CommandInfo.heli!\n"); - } else if (g_Vars.hovercar) { - osSyncPrintf("set shot list(void) doesn't work for g_Vars.CommandInfo.hovercar!\n"); - } - - cmd += 4; - - return cmd; -} - -const char var7f1a9524[] = "BOND IN ROOM \n"; -const char var7f1a9534[] = "bond not in room \n"; -const char var7f1a9548[] = "aTimer%s%s: %f\n"; -const char var7f1a9558[] = ""; -const char var7f1a955c[] = ""; -const char var7f1a9560[] = "bTimer:%s%s %f\n"; -const char var7f1a9570[] = ""; -const char var7f1a9574[] = ""; -const char var7f1a9578[] = "ai_ifbondintank: tank code has been removed.\n"; -const char var7f1a95a8[] = "AI_BONDENABLECONTROL\n"; -const char var7f1a95c0[] = "ai(void) enery tune on (%d, %d, %d)\n"; -const char var7f1a95e8[] = "ai(void) enery tune off (%d)\n"; -const char var7f1a9608[] = "%s%sAI_PRINT(void) height = %f ptop = %f \n\n"; -const char var7f1a9638[] = ""; -const char var7f1a963c[] = ""; -const char var7f1a9640[] = "Preset character = %d, my target = %d \n"; -const char var7f1a9668[] = "characters target is %d \n"; -const char var7f1a9684[] = "(DGD)chrai.c(void) aiIfChrsTargetIsChr does not support CHR_BOND as chr1!\n"; -const char var7f1a96d0[] = "(DGD)chrai.c(void) aiIfChrsTargetIsChr does not support CHR_BOND as chr1!\n"; -const char var7f1a971c[] = "DGD(void) (chrai.c) WARNING! attempt to use invalid CHR_PRESET1 - defaulting to JO\n"; -const char var7f1a9770[] = "RISK CHECK = %d \n"; -const char var7f1a9784[] = "aiIfOpportunityFireJumpF() called with no botdata!\n"; -const char var7f1a97b8[] = "TARGET %d PASSED THE DISTANCE 2 TESTS \n"; -const char var7f1a97e0[] = "%d I NOTICE THE TARGET %d\n"; -const char var7f1a97fc[] = "%d I NOTICE THE TARGET %d\n"; -const char var7f1a9818[] = "%d OPPORTUNITY FIRE A CHARACTER = %d \n"; -const char var7f1a9840[] = "%d CANNOT OPPORTUNITY FIRE A TARGET \n"; -const char var7f1a9868[] = " RISK CHECK = %d \n"; -const char var7f1a987c[] = "dist = %d \n"; -const char var7f1a9888[] = "USING VOICE NUMBER %d \n"; -const char var7f1a98a0[] = "SETORDERS COMMAND \n"; -const char var7f1a98b8[] = "SQUADRON MEMBER CHR NUMBER = %d \n"; -const char var7f1a98dc[] = "DOING DIST CHECK \n"; -const char var7f1a98f0[] = "%d SYNCHED WITH A CHARACTER %d \n"; -const char var7f1a9914[] = "synched = %d \n"; -const char var7f1a9924[] = "LEADER'S GOING TO COVER \n"; -const char var7f1a9940[] = "LEADER IS BREAKING COVER \n"; -const char var7f1a995c[] = " I AM SAFE TO BREAK COVER \n"; -const char var7f1a9978[] = "not safe to break cover \n"; -const char var7f1a9994[] = "LEADER IS COVER SEEN \n"; -const char var7f1a99ac[] = "LEADER IS FLANKING LEFT \n"; -const char var7f1a99c8[] = "LEADER IS FLANKING RIGHT \n"; -const char var7f1a99e4[] = "LEADER IS DODGING \n"; -const char var7f1a99f8[] = "LEADER IS THROWING GRENADE \n"; -const char var7f1a9a18[] = "LEADER HAS SEEN FROM WAIT \n"; -const char var7f1a9a34[] = "UNKNOWN LEADER ACTION \n"; -const char var7f1a9a4c[] = "ORDERS CARRIED OUT "; -const char var7f1a9a64[] = "WITHDRAWING!!!!!!!!!!!\n"; -const char var7f1a9a7c[] = "CHECKING MY ORDERS "; -const char var7f1a9a94[] = "ACTING ON MY ORDERS "; -const char var7f1a9aac[] = "DOING DIST CHECK VS CHAR %d\n"; -const char var7f1a9acc[] = "I'm just carrying out my ORDERS \n"; -const char var7f1a9af0[] = "SQUAD IS DOING THAT ACTION\n"; -const char var7f1a9b0c[] = "SQUAD NOT DOING ACTION\n"; -const char var7f1a9b24[] = "g_Vars.CommandInfo.chrdata ->soundtimer = %d, g_Vars.CommandInfo.chrdata->talkgap = %d , soundgap = %d\n"; -const char var7f1a9b8c[] = "RESETTING THE LISTENING \n"; -const char var7f1a9ba8[] = "couldn't go to cover from danger !\n"; -const char var7f1a9bcc[] = "couldn't find cover from danger !\n"; -const char var7f1a9bf0[] = "Randnum = %d, Alarmrandnum = %d \n"; -const char var7f1a9c18[] = "IVE FOUND MY PAD %d \n"; - -/** - * @cmd 01c2 - */ -static u8 *aiSetShootingAtMeList(u8 *cmd) -{ - u16 ailistid = cmd[3] | (cmd[2] << 8); - - if (g_Vars.chrdata) { - g_Vars.chrdata->aishootingatmelist = ailistid; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01c3 - */ -static u8 *aiSetDarkRoomList(u8 *cmd) -{ - u16 ailistid = cmd[3] | (cmd[2] << 8); - - if (g_Vars.chrdata) { - g_Vars.chrdata->aidarkroomlist = ailistid; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0008 - */ -static u8 *aiReturn(u8 *cmd) -{ - u8 *ailist = NULL; - - if (g_Vars.chrdata) { - ailist = ailistFindById(g_Vars.chrdata->aireturnlist); - } else if (g_Vars.truck) { - ailist = ailistFindById(g_Vars.truck->aireturnlist); - } else if (g_Vars.heli) { - ailist = ailistFindById(g_Vars.heli->aireturnlist); - } else if (g_Vars.hovercar) { - ailist = ailistFindById(g_Vars.hovercar->aireturnlist); - } - - g_Vars.ailist = ailist; - - return ailist; -} - -/** - * @cmd 0004 - */ -static u8 *aiEndList(u8 *cmd) -{ - return NULL; -} - -/** - * @cmd 0009 - */ -static u8 *aiStop(u8 *cmd) -{ - if (g_Vars.chrdata) { - chrTryStop(g_Vars.chrdata); - } else if (g_Vars.hovercar) { - chopperStop(g_Vars.hovercar); - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 000a - */ -static u8 *aiKneel(u8 *cmd) -{ - chrTryKneel(g_Vars.chrdata); - cmd += 2; - - return cmd; -} - -/** - * @cmd 000b - */ -static u8 *aiChrDoAnimation(u8 *cmd) -{ - u32 anim_id = cmd[3] | (cmd[2] << 8); - s32 startframe = cmd[5] | (cmd[4] << 8); - s32 endframe = cmd[7] | (cmd[6] << 8); - struct chrdata *chr = NULL; - f32 fstartframe; - f32 fendframe; - - if (g_Vars.chrdata) { - chr = chrFindById(g_Vars.chrdata, cmd[10]); - } - - if (startframe == 0xffff) { - fstartframe = 0; - } else if (startframe == 0xfffe) { - fstartframe = animGetNumFrames(anim_id) - 1; - } else { - fstartframe = startframe; - } - - if (endframe == 0xffff) { - fendframe = -1.0f; - } else { - fendframe = endframe; - } - - if (chr && chr->model) { - f32 speed = 1.0f / (s32)cmd[11]; - - if (g_Vars.in_cutscene) { - if (startframe != 0xfffe) { -#if PAL - fstartframe += var8009e388pf * speed; -#else - fstartframe += g_CutsceneFrameOverrun240 * speed * 0.25f; -#endif - } - - chr->prop->propupdate240 = 0; - } - - chrTryStartAnim(chr, anim_id, fstartframe, fendframe, cmd[8], cmd[9], speed); - - if (startframe == 0xfffe) { - chr0f0220ec(chr, 1, 1); - - if (chr->prop->type == PROPTYPE_PLAYER) { - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - struct player *player = g_Vars.players[playernum]; - player->vv_ground = chr->ground; - player->vv_manground = chr->ground; - } - } - } - - cmd += 12; - - return cmd; -} - -/** - * @cmd 000c - */ -static u8 *aiIfIdle(u8 *cmd) -{ - if (g_Vars.chrdata->actiontype == ACT_ANIM) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -bool func0f04e418(void) -{ - return false; -} - -/** - * @cmd 0032 - */ -static u8 *aiIfStopped(u8 *cmd) -{ - if (chrIsStopped(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0033 - */ -static u8 *aiIfChrDead(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool dead = false; - - if (!chr) { - dead = true; - } else if (chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - dead = false; - } else if (!chr->model || chr->actiontype == ACT_DEAD || chr->actiontype == ACT_DIE) { - dead = true; - } - - if (dead) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0034 - */ -static u8 *aiIfChrDeathAnimationFinished(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool pass; - - if (!chr || !chr->prop) { - pass = true; - } else { - if (chr->prop->type == PROPTYPE_PLAYER) { - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - pass = g_Vars.players[playernum]->isdead; - } else { - pass = (chr->actiontype == ACT_DEAD); - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 017b - */ -static u8 *aiIfChrKnockedOut(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if ((!chr || !chr->prop || chr->prop->type != PROPTYPE_PLAYER) && - (!chr || !chr->model || chr->actiontype == ACT_DRUGGEDKO || chr->actiontype == ACT_DRUGGEDDROP || chr->actiontype == ACT_DRUGGEDCOMINGUP)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -static u8 *aiIfChrDeadish(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool dead = false; - - if (!chr || !chr->prop) { - dead = true; - } else if (chr->prop->type == PROPTYPE_PLAYER) { - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - dead = g_Vars.players[playernum]->isdead; - } else { - if (!chr->model - || chr->actiontype == ACT_DEAD - || chr->actiontype == ACT_DIE - || chr->actiontype == ACT_DRUGGEDKO - || chr->actiontype == ACT_DRUGGEDDROP - || chr->actiontype == ACT_DRUGGEDCOMINGUP) { - dead = true; - } - } - - if (dead) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0035 - */ -static u8 *aiIfTargetInSight(u8 *cmd) -{ - if (chrCheckTargetInSight(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 000f - */ -static u8 *aiTrySidestep(u8 *cmd) -{ - if (chrTrySidestep(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0010 - */ -static u8 *aiTryJumpOut(u8 *cmd) -{ - if (chrTryJumpOut(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0011 - */ -static u8 *aiTryRunSideways(u8 *cmd) -{ - if (chrTryRunSideways(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0012 - */ -static u8 *aiTryAttackWalk(u8 *cmd) -{ - if (chrTryAttackWalk(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0014 - */ -static u8 *aiTryAttackRoll(u8 *cmd) -{ - if (chrTryAttackRoll(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0015 - */ -static u8 *aiTryAttackStand(u8 *cmd) -{ - u32 thingid = cmd[5] | (cmd[4] << 8); - u32 thingtype = cmd[3] | (cmd[2] << 8); - - if (chrTryAttackStand(g_Vars.chrdata, thingtype, thingid)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 0016 - */ -static u8 *aiTryAttackKneel(u8 *cmd) -{ - u32 thingid = cmd[5] | (cmd[4] << 8); - u32 thingtype = cmd[3] | (cmd[2] << 8); - - if (chrTryAttackKneel(g_Vars.chrdata, thingtype, thingid)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 01ba - */ -static u8 *aiTryAttackLie(u8 *cmd) -{ - u32 thingid = cmd[5] | (cmd[4] << 8); - u32 thingtype = cmd[3] | (cmd[2] << 8); - - if (chrTryAttackLie(g_Vars.chrdata, thingtype, thingid)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 0017 - */ -static u8 *aiTryModifyAttack(u8 *cmd) -{ - u32 thingid = cmd[5] | (cmd[4] << 8); - u32 thingtype = cmd[3] | (cmd[2] << 8); - - if ((g_Vars.chrdata && chrTryModifyAttack(g_Vars.chrdata, thingtype, thingid)) || - (g_Vars.hovercar && chopperAttack(g_Vars.hovercar))) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 0018 - */ -static u8 *aiFaceEntity(u8 *cmd) -{ - u32 thingid = cmd[5] | (cmd[4] << 8); - u32 thingtype = cmd[3] | (cmd[2] << 8); - - if (chrFaceEntity(g_Vars.chrdata, thingtype, thingid)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 0019 - */ -static u8 *ai0019(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - struct coord pos = {0, 0, 0}; - - if (chr && chr->prop) { - f32 damage = gsetGetDamage((struct gset *)&cmd[4]); - chrDamageByImpact(chr, damage, &pos, (struct gset *)&cmd[4], NULL, (s8)cmd[3]); - } - - cmd += 8; - - return cmd; -} - -/** - * @cmd 001a - */ -static u8 *aiChrDamageChr(u8 *cmd) -{ - struct chrdata *chr1 = chrFindById(g_Vars.chrdata, cmd[2]); - struct chrdata *chr2 = chrFindById(g_Vars.chrdata, cmd[3]); - - if (chr1 && chr2 && chr1->prop && chr2->prop) { - struct prop *prop = chrGetHeldUsableProp(chr1, HAND_RIGHT); - f32 damage; - struct coord vector = {0, 0, 0}; - struct weaponobj *weapon; - - if (!prop) { - prop = chrGetHeldUsableProp(chr1, HAND_LEFT); - } - - if (prop) { - vector.x = chr2->prop->pos.x - chr1->prop->pos.x; - vector.y = chr2->prop->pos.y - chr1->prop->pos.y; - vector.z = chr2->prop->pos.z - chr1->prop->pos.z; - guNormalize(&vector.x, &vector.y, &vector.z); - weapon = prop->weapon; - damage = gsetGetDamage(&weapon->gset); - chrDamageByImpact(chr2, damage, &vector, &weapon->gset, chr1->prop, (s8)cmd[4]); - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 001b - */ -static u8 *aiConsiderGrenadeThrow(u8 *cmd) -{ - u32 value2 = cmd[5] | (cmd[4] << 8); - u32 value1 = cmd[3] | (cmd[2] << 8); - - if (chrConsiderGrenadeThrow(g_Vars.chrdata, value1, value2)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 0024 - */ -static u8 *aiSurrender(u8 *cmd) -{ - chrTrySurrender(g_Vars.chrdata); - cmd += 2; - - return cmd; -} - -/** - * @cmd 0025 - */ -static u8 *aiFadeOut(u8 *cmd) -{ - chrFadeOut(g_Vars.chrdata); - cmd += 2; - - return cmd; -} - -/** - * @cmd 0026 - */ -static u8 *aiRemoveChr(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop) { - chr->hidden |= 0x20; - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0028 - */ -static u8 *aiActivateAlarm(u8 *cmd) -{ - alarmActivate(); - cmd += 2; - - return cmd; -} - -/** - * @cmd 0029 - */ -static u8 *aiDeactivateAlarm(u8 *cmd) -{ - alarmDeactivate(); - cmd += 2; - - return cmd; -} - -/** - * @cmd 002b - */ -static u8 *aiTryJogToTargetProp(u8 *cmd) -{ - if (chrGoToTarget(g_Vars.chrdata, GOPOSFLAG_JOG)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 002c - */ -static u8 *aiTryWalkToTargetProp(u8 *cmd) -{ - if (chrGoToTarget(g_Vars.chrdata, GOPOSFLAG_WALK)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 002d - */ -static u8 *aiTryRunToTargetProp(u8 *cmd) -{ - if (chrGoToTarget(g_Vars.chrdata, GOPOSFLAG_RUN)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 002f - */ -static u8 *aiTryJogToChr(u8 *cmd) -{ - if (chrGoToChr(g_Vars.chrdata, cmd[2], GOPOSFLAG_JOG)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0031 - */ -static u8 *aiTryRunToChr(u8 *cmd) -{ - if (chrGoToChr(g_Vars.chrdata, cmd[2], GOPOSFLAG_RUN)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0036 - */ -static u8 *aiRandom(u8 *cmd) -{ - g_Vars.chrdata->random = random() & 0xff; - cmd += 2; - - return cmd; -} - -/** - * @cmd 0037 - */ -static u8 *aiIfRandomLessThan(u8 *cmd) -{ - if ((g_Vars.chrdata && g_Vars.chrdata->random < cmd[2]) || - (g_Vars.hovercar && ((u8)random()) < cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0038 - */ -static u8 *aiIfRandomGreaterThan(u8 *cmd) -{ - if ((g_Vars.chrdata && g_Vars.chrdata->random > cmd[2]) || - (g_Vars.hovercar && ((u8)random()) > cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 001d - */ -static u8 *aiJogToPad(u8 *cmd) -{ - u16 pad = cmd[3] | (cmd[2] << 8); - - chrGoToPad(g_Vars.chrdata, pad, GOPOSFLAG_JOG); - cmd += 4; - - return cmd; -} - -/** - * @cmd 001e - */ -static u8 *aiGoToPadPreset(u8 *cmd) -{ - switch (cmd[2]) { - case 0: - chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, GOPOSFLAG_WALK); - break; - case 1: - chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, GOPOSFLAG_JOG); - break; - default: - chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, GOPOSFLAG_RUN); - break; - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 001f - */ -static u8 *aiWalkToPad(u8 *cmd) -{ - u16 pad = cmd[3] | (cmd[2] << 8); - - chrGoToPad(g_Vars.chrdata, pad, GOPOSFLAG_WALK); - cmd += 4; - - return cmd; -} - -/** - * @cmd 0020 - */ -static u8 *aiRunToPad(u8 *cmd) -{ - u16 pad = cmd[3] | (cmd[2] << 8); - - chrGoToPad(g_Vars.chrdata, pad, GOPOSFLAG_RUN); - cmd += 4; - - return cmd; -} - -/** - * @cmd 0021 - */ -static u8 *aiSetPath(u8 *cmd) -{ - chrSetPath(g_Vars.chrdata, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0022 - */ -static u8 *aiStartPatrol(u8 *cmd) -{ - chrTryStartPatrol(g_Vars.chrdata); - cmd += 2; - - return cmd; -} - -/** - * @cmd 0039 - */ -static u8 *aiIfCanHearAlarm(u8 *cmd) -{ - if (chrCanHearAlarm(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0023 - */ -static u8 *aiIfPatrolling(u8 *cmd) -{ - if (g_Vars.chrdata->actiontype == ACT_PATROL - || (g_Vars.chrdata->actiontype == ACT_GOPOS && g_Vars.chrdata->act_gopos.flags & GOPOSFLAG_FORPATHSTART)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 003a - */ -static u8 *aiIfAlarmActive(u8 *cmd) -{ - if (alarmIsActive()) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 003c - */ -static u8 *aiIfHearsTarget(u8 *cmd) -{ - if (chrIsHearingTarget(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 003d - */ -static u8 *aiIfSawInjury(u8 *cmd) -{ - if (chrSawInjury(g_Vars.chrdata, cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 003e - */ -static u8 *aiIfSawDeath(u8 *cmd) -{ - if (chrSawDeath(g_Vars.chrdata, cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 003f - */ -static u8 *aiIfCanSeeTarget(u8 *cmd) -{ - if ((g_Vars.chrdata && chrCanSeeTarget(g_Vars.chrdata)) || - (g_Vars.hovercar && chopperCheckTargetInFov(g_Vars.hovercar, 64) && chopperCheckTargetInSight(g_Vars.hovercar))) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 017a - */ -static u8 *aiIfCanSeeAttackTarget(u8 *cmd) -{ - if ((g_Vars.chrdata && g_Vars.chrdata->prop && chrCanSeeAttackTarget(g_Vars.chrdata, &g_Vars.chrdata->prop->pos, g_Vars.chrdata->prop->rooms, true)) - || (g_Vars.hovercar && chopperCheckTargetInFov(g_Vars.hovercar, 64) && chopperCheckTargetInSight(g_Vars.hovercar))) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0041 - */ -static u8 *aiIfNearlyInTargetsSight(u8 *cmd) -{ - u32 distance = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - - if (chrIsNearlyInTargetsSight(g_Vars.chrdata, distance)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 0044 - */ -static u8 *aiIfHeardTargetRecently(u8 *cmd) -{ - if (chrHeardTargetRecently(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0045 - */ -static u8 *ai0045(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chrHasLineOfSightToPos(g_Vars.chrdata, &chr->prop->pos, chr->prop->rooms)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0046 - */ -static u8 *aiIfNeverBeenOnScreen(u8 *cmd) -{ - if ((g_Vars.chrdata->chrflags & CHRCFLAG_EVERONSCREEN) == 0) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0047 - */ -static u8 *aiIfOnScreen(u8 *cmd) -{ - if (g_Vars.chrdata->prop->flags & (PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONANYSCREENPREVTICK)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0049 - */ -static u8 *aiIfRoomIsOnScreen(u8 *cmd) -{ - u16 pad_id = cmd[3] | (cmd[2] << 8); - s32 room_id = chrGetPadRoom(g_Vars.chrdata, pad_id); - - if (room_id >= 0 && roomIsOnscreen(room_id)) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 004a - */ -static u8 *ai004a(u8 *cmd) -{ - if (chrCanSeeTargetWithExtraCheck(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 004b - */ -static u8 *aiIfNearMiss(u8 *cmd) -{ - if (chrResetNearMiss(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 004c - */ -static u8 *aiIfSeesSuspiciousItem(u8 *cmd) -{ - s16 *ptr; - ubool pass = false; - struct prop *prop; - struct defaultobj *obj; - s16 propnums[256]; - struct prop *chrprop = g_Vars.chrdata->prop; - - roomGetProps(chrprop->rooms, &propnums[0], 256); - - ptr = &propnums[0]; - - while (*ptr >= 0) { - prop = &g_Vars.props[*ptr]; - obj = prop->obj; - - if (prop->type == PROPTYPE_WEAPON) { - if ((obj->hidden & OBJHFLAG_SUSPICIOUS) && chrCanSeeProp(g_Vars.chrdata, prop)) { - pass = true; - } - } else if (prop->type == PROPTYPE_OBJ) { - if (((obj->hidden & OBJHFLAG_SUSPICIOUS) || !objIsHealthy(obj)) - && chrCanSeeProp(g_Vars.chrdata, prop)) { - pass = true; - } - } else if (prop->type == PROPTYPE_EXPLOSION) { - if (chrCanSeeProp(g_Vars.chrdata, prop)) { - pass = true; - } - } - - ptr++; - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 004e - */ -static u8 *aiIfCheckFovWithTarget(u8 *cmd) -{ - bool pass; - - if (cmd[4] == 0) { - if (cmd[3]) { - pass = chrIsInTargetsFovX(g_Vars.chrdata, cmd[2]); - } else { - pass = chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, cmd[2]); - } - } else { - pass = g_Vars.chrdata->yvisang && chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang) == 0; - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 004d - */ -static u8 *aiIfTargetInFovLeft(u8 *cmd) -{ - if (chrGetAngleToTarget(g_Vars.chrdata) < cmd[2] * M_BADTAU * 0.00390625f) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 004f - */ -static u8 *aiIfTargetOutOfFovLeft(u8 *cmd) -{ - if (chrGetAngleToTarget(g_Vars.chrdata) > cmd[2] * M_BADTAU * 0.00390625f) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0050 - */ -static u8 *aiIfTargetInFov(u8 *cmd) -{ - if (chrIsTargetInFov(g_Vars.chrdata, cmd[2], 0)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0052 - */ -static u8 *aiIfDistanceToTargetLessThan(u8 *cmd) -{ - f32 distance = (cmd[3] | (cmd[2] << 8)) * (f32)10; - - if (chrGetDistanceToTarget(g_Vars.chrdata) < distance) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0053 - */ -static u8 *aiIfDistanceToTargetGreaterThan(u8 *cmd) -{ - f32 distance = (cmd[3] | (cmd[2] << 8)) * (f32)10; - - if (chrGetDistanceToTarget(g_Vars.chrdata) > distance) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0054 - */ -static u8 *aiIfChrDistanceToPadLessThan(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - -#if VERSION >= VERSION_NTSC_1_0 - s32 padnum = (cmd[6] | (cmd[5] << 8)) & 0xffff; - f32 value = (cmd[4] | (cmd[3] << 8)) * 10.0f; - s32 realpadnum = padnum; - - if (padnum == 9000) { - realpadnum = (u16) g_Vars.chrdata->padpreset1; - } - - if (chr && realpadnum < 9000 && chrGetDistanceToPad(chr, realpadnum) < value) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } -#else - u16 padnum = cmd[6] | (cmd[5] << 8); - f32 value = (cmd[4] | (cmd[3] << 8)) * 10.0f; - - if (padnum == 9000) { - padnum = g_Vars.chrdata->padpreset1; - } - - if (chr && chrGetDistanceToPad(chr, padnum) < value) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } -#endif - - return cmd; -} - -#if VERSION >= VERSION_NTSC_1_0 -/** - * @cmd 01df - */ -static u8 *aiIfChrSameFloorDistanceToPadLessThan(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - u16 padnum = cmd[6] | (cmd[5] << 8); - f32 distance = (cmd[4] | (cmd[3] << 8)) * 10.0f; - s32 padnum2; - - if (padnum == 9000) { - padnum = g_Vars.chrdata->padpreset1; - } - - padnum2 = padnum; - - if (chr && chrGetSameFloorDistanceToPad(chr, padnum2 & 0xffffffff) < distance) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} -#endif - -/** - * @cmd 0055 - */ -static u8 *aiIfChrDistanceToPadGreaterThan(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - u16 padnum = cmd[6] | (cmd[5] << 8); - f32 distance = (cmd[4] | (cmd[3] << 8)) * 10.0f; - - if (padnum == 9000) { - padnum = g_Vars.chrdata->padpreset1; - } - -#if VERSION >= VERSION_NTSC_1_0 - if (chr && padnum < 9000 && chrGetDistanceToPad(chr, padnum) > distance) -#else - if (chr && chrGetDistanceToPad(chr, padnum) > distance) -#endif - { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 0056 - */ -static u8 *aiIfDistanceToChrLessThan(u8 *cmd) -{ - f32 cutoff = (cmd[3] | (cmd[2] << 8)) * 10.0f; - - if (chrGetDistanceToChr(g_Vars.chrdata, cmd[4]) < cutoff) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 0057 - */ -static u8 *aiIfDistanceToChrGreaterThan(u8 *cmd) -{ - f32 cutoff = (cmd[3] | (cmd[2] << 8)) * 10.0f; - - if (chrGetDistanceToChr(g_Vars.chrdata, cmd[4]) > cutoff) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 0059 - */ -static u8 *aiIfDistanceFromTargetToPadLessThan(u8 *cmd) -{ - u16 pad = cmd[5] | (cmd[4] << 8); - f32 value = (cmd[3] | (cmd[2] << 8)) * 10.0f; - - if (chrGetDistanceFromTargetToPad(g_Vars.chrdata, pad) < value) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 005b - */ -static u8 *aiIfChrInRoom(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - u16 pad_id = cmd[5] | (cmd[4] << 8); - s32 room = chrGetPadRoom(g_Vars.chrdata, pad_id); - - if ((cmd[3] == 0 && room >= 0 && chr && chr->prop && chr->prop->rooms[0] == room) - || (cmd[3] == 1 && chr && chr->prop && chr->prop->rooms[0] == g_Vars.chrdata->roomtosearch)) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - return cmd; - } - - if (cmd[3] == 2 && stageGetIndex(g_Vars.stagenum) == STAGEINDEX_G5BUILDING) { - s32 i; - bool pass = false; - - for (i = 0; i < PLAYERCOUNT(); i++) { - if (g_Vars.players[i]->eyespy && g_Vars.players[i]->eyespy->prop -#if VERSION >= VERSION_NTSC_1_0 - && chrGetDistanceToPad(g_Vars.players[i]->eyespy->prop->chr, pad_id) < 150.0f -#else - && chrGetDistanceToPad(g_Vars.players[i]->eyespy->prop->chr, 0x4d) < 150.0f -#endif - ) { - pass = true; - } - } - - if (pass == true) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; - } - - cmd += 8; - - return cmd; -} - -/** - * @cmd 005d - */ -static u8 *aiIfChrHasObject(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - s32 hasprop = false; - - if (obj && obj->prop && chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - s32 prevplayernum = g_Vars.currentplayernum; - setCurrentPlayerNum(playermgrGetPlayerNumByProp(chr->prop)); - hasprop = invHasProp(obj->prop); - setCurrentPlayerNum(prevplayernum); - } - - if (hasprop) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 005e - */ -static u8 *aiIfWeaponThrown(u8 *cmd) -{ - if (weaponFindLanded(cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 005f - */ -static u8 *aiIfWeaponThrownOnObject(u8 *cmd) -{ - struct bytelist *cmd2 = (struct bytelist *)(cmd); - struct defaultobj *obj = objFindByTagId(cmd2->b3); - bool pass = false; - - if (obj && obj->prop) { - struct prop *prop = obj->prop->child; - - while (prop) { - if (prop->type == PROPTYPE_WEAPON) { - struct weaponobj *weapon = prop->weapon; - - if (weapon->weaponnum == cmd2->b2) { - pass = true; - } - } - - prop = prop->next; - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd2->b4, cmd2->b5); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0060 - */ -static u8 *aiIfChrHasWeaponEquipped(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool passes = false; - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - - if (bgunGetWeaponNum(HAND_RIGHT) == cmd[3]) { - passes = true; - } - - setCurrentPlayerNum(prevplayernum); - } - - if (passes) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0061 - */ -static u8 *aiIfGunUnclaimed(u8 *cmd) -{ - if (cmd[3] == 0) { - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - } else { - struct weaponobj *weapon = g_Vars.chrdata->gunprop->weapon; - - if (weapon && weapon->base.prop) { - weapon->base.flags |= OBJFLAG_00400000; - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - } - - return cmd; -} - -/** - * @cmd 0062 - */ -static u8 *aiIfObjectHealthy(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && objIsHealthy(obj)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0063 - */ -static u8 *aiIfChrActivatedObject(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - u32 stack[1]; - bool pass = false; - - if (obj && obj->prop) { - if (cmd[2] == CHR_ANY) { - if (obj->hidden & (OBJHFLAG_ACTIVATED_BY_BOND | OBJHFLAG_ACTIVATED_BY_COOP)) { - pass = true; - obj->hidden &= ~(OBJHFLAG_ACTIVATED_BY_BOND | OBJHFLAG_ACTIVATED_BY_COOP); - } - } else { - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop) { - if (chr->prop == g_Vars.bond->prop && (obj->hidden & OBJHFLAG_ACTIVATED_BY_BOND)) { - pass = true; - obj->hidden &= ~OBJHFLAG_ACTIVATED_BY_BOND; - } else if (g_Vars.coopplayernum >= 0 && chr->prop == g_Vars.coop->prop && (obj->hidden & OBJHFLAG_ACTIVATED_BY_COOP)) { - pass = true; - obj->hidden &= ~OBJHFLAG_ACTIVATED_BY_COOP; - } - } - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0066 - */ -static u8 *aiDestroyObject(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && objGetDestroyedLevel(obj) == 0) { - struct defaultobj *entity = obj->prop->obj; - - if (entity->modelnum == MODEL_ELVIS_SAUCER) { - obj->flags = (obj->flags & ~OBJFLAG_00010000) | OBJFLAG_INVINCIBLE; - explosionCreateSimple(entity->prop, &entity->prop->pos, entity->prop->rooms, EXPLOSIONTYPE_LAPTOP, 0); - smokeCreateAtProp(entity->prop, SMOKETYPE_UFO); - } else { - f32 damage = ((obj->maxdamage - obj->damage) + 1) / 250.0f; - objDamage(obj, damage, &obj->prop->pos, WEAPON_REMOTEMINE, -1); - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0068 - */ -static u8 *aiChrDropItems(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop) { - chrDropConcealedItems(chr); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0069 - */ -static u8 *aiChrDropWeapon(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - u32 weaponnum; - setCurrentPlayerNum(playernum); - weaponnum = bgunGetWeaponNum(HAND_RIGHT); - invRemoveItemByNum(weaponnum); - bgunCycleBack(); - setCurrentPlayerNum(prevplayernum); - } else if (chr && chr->prop) { - if (chr->weapons_held[0]) { - objSetDropped(chr->weapons_held[0], DROPTYPE_DEFAULT); - chr->hidden |= CHRHFLAG_00000001; - } - - if (chr->weapons_held[1]) { - objSetDropped(chr->weapons_held[1], DROPTYPE_DEFAULT); - chr->hidden |= CHRHFLAG_00000001; - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 006a - */ -static u8 *aiGiveObjectToChr(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]); - - if (obj && obj->prop && chr && chr->prop) { - if (chr->prop->type == PROPTYPE_PLAYER) { - u32 something; - u32 prevplayernum = g_Vars.currentplayernum; - struct defaultobj *obj2 = obj->prop->obj; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - -#if VERSION >= VERSION_NTSC_1_0 - if (obj->prop->parent) { - objDetach(obj->prop); - objFreeEmbedmentOrProjectile(obj->prop); - propActivate(obj->prop); - } -#endif - - something = propPickupByPlayer(obj->prop, 0); - propExecuteTickOperation(obj->prop, something); - playernum = playermgrGetPlayerNumByProp(chr->prop); - obj2->hidden = (playernum << 28) | (obj2->hidden & 0x0fffffff); - setCurrentPlayerNum(prevplayernum); - } else { - if (obj->prop->parent) { - objDetach(obj->prop); - } else { - propDeregisterRooms(obj->prop); - propDelist(obj->prop); - propDisable(obj->prop); - } - - if (obj->type != OBJTYPE_WEAPON || chrEquipWeapon((struct weaponobj *) obj, chr) == 0) { - propReparent(obj->prop, chr->prop); - } - } - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 006b - */ -static u8 *aiObjectMoveToPad(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - u16 padnum = cmd[4] | (cmd[3] << 8); - Mtxf matrix; - struct pad *pad; - s16 rooms[2]; - - if (obj && obj->prop) { - pad = &g_Pads[padnum]; - mtx00016d58(&matrix, - 0, 0, 0, - -pad->look.x, -pad->look.y, -pad->look.z, - pad->up.x, pad->up.y, pad->up.z); - - if (obj->model) { - mtx00015f04(obj->model->scale, &matrix); - } - - rooms[0] = pad->room; - rooms[1] = -1; - func0f06a730(obj, &pad->pos, &matrix, rooms, &pad->pos); - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 006c - */ -static u8 *aiOpenDoor(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { - if (!doorCallLift(obj->prop, false)) { - struct doorobj *door = (struct doorobj *) obj; - doorsRequestMode(door, DOORMODE_OPENING); - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 006d - */ -static u8 *aiCloseDoor(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { - struct doorobj *door = (struct doorobj *) obj; - doorsRequestMode(door, DOORMODE_CLOSING); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 006e - */ -static u8 *aiIfDoorState(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - bool pass = false; - - if (obj && obj->prop && obj->type == OBJTYPE_DOOR) { - struct doorobj *door = (struct doorobj *) obj; - - if (door->mode == DOORMODE_IDLE) { - if (door->frac <= 0) { - pass = (cmd[3] & DOORSTATE_CLOSED) != 0; - } else { - pass = (cmd[3] & DOORSTATE_OPEN) != 0; - } - } else if (door->mode == DOORMODE_OPENING || door->mode == DOORMODE_WAITING) { - pass = (cmd[3] & DOORSTATE_OPENING) != 0; - } else if (door->mode == DOORMODE_CLOSING) { - pass = (cmd[3] & DOORSTATE_CLOSING) != 0; - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0070 - */ -static u8 *aiLockDoor(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { - struct doorobj *door = (struct doorobj *) obj; - u8 bits = cmd[3]; - door->keyflags = door->keyflags | bits; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0071 - */ -static u8 *aiUnlockDoor(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { - struct doorobj *door = (struct doorobj *) obj; - u8 bits = cmd[3]; - door->keyflags = door->keyflags & ~bits; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0072 - */ -static u8 *aiIfDoorLocked(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - bool pass = false; - - if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { - struct doorobj *door = (struct doorobj *) obj; - u32 bits = cmd[3]; - u32 keyflags = door->keyflags; - - if ((keyflags & bits) == bits) { - pass = true; - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0073 - */ -static u8 *aiIfObjectiveComplete(u8 *cmd) -{ - if (cmd[2] < objectiveGetCount() && - objectiveCheck(cmd[2]) == OBJECTIVE_COMPLETE && - objectiveGetDifficultyBits(cmd[2]) & (1 << lvGetDifficulty())) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0074 - */ -static u8 *aiIfObjectiveFailed(u8 *cmd) -{ - if (cmd[2] < objectiveGetCount() && - objectiveCheck(cmd[2]) == OBJECTIVE_FAILED && - objectiveGetDifficultyBits(cmd[2]) & (1 << lvGetDifficulty())) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0075 - */ -static u8 *ai0075(u8 *cmd) -{ - if (func0f04a4ec(g_Vars.chrdata, cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0076 - */ -static u8 *aiSetPadPresetToTargetQuadrant(u8 *cmd) -{ - if (chrSetPadPresetToWaypointWithinTargetQuadrant(g_Vars.chrdata, cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 007d - */ -static u8 *aiIfNumArghsLessThan(u8 *cmd) -{ - if (chrGetNumArghs(g_Vars.chrdata) < cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 007e - */ -static u8 *aiIfNumArghsGreaterThan(u8 *cmd) -{ - if (chrGetNumArghs(g_Vars.chrdata) > cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 010f - */ -static u8 *aiIfChrShieldLessThan(u8 *cmd) -{ - f32 value = (cmd[4] | (cmd[3] << 8)) * 0.1f; - struct chrdata *chr = chrFindById(g_Vars.chrdata,cmd[2]); - - if (chr && chrGetShield(chr) < value) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd = cmd + 7; - } - - return cmd; -} - -/** - * @cmd 0083 - */ -static u8 *aiIfInjured(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && (chr->chrflags & CHRCFLAG_JUST_INJURED)) { - chr->chrflags &= ~CHRCFLAG_JUST_INJURED; - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd = cmd + 5; - } - - return cmd; -} - -/** - * @cmd 0168 - */ -static u8 *aiIfShieldDamaged(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && (chr->chrflags & CHRCFLAG_SHIELDDAMAGED)) { - chr->chrflags &= ~CHRCFLAG_SHIELDDAMAGED; - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd = cmd + 5; - } - - return cmd; -} - -/** - * @cmd 0077 - */ -static u8 *aiIfDifficultyLessThan(u8 *cmd) -{ - if (lvGetDifficulty() < cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0078 - */ -static u8 *aiIfDifficultyGreaterThan(u8 *cmd) -{ - if (lvGetDifficulty() > cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 007b - */ -static u8 *aiIfStageIsNot(u8 *cmd) -{ - if (mainGetStageNum() != cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0084 - */ -static u8 *aiSetMorale(u8 *cmd) -{ - g_Vars.chrdata->morale = cmd[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 0085 - */ -static u8 *aiAddMorale(u8 *cmd) -{ - incrementByte(&g_Vars.chrdata->morale, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0087 - */ -static u8 *aiSubtractMorale(u8 *cmd) -{ - decrementByte(&g_Vars.chrdata->morale, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0088 - */ -static u8 *aiIfMoraleLessThan(u8 *cmd) -{ - if (g_Vars.chrdata->morale < cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 008a - */ -static u8 *aiSetAlertness(u8 *cmd) -{ - g_Vars.chrdata->alertness = cmd[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 008b - */ -static u8 *aiAddAlertness(u8 *cmd) -{ - incrementByte(&g_Vars.chrdata->alertness, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 008c - */ -static u8 *aiChrAddAlertness(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]); - - if (chr && chr->prop) { - incrementByte(&chr->alertness, cmd[2]); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 008e - */ -static u8 *aiIfAlertness(u8 *cmd) -{ - if ((g_Vars.chrdata->alertness < cmd[2] && cmd[3] == 0) || - (cmd[2] < g_Vars.chrdata->alertness && cmd[3] == 1)) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 008f - */ -static u8 *aiIfChrAlertnessLessThan(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]); - - if (chr && chr->alertness < cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0092 - */ -static u8 *aiSetHearDistance(u8 *cmd) -{ - f32 distance = (cmd[3] | (cmd[2] << 8)) / 1000.0f; - g_Vars.chrdata->hearingscale = distance; - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0093 - */ -static u8 *aiSetViewDistance(u8 *cmd) -{ - if (!cheatIsActive(CHEAT_PERFECTDARKNESS)) { - g_Vars.chrdata->visionrange = cmd[2]; - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0094 - */ -static u8 *aiSetGrenadeProbability(u8 *cmd) -{ - g_Vars.chrdata->grenadeprob = cmd[2]; - cmd += + 3; - - return cmd; -} - -/** - * @cmd 0095 - */ -static u8 *aiSetChrNum(u8 *cmd) -{ - chrSetChrnum(g_Vars.chrdata, cmd[2]); - g_Vars.chrdata->chrnum = cmd[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 0096 - */ -static u8 *aiSetMaxDamage(u8 *cmd) -{ - f32 maxdamage = (cmd[4] | (cmd[3] << 8)) * 0.1f; - - if (g_Vars.hovercar) { - chopperSetMaxDamage(g_Vars.hovercar, maxdamage); - } else { - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && !chrIsDead(chr) - && chr->actiontype != ACT_DEAD - && chr->actiontype != ACT_DIE - && chr->actiontype != ACT_DRUGGEDKO - && chr->actiontype != ACT_DRUGGEDDROP - && chr->actiontype != ACT_DRUGGEDCOMINGUP) { - chrSetMaxDamage(chr, maxdamage); - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 0097 - */ -static u8 *aiAddHealth(u8 *cmd) -{ - f32 amount = (cmd[3] | (cmd[2] << 8)) * 0.1f; - - chrAddHealth(g_Vars.chrdata, amount); - - cmd += 4; - - return cmd; -} - -/** - * @cmd 010e - */ -static u8 *aiSetShield(u8 *cmd) -{ - f32 amount = (cmd[3] | (cmd[2] << 8)) * 0.1f; - - if (cheatIsActive(CHEAT_ENEMYSHIELDS)) { - amount = amount < 8 ? 8 : amount; - } - - chrSetShield(g_Vars.chrdata, amount); - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0098 - */ -static u8 *aiSetReactionSpeed(u8 *cmd) -{ - s8 *cmd2 = (s8 *)cmd; - - g_Vars.chrdata->speedrating = cmd2[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 0099 - */ -static u8 *aiSetRecoverySpeed(u8 *cmd) -{ - s8 *cmd2 = (s8 *)cmd; - - g_Vars.chrdata->arghrating = cmd2[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 009a - */ -static u8 *aiSetAccuracy(u8 *cmd) -{ - s8 *cmd2 = (s8 *)cmd; - - g_Vars.chrdata->accuracyrating = cmd2[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 01c6 - */ -static u8 *aiSetDodgeRating(u8 *cmd) -{ - s8 *cmd2 = (s8 *)cmd; - - if (cmd[2] == 0) { - g_Vars.chrdata->dodgerating = cmd2[3]; - } else if (cmd[2] == 1) { - g_Vars.chrdata->maxdodgerating = cmd2[3]; - } else { - g_Vars.chrdata->dodgerating = cmd2[3]; - g_Vars.chrdata->maxdodgerating = cmd2[3]; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01c7 - */ -static u8 *aiSetUnarmedDodgeRating(u8 *cmd) -{ - s8 *cmd2 = (s8 *)cmd; - - g_Vars.chrdata->unarmeddodgerating = cmd2[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 009b - */ -static u8 *aiSetFlag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - chrSetFlags(g_Vars.chrdata, flags, cmd[6]); - - cmd += 7; - - return cmd; -} - -/** - * @cmd 009c - */ -static u8 *aiUnsetFlag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - chrUnsetFlags(g_Vars.chrdata, flags, cmd[6]); - - cmd += 7; - - return cmd; -} - -/** - * @cmd 009d - */ -static u8 *aiIfHasFlag(u8 *cmd) -{ - bool result; - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - - result = chrHasFlag(g_Vars.chrdata, flags, cmd[7]); - - if (cmd[6] == 0) { - result = !result; - } - - if (result) { - cmd = AILABEL(g_Vars.ailist, cmd[8], cmd[9]); - } else { - cmd += 10; - } - - return cmd; -} - -/** - * @cmd 009e - */ -static u8 *aiChrSetFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - chrSetFlagsById(g_Vars.chrdata, cmd[2], flags, cmd[7]); - cmd += 8; - - return cmd; -} - -/** - * @cmd 009f - */ -static u8 *aiChrUnsetFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - chrUnsetFlagsById(g_Vars.chrdata, cmd[2], flags, cmd[7]); - cmd += 8; - - return cmd; -} - -/** - * @cmd 00a0 - */ -static u8 *aiIfChrHasFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - - if (chrHasFlagById(g_Vars.chrdata, cmd[2], flags, cmd[7])) { - cmd = AILABEL(g_Vars.ailist, cmd[8], cmd[9]); - } else { - cmd += 10; - } - - return cmd; -} - -/** - * @cmd 00a1 - */ -static u8 *aiSetStageFlag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - chrSetStageFlag(g_Vars.chrdata, flags); - cmd += 6; - - return cmd; -} - -/** - * @cmd 00a2 - */ -static u8 *aiUnsetStageFlag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - chrUnsetStageFlag(g_Vars.chrdata, flags); - cmd += 6; - - return cmd; -} - -/** - * @cmd 00a3 - */ -static u8 *aiIfStageFlagEq(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - - if ((chrHasStageFlag(g_Vars.chrdata, flags) && cmd[6] == 1) || - (!chrHasStageFlag(g_Vars.chrdata, flags) && cmd[6] == 0)) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 00a4 - */ -static u8 *aiSetChrflag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - - g_Vars.chrdata->chrflags |= flags; - cmd += 6; - - return cmd; -} - -/** - * @cmd 00a5 - */ -static u8 *aiUnsetChrflag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - - g_Vars.chrdata->chrflags &= ~flags; - cmd += 6; - - return cmd; -} - -/** - * @cmd 00a6 - */ -static u8 *aiIfHasChrflag(u8 *cmd) -{ - u32 flags = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - - if ((g_Vars.chrdata->chrflags & flags) == flags) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 00a7 - */ -static u8 *aiChrSetChrflag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->chrflags |= flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00a8 - */ -static u8 *aiChrUnsetChrflag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->chrflags &= ~flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00a9 - */ -static u8 *aiIfChrHasChrflag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && (chr->chrflags & flags) == flags) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 011b - */ -static u8 *aiChrSetHiddenFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->hidden |= flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 011c - */ -static u8 *aiChrUnsetHiddenFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->hidden &= ~flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 011d - */ -static u8 *aiIfChrHasHiddenFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && (chr->hidden & flags) == flags) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 00aa - */ -static u8 *aiSetObjFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->flags |= flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00ab - */ -static u8 *aiUnsetObjFlag(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->flags &= ~flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00ad - */ -static u8 *aiSetObjFlag2(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->flags2 |= flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00ae - */ -static u8 *aiUnsetObjFlag2(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->flags2 &= ~flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00af - */ -static u8 *aiIfObjHasFlag2(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && (obj->flags2 & flags) == flags) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 0118 - */ -static u8 *aiSetObjFlag3(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->flags3 |= flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 0119 - */ -static u8 *aiUnsetObjFlag3(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->flags3 &= ~flags; - } - - cmd += 7; - - return cmd; -} - -/** - * @cmd 011a - */ -static u8 *aiIfObjHasFlag3(u8 *cmd) -{ - u32 flags = (cmd[4] << 16) | (cmd[5] << 8) | cmd[6] | (cmd[3] << 24); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && (obj->flags3 & flags) == flags) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 00b0 - */ -static u8 *aiSetChrPreset(u8 *cmd) -{ - chrSetChrPreset(g_Vars.chrdata, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 00b1 - */ -static u8 *aiSetChrTarget(u8 *cmd) -{ - chrSetChrPresetByChrnum(g_Vars.chrdata, cmd[2], cmd[3]); - cmd += 4; - - return cmd; -} - -/** - * @cmd 00b2 - */ -static u8 *aiSetPadPreset(u8 *cmd) -{ - u16 pad_id = cmd[3] | (cmd[2] << 8); - - if (g_Vars.chrdata) { - chrSetPadPreset(g_Vars.chrdata, pad_id); - } else if (g_Vars.heli) { - g_Vars.heli->base.pad = pad_id; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 00b6 - */ -static u8 *aiRestartTimer(u8 *cmd) -{ - if (g_Vars.chrdata) { - chrRestartTimer(g_Vars.chrdata); - } else if (g_Vars.hovercar) { - chopperRestartTimer(g_Vars.hovercar); - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 00b7 - */ -static u8 *aiResetTimer(u8 *cmd) -{ - g_Vars.chrdata->timer60 = 0; - cmd += 2; - - return cmd; -} - -/** - * @cmd 00b8 - */ -static u8 *aiPauseTimer(u8 *cmd) -{ - g_Vars.chrdata->hidden &= ~CHRHFLAG_TIMER_RUNNING; - cmd += 2; - - return cmd; -} - -/** - * @cmd 00b9 - */ -static u8 *aiResumeTimer(u8 *cmd) -{ - g_Vars.chrdata->hidden |= CHRHFLAG_TIMER_RUNNING; - cmd += 2; - - return cmd; -} - -/** - * @cmd 00bc - */ -static u8 *aiIfTimerLessThan(u8 *cmd) -{ - s32 value = (cmd[3] << 8) | cmd[4] | (cmd[2] << 16); - - if ((g_Vars.chrdata && g_Vars.chrdata->timer60 < value) - || (g_Vars.hovercar && chopperGetTimer(g_Vars.hovercar) < value)) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 00bd - */ -static u8 *aiIfTimerGreaterThan(u8 *cmd) -{ - s32 value = (cmd[3] << 8) | cmd[4] | (cmd[2] << 16); - - if ((g_Vars.chrdata && g_Vars.chrdata->timer60 > value) - || (g_Vars.hovercar && chopperGetTimer(g_Vars.hovercar) > value)) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 00be - */ -static u8 *aiShowCountdownTimer(u8 *cmd) -{ - countdownTimerSetVisible(COUNTDOWNTIMERREASON_AI, true); - cmd += 2; - - return cmd; -} - -/** - * @cmd 00bf - */ -static u8 *aiHideCountdownTimer(u8 *cmd) -{ - countdownTimerSetVisible(COUNTDOWNTIMERREASON_AI, false); - cmd += 2; - - return cmd; -} - -/** - * @cmd 00c0 - */ -static u8 *aiSetCountdownTimerValue(u8 *cmd) -{ - f32 seconds = cmd[3] | (cmd[2] << 8); - - countdownTimerSetValue60(seconds * 60); - cmd += 4; - - return cmd; -} - -/** - * @cmd 00c1 - */ -static u8 *aiStopCountdownTimer(u8 *cmd) -{ - countdownTimerSetRunning(false); - cmd += 2; - - return cmd; -} - -/** - * @cmd 00c2 - */ -static u8 *aiStartCountdownTimer(u8 *cmd) -{ - countdownTimerSetRunning(true); - cmd += 2; - - return cmd; -} - -/** - * @cmd 00c4 - */ -static u8 *aiIfCountdownTimerLessThan(u8 *cmd) -{ - f32 value = cmd[3] | (cmd[2] << 8); - - if (countdownTimerGetValue60() < value * 60) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 00c5 - */ -static u8 *aiIfCountdownTimerGreaterThan(u8 *cmd) -{ - f32 value = cmd[3] | (cmd[2] << 8); - - if (countdownTimerGetValue60() > value * 60) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 00c6 - */ -static u8 *aiSpawnChrAtPad(u8 *cmd) -{ - struct bytelist *cmd2 = (struct bytelist *)(cmd); - u16 pad = cmd2->b4 << 8 | cmd2->b5; - u32 spawnflags = cmd2->b8 << 24 | cmd2->b9 << 16 | cmd2->b10 << 8 | cmd2->b11; - u16 ailistid = cmd2->b6 << 8 | cmd2->b7; - u8 *ailist = ailistFindById(ailistid); - - if (spawnflags); - - if (chrSpawnAtPad(g_Vars.chrdata, cmd2->b2, (s8)cmd2->b3, pad, ailist, spawnflags)) { - cmd = AILABEL(g_Vars.ailist, cmd2->b12, cmd2->b13); - } else { - cmd += 14; - } - - return cmd; -} - -/** - * @cmd 00c7 - */ -static u8 *aiSpawnChrAtChr(u8 *cmd) -{ - u32 spawnflags = (cmd[8] << 16) | (cmd[9] << 8) | cmd[10] | (cmd[7] << 24); - u16 ailistid = cmd[6] | (cmd[5] << 8); - u8 *ailist = ailistFindById(ailistid); - - if (chrSpawnAtChr(g_Vars.chrdata, cmd[2], (s8)cmd[3], cmd[4], ailist, spawnflags)) { - cmd = AILABEL(g_Vars.ailist, cmd[11], cmd[12]); - } else { - cmd += 13; - } - - return cmd; -} - -/** - * @cmd 00c8 - */ -static u8 *aiTryEquipWeapon(u8 *cmd) -{ - u32 flags = (cmd[6] << 16) | (cmd[7] << 8) | cmd[8] | (cmd[5] << 24); - u32 model = cmd[3] | (cmd[2] << 8); - struct prop *prop = NULL; - - if (g_Vars.chrdata && g_Vars.chrdata->prop && g_Vars.chrdata->model) { - // If the Marqis cheat is active, don't give guns to chrs, - // except where required for objectives. -#if VERSION < VERSION_NTSC_1_0 - // On NTSC beta, Marquis is disabled entirely on MBR, and the K7 guard - // on Investigation PA is excluded here (ie. is given his weapon). - if (cheatIsActive(CHEAT_MARQUIS) && g_Vars.stagenum != STAGE_MBR) { - if (g_Vars.stagenum == STAGE_INVESTIGATION - && lvGetDifficulty() == DIFF_PA - && cmd[4] == WEAPON_K7AVENGER) { - prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags); - } - } -#elif VERSION < VERSION_PAL_BETA - // NTSC final enables Marquis for MBR, but fails to realise why it was - // disabled in the first place (Cass needs to equip her Falcon). - // Additionally, NTSC Final changes the logic so the chrs are given - // their weapon but they cannot equip them. This means the K7 guard - // no longer needs to be handled. - if (cheatIsActive(CHEAT_MARQUIS)) { - flags &= ~OBJFLAG_WEAPON_LEFTHANDED; - flags |= OBJFLAG_WEAPON_AICANNOTUSE; - - prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags); - } -#else - // PAL fixes Cass on MBR by allowing her to equip her weapon - if (cheatIsActive(CHEAT_MARQUIS)) { - if (g_Vars.chrdata->bodynum != BODY_CASSANDRA || mainGetStageNum() != STAGE_MBR) { - flags &= ~OBJFLAG_WEAPON_LEFTHANDED; - flags |= OBJFLAG_WEAPON_AICANNOTUSE; - } - - prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags); - } -#endif - else if (cheatIsActive(CHEAT_ENEMYROCKETS)) { - switch (cmd[4]) { - case WEAPON_FALCON2: - case WEAPON_FALCON2_SILENCER: - case WEAPON_FALCON2_SCOPE: - case WEAPON_MAGSEC4: - case WEAPON_MAULER: - case WEAPON_PHOENIX: - case WEAPON_DY357MAGNUM: - case WEAPON_DY357LX: - case WEAPON_CMP150: - case WEAPON_CYCLONE: - case WEAPON_CALLISTO: - case WEAPON_RCP120: - case WEAPON_LAPTOPGUN: - case WEAPON_DRAGON: - case WEAPON_AR34: - case WEAPON_SUPERDRAGON: - case WEAPON_SHOTGUN: - case WEAPON_REAPER: - case WEAPON_SNIPERRIFLE: - case WEAPON_FARSIGHT: - case WEAPON_DEVASTATOR: - case WEAPON_ROCKETLAUNCHER: - case WEAPON_SLAYER: - case WEAPON_COMBATKNIFE: - case WEAPON_CROSSBOW: - case WEAPON_TRANQUILIZER: - case WEAPON_GRENADE: - case WEAPON_NBOMB: - case WEAPON_TIMEDMINE: - case WEAPON_PROXIMITYMINE: - case WEAPON_REMOTEMINE: - prop = chrGiveWeapon(g_Vars.chrdata, MODEL_CHRDYROCKET, WEAPON_ROCKETLAUNCHER, flags); - break; - case WEAPON_K7AVENGER: - if (g_Vars.stagenum == STAGE_INVESTIGATION && lvGetDifficulty() == DIFF_PA) { - prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags); - } else { - prop = chrGiveWeapon(g_Vars.chrdata, MODEL_CHRDYROCKET, WEAPON_ROCKETLAUNCHER, flags); - } - break; - default: - prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags); - break; - } - } else { - prop = chrGiveWeapon(g_Vars.chrdata, model, cmd[4], flags); - } - } - - if (prop) { - cmd = AILABEL(g_Vars.ailist, cmd[9], cmd[10]); - } else { - cmd += 11; - } - - return cmd; -} - -/** - * @cmd 00ca - */ -static u8 *aiDuplicateChr(u8 *cmd) -{ - u32 spawnflags = (cmd[6] << 16) | (cmd[7] << 8) | cmd[8] | (cmd[5] << 24); - u16 ailistid = cmd[4] | (cmd[3] << 8); - u8 *ailist = ailistFindById(ailistid); - bool pass = false; - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - struct chrdata *clone = NULL; - struct weaponobj *srcweapon1 = NULL; - struct prop *cloneprop = NULL; - struct weaponobj *srcweapon0 = NULL; - struct prop *srcweapon0prop = NULL; - struct prop *cloneweapon0prop = NULL; - struct prop *srcweapon1prop = NULL; - struct weaponobj *cloneweapon1 = NULL; - struct weaponobj *cloneweapon0 = NULL; - struct prop *cloneweapon1prop = NULL; - - if (chr && (chr->chrflags & CHRCFLAG_CLONEABLE)) { - cloneprop = chrSpawnAtChr(g_Vars.chrdata, chr->bodynum, -1, chr->chrnum, ailist, spawnflags); - - if (cloneprop) { - clone = cloneprop->chr; - chrSetChrnum(clone, chrsGetNextUnusedChrnum()); - chr->chrdup = clone->chrnum; - - srcweapon0prop = chrGetHeldProp(chr, 0); - - if (srcweapon0prop) { - srcweapon0 = srcweapon0prop->weapon; - cloneweapon0prop = chrGiveWeapon(clone, srcweapon0->base.modelnum, srcweapon0->weaponnum, 0); - - if (cloneweapon0prop) { - cloneweapon0 = cloneweapon0prop->weapon; - } - } - - srcweapon1prop = chrGetHeldProp(chr, 1); - - if (srcweapon1prop) { - srcweapon1 = srcweapon1prop->weapon; - cloneweapon1prop = chrGiveWeapon(clone, srcweapon1->base.modelnum, srcweapon1->weaponnum, OBJFLAG_WEAPON_LEFTHANDED); - - if (cloneweapon1prop) { - cloneweapon1 = cloneweapon1prop->weapon; - } - } - - if (srcweapon1 && srcweapon0 - && cloneweapon1 && cloneweapon0 - && srcweapon0 == srcweapon1->dualweapon && srcweapon1 == srcweapon0->dualweapon) { - propweaponSetDual(cloneweapon1, cloneweapon0); - } - - if (chr->weapons_held[2]) { - struct defaultobj *obj = chr->weapons_held[2]->obj; - hatCreateForChr(clone, obj->modelnum, 0); - } - - clone->flags = chr->flags; - clone->flags2 = chr->flags2; - clone->padpreset1 = chr->padpreset1; - - if (g_Vars.normmplayerisrunning == false - && g_MissionConfig.iscoop - && g_Vars.numaibuddies > 0) { - clone->flags |= CHRFLAG0_AIVSAI; - } - - if (spawnflags & SPAWNFLAG_HIDDEN) { - clone->chrflags &= CHRCFLAG_HIDDEN; - } - - clone->team = chr->team; - clone->squadron = chr->squadron; - clone->voicebox = chr->voicebox; - - rebuildTeams(); - rebuildSquadrons(); - - pass = true; - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[9], cmd[10]); - } else { - cmd += 11; - } - - return cmd; -} - -/** - * @cmd 00cb - */ -static u8 *aiShowHudmsg(u8 *cmd) -{ - char *text = langGet(cmd[4] | (cmd[3] << 8)); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = g_Vars.currentplayernum; - - if (chr && chr->prop && (chr->prop->type & 0xff) == PROPTYPE_PLAYER) { - playernum = playermgrGetPlayerNumByProp(chr->prop); - } - - setCurrentPlayerNum(playernum); - hudmsgCreate(text, HUDMSGTYPE_DEFAULT); - setCurrentPlayerNum(prevplayernum); - - cmd += 5; - - return cmd; -} - -/** - * @cmd 01a4 - */ -static u8 *aiShowHudmsgMiddle(u8 *cmd) -{ - if (cmd[2] == 0) { - u32 text_id = cmd[5] | (cmd[4] << 8); - char *text = langGet(text_id); - hudmsgCreateWithColour(text, HUDMSGTYPE_7, cmd[3]); - } else if (cmd[2] == 1) { - u32 text_id = cmd[5] | (cmd[4] << 8); - char *text = langGet(text_id); - hudmsgCreateWithColour(text, HUDMSGTYPE_8, cmd[3]); - } else { - hudmsgRemoveAll(); - } - - cmd += 6; - - return cmd; -} - -/** - * @cmd 00cc - */ -static u8 *aiShowHudmsgTopMiddle(u8 *cmd) -{ - char *text = langGet(cmd[4] | (cmd[3] << 8)); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = g_Vars.currentplayernum; - - if (chr && chr->prop && (chr->prop->type & 0xff) == PROPTYPE_PLAYER) { - playernum = playermgrGetPlayerNumByProp(chr->prop); - } - - setCurrentPlayerNum(playernum); - hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[5]); - setCurrentPlayerNum(prevplayernum); - - cmd += 6; - - return cmd; -} - -/** - * @cmd 00cd - */ -static u8 *aiSpeak(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - s16 audio_id = cmd[6] | (cmd[5] << 8); - s16 text_id = cmd[4] | (cmd[3] << 8); - s32 prevplayernum = g_Vars.currentplayernum; - s32 playernum = prevplayernum; - u32 channelnum; - char *text = text_id >= 0 ? langGet(cmd[4] | (cmd[3] << 8)) : NULL; - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - playernum = playermgrGetPlayerNumByProp(chr->prop); - } - - setCurrentPlayerNum(playernum); - - if (text && cmd[2] != CHR_P1P2) { - func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); - } - - if (cmd[2] == CHR_P1P2) { - channelnum = audioPlayFromProp((s8)cmd[7], audio_id, 0, g_Vars.chrdata->prop, 0, 512); - } else { - channelnum = audioPlayFromProp((s8)cmd[7], audio_id, 0, g_Vars.chrdata->prop, 9, 512); - } - - if (text && !sndIsFiltered(audio_id)) { - hudmsgCreateAsSubtitle(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[8], channelnum); - } - - setCurrentPlayerNum(prevplayernum); - - cmd += 9; - - return cmd; -} - -/** - * @cmd 00ce - */ -static u8 *aiPlaySound(u8 *cmd) -{ - s16 audio_id = cmd[3] | (cmd[2] << 8); - - audioPlayFromProp((s8)cmd[4], audio_id, 0, NULL, 0, 0); - - cmd += 5; - - return cmd; -} - -/** - * @cmd 017c - */ -static u8 *aiAssignSound(u8 *cmd) -{ - s16 audio_id = cmd[3] | (cmd[2] << 8); - - audioPlayFromProp((s8)cmd[4], audio_id, -1, NULL, 11, 0); - - cmd += 5; - - return cmd; -} - -/** - * @cmd 00d3 - */ -static u8 *aiAudioMuteChannel(u8 *cmd) -{ - s8 channel = (s8)cmd[2]; - - audioMuteChannel(channel); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0138 - */ -static u8 *aiIfChannelIdle(u8 *cmd) -{ - s8 channel = (s8) cmd[2]; - - if (audioIsChannelIdle(channel)) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 00cf - */ -static u8 *ai00cf(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - u16 thing = cmd[5] | (cmd[4] << 8); - - if (obj && obj->prop) { - audioPlayFromProp2((s8)cmd[2], -1, -1, obj->prop, thing, 2500, 3000, 0); - } - - cmd += 6; - - return cmd; -} - -/** - * @cmd 016b - */ -static u8 *ai016b(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - u16 thing1 = cmd[5] | (cmd[4] << 8); - u16 thing2 = cmd[7] | (cmd[6] << 8); - u16 thing3 = cmd[9] | (cmd[8] << 8); - - if (obj && obj->prop) { - s32 thing1again; - - if (thing1 == 0) { - thing1again = -1; - } else { - thing1again = thing1; - } - - audioPlayFromProp2((s8)cmd[2], -1, -1, obj->prop, thing1again, thing2, thing3, 2); - } - - cmd += 10; - - return cmd; -} - -/** - * @cmd 0179 - */ -static u8 *ai0179(u8 *cmd) -{ - u16 thing1 = cmd[5] | (cmd[4] << 8); - u16 thing2 = cmd[7] | (cmd[6] << 8); - u16 thing3 = cmd[9] | (cmd[8] << 8); - - if (cmd[10] == 0) { - struct defaultobj *obj = objFindByTagId(cmd[3]); - - if (obj && obj->prop) { - audioPlayFromProp2((s8)cmd[2], -1, -1, obj->prop, thing1, thing2, thing3, 0); - } - } else { - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[3]); - - if (chr && chr->prop) { - audioPlayFromProp2((s8)cmd[2], -1, -1, chr->prop, thing1, thing2, thing3, 0); - } - } - - cmd += 11; - - return cmd; -} - -/** - * @cmd 00d0 - */ -static u8 *ai00d0(u8 *cmd) -{ - s16 padnum = cmd[4] | (cmd[3] << 8); - s16 sound = cmd[6] | (cmd[5] << 8); - - propsnd0f0939f8(0, NULL, sound, padnum, -1, 2, 0, 0, 0, -1, 0, -1, -1, -1, -1); - - cmd += 7; - - return cmd; -} - -/** - * @cmd 00d5 - */ -static u8 *aiHovercarBeginPath(u8 *cmd) -{ - struct path *path = pathFindById(cmd[2]); - - if (g_Vars.truck) { - g_Vars.truck->path = path; - g_Vars.truck->nextstep = 0; - } - - if (g_Vars.hovercar) { - struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar); - g_Vars.hovercar->path = path; - g_Vars.hovercar->nextstep = 0; - g_Vars.hovercar->path->flags |= PATHFLAG_INUSE; - - if (chopper) { - chopper->targetvisible = false; - chopper->attackmode = CHOPPERMODE_PATROL; - chopper->turnrot60 = 0; - chopper->roty = 0; - chopper->rotx = 0; - chopper->gunroty = 0; - chopper->gunrotx = 0; - chopper->barrelrot = 0; - chopper->barrelrotspeed = 0; - chopper->vz = 0; - chopper->vy = 0; - chopper->vx = 0; - chopper->otz = 0; - chopper->oty = 0; - chopper->otx = 0; - chopper->power = 0; - chopper->bob = 0; - chopper->bobstrength = 0.05; - chopper->timer60 = 0; - chopper->patroltimer60 = 0; - chopper->cw = 0; - chopper->weaponsarmed = true; - chopper->base.flags |= OBJFLAG_20000000; - } else { - g_Vars.hovercar->weaponsarmed = false; - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 00d6 - */ -static u8 *aiSetVehicleSpeed(u8 *cmd) -{ - f32 speedtime = cmd[5] | (cmd[4] << 8); - f32 speedaim = (cmd[3] | (cmd[2] << 8)) * 100.0f / 15360.0f; - - if (g_Vars.truck) { - g_Vars.truck->speedaim = speedaim; - g_Vars.truck->speedtime60 = speedtime; - } - - if (g_Vars.hovercar) { - g_Vars.hovercar->speedaim = speedaim; - g_Vars.hovercar->speedtime60 = speedtime; - } - - cmd += 6; - - return cmd; -} - -/** - * @cmd 00d7 - */ -static u8 *aiSetRotorSpeed(u8 *cmd) -{ - f32 speedtime = cmd[5] | (cmd[4] << 8); - f32 speedaim = (cmd[3] | (cmd[2] << 8)) * M_BADTAU / 3600; - - if (g_Vars.heli) { - g_Vars.heli->rotoryspeedaim = speedaim; - g_Vars.heli->rotoryspeedtime = speedtime; - } - - cmd += 6; - - return cmd; -} - -/** - * @cmd 00da - */ -static u8 *aiSetObjImage(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - if (obj->type == OBJTYPE_SINGLEMONITOR) { - struct singlemonitorobj *sm = (struct singlemonitorobj *) obj; - tvscreenSetImageByNum(&sm->screen, cmd[4]); - } else if (obj->type == OBJTYPE_MULTIMONITOR) { - u8 slot = cmd[3]; - if (slot < 4) { - struct multimonitorobj *mm = (struct multimonitorobj *) obj; - tvscreenSetImageByNum(&mm->screens[slot], cmd[4]); - } - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 00dc - */ -static u8 *aiEndLevel(u8 *cmd) -{ - if (debugAllowEndLevel()) { - if (g_IsTitleDemo) { - mainChangeToStage(STAGE_TITLE); - } else if (g_Vars.autocutplaying) { - g_Vars.autocutfinished = true; - } else { - func0000e990(); - } - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 00dd - */ -static u8 *ai00dd(u8 *cmd) -{ - playerEndCutscene(); - cmd += 2; - return cmd; -} - -/** - * @cmd 00de - */ -static u8 *aiWarpJoToPad(u8 *cmd) -{ - u16 pad_id = cmd[3] | (cmd[2] << 8); - playerPrepareWarpType1(pad_id); - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0111 - */ -static u8 *aiSetCameraAnimation(u8 *cmd) -{ - s16 anim_id = cmd[3] | (cmd[2] << 8); - - playerStartCutscene(anim_id); - - if (g_Vars.currentplayer->haschrbody == false) { - return NULL; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0113 - */ -static u8 *aiIfInCutscene(u8 *cmd) -{ - if (g_Vars.in_cutscene) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0174 - */ -static u8 *aiIfCutsceneButtonPressed(u8 *cmd) -{ - if ((g_Vars.in_cutscene && g_CutsceneSkipRequested) || - (g_Vars.stagenum == STAGE_CITRAINING && var80087260 > 0)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0175 - */ -static u8 *ai0175(u8 *cmd) -{ - playerReorientForCutsceneStop(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0112 - */ -static u8 *aiObjectDoAnimation(u8 *cmd) -{ - s16 anim_id = cmd[3] | (cmd[2] << 8); - struct defaultobj *obj = NULL; - f32 thing; - s32 startframe = cmd[7] | (cmd[6] << 8); - f32 fstartframe; - - if (startframe == 0xffff) { - fstartframe = 0; - } else if (startframe == 0xfffe) { - fstartframe = animGetNumFrames(anim_id) - 2; - - if (fstartframe < 0) { - fstartframe = 0; - } - } else { - fstartframe = startframe; - } - - if (cmd[4] == 255) { - if (g_Vars.chrdata && g_Vars.chrdata->myspecial >= 0) { - obj = objFindByTagId(g_Vars.chrdata->myspecial); - } - } else { - obj = objFindByTagId(cmd[4]); - } - - if (obj && obj->prop) { - struct anim *anim = obj->model->anim; - - if (obj->model->anim == NULL) { - obj->model->anim = modelmgrInstantiateAnim(); - } - - if (obj->model->anim) { - thing = 1.0f / (s32)cmd[5]; - - if (g_Vars.in_cutscene && startframe != 0xfffe) { -#if PAL - fstartframe += var8009e388pf * thing; -#else - fstartframe += g_CutsceneFrameOverrun240 * thing * 0.25f; -#endif - } - - animInit(obj->model->anim); -#if VERSION >= VERSION_JPN_FINAL - modelSetAnimPlaySpeed(obj->model, 1, 0); -#elif VERSION >= VERSION_PAL_BETA - modelSetAnimPlaySpeed(obj->model, 1.2, 0); -#endif - modelSetAnimation(obj->model, anim_id, 0, fstartframe, thing, 0); - modelSetAnimScale(obj->model, func0f15c888() * obj->model->scale * 100.0f); - } - } - - cmd += 8; - - return cmd; -} - -/** - * @cmd 0114 - */ -static u8 *aiEnableChr(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->model) { - propActivate(chr->prop); - propEnable(chr->prop); - chr0f0220ac(chr); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0115 - */ -static u8 *aiDisableChr(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->model) { - propDeregisterRooms(chr->prop); - propDelist(chr->prop); - propDisable(chr->prop); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0116 - */ -static u8 *aiEnableObj(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->model) { - propActivate(obj->prop); - propEnable(obj->prop); - - if (g_Vars.currentplayer->eyespy == NULL && obj->type == OBJTYPE_WEAPON) { - struct weaponobj *weapon = (struct weaponobj *) obj; - - if (weapon->weaponnum == WEAPON_EYESPY) { - playerInitEyespy(); - } - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0117 - */ -static u8 *aiDisableObj(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->model) { -#if VERSION >= VERSION_PAL_FINAL - if (g_Vars.autocutplaying - && mainGetStageNum() == STAGE_AIRFORCEONE - && (obj->modelnum == MODEL_AIRFORCE1 || obj->modelnum == MODEL_SK_SHUTTLE)) { - // ignore - } else { - if (obj->prop->parent) { - objDetach(obj->prop); - } else { - propDeregisterRooms(obj->prop); - propDelist(obj->prop); - propDisable(obj->prop); - } - } -#else - if (obj->prop->parent) { - objDetach(obj->prop); - } else { - propDeregisterRooms(obj->prop); - propDelist(obj->prop); - propDisable(obj->prop); - } -#endif - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 00e0 - */ -static u8 *aiRevokeControl(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - bgunSetSightVisible(GUNSIGHTREASON_NOCONTROL, false); - bgunSetGunAmmoVisible(GUNAMMOREASON_NOCONTROL, false); - - if ((cmd[3] & 2) == 0) { - hudmsgsSetOff(HUDMSGREASON_NOCONTROL); - } - - if ((cmd[3] & 4) == 0) { - countdownTimerSetVisible(COUNTDOWNTIMERREASON_NOCONTROL, false); - } - - g_PlayersWithControl[g_Vars.currentplayernum] = false; - setCurrentPlayerNum(prevplayernum); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 00e1 - */ -static u8 *aiGrantControl(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - setCurrentPlayerNum(playermgrGetPlayerNumByProp(chr->prop)); - bgunSetSightVisible(GUNSIGHTREASON_NOCONTROL, true); - bgunSetGunAmmoVisible(GUNAMMOREASON_NOCONTROL, true); - hudmsgsSetOn(HUDMSGREASON_NOCONTROL); - countdownTimerSetVisible(COUNTDOWNTIMERREASON_NOCONTROL, true); - g_PlayersWithControl[g_Vars.currentplayernum] = true; - setCurrentPlayerNum(prevplayernum); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 00e2 - */ -static u8 *aiChrMoveToPad(u8 *cmd) -{ -#if VERSION < VERSION_NTSC_1_0 - s32 padnum = cmd[4] | (cmd[3] << 8); -#endif - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool pass = false; - f32 theta; - struct pad *pad; - s16 rooms[2]; - struct chrdata *chr2; - - if (chr && chr->prop) { - if (cmd[5] == 88) { - chr2 = chrFindById(g_Vars.chrdata, cmd[4]); - - if (chr2 && chr2->prop) { - theta = chrGetInverseTheta(chr2); - pass = chrMoveToPos(chr, &chr2->prop->pos, chr2->prop->rooms, theta, 0); - } - } else { - s32 padnum = cmd[4] | (cmd[3] << 8); - padnum = chrResolvePadId(chr, padnum); - - if (padnum >= 0) { - pad = &g_Pads[padnum]; - theta = atan2f(pad->look.x, pad->look.z); - - rooms[0] = pad->room; - rooms[1] = -1; - pass = chrMoveToPos(chr, &pad->pos, rooms, theta, cmd[5]); - } - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 00e8 - */ -static u8 *aiSetDoorOpen(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - struct doorobj *door = (struct doorobj *) obj; - door->frac = door->maxfrac; - door->fracspeed = 0; - door->lastopen60 = g_Vars.lvframe60; - door->mode = 0; - doorUpdateTiles(door); - doorActivatePortal(door); - func0f0926bc(door->base.prop, 1, 0xffff); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 00ea - */ -static u8 *aiIfNumPlayersLessThan(u8 *cmd) -{ - if ((s8)cmd[2] > PLAYERCOUNT()) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 00eb - */ -static u8 *aiIfChrAmmoQuantityLessThan(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool passes = false; - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - - if (bgunGetAmmoCount((s8)cmd[3]) < (s8)cmd[4]) { - passes = true; - } - - setCurrentPlayerNum(prevplayernum); - } - - if (passes) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 00ec - */ -static u8 *aiChrDrawWeapon(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - bgunEquipWeapon2(0, (s8)cmd[3]); - bgunEquipWeapon2(1, 0); - setCurrentPlayerNum(prevplayernum); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 00ed - */ -static u8 *aiChrDrawWeaponInCutscene(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - bgunEquipWeapon((s8)cmd[3]); - setCurrentPlayerNum(prevplayernum); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 00ef - */ -static u8 *aiIfObjInRoom(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - u16 room_id = cmd[4] | (cmd[3] << 8); - s32 room_something = chrGetPadRoom(g_Vars.chrdata, room_id); - - if (room_something >= 0 && obj && obj->prop && room_something == obj->prop->rooms[0]) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 00f3 - */ -static u8 *aiChrSetInvincible(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - g_PlayerInvincible = true; - setCurrentPlayerNum(prevplayernum); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 00f7 - */ -static u8 *aiIfAllObjectivesComplete(u8 *cmd) -{ - if (objectiveIsAllComplete()) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd = cmd + 4; - } - - return cmd; -} - -/** - * @cmd 00f9 - */ -static u8 *aiPlayXTrack(u8 *cmd) -{ - musicSetXReason((s8)cmd[2], cmd[3], cmd[4]); - cmd += 5; - - return cmd; -} - -/** - * @cmd 00fa - */ -static u8 *aiStopXTrack(u8 *cmd) -{ - musicUnsetXReason((s8)cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 015b - */ -static u8 *aiPlayTrackIsolated(u8 *cmd) -{ - if (cmd[2] == MUSIC_CI_TRAINING) { - u16 volume = optionsGetMusicVolume(); - musicPlayTrackIsolated(cmd[2]); - optionsSetMusicVolume(volume); - } else { - musicPlayTrackIsolated(cmd[2]); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 015c - */ -static u8 *aiPlayDefaultTracks(u8 *cmd) -{ - cmd += 2; - musicPlayDefaultTracks(); - - return cmd; -} - -/** - * @cmd 017d - */ -static u8 *aiPlayCutsceneTrack(u8 *cmd) -{ - musicStartCutscene(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 017e - */ -static u8 *aiStopCutsceneTrack(u8 *cmd) -{ - musicEndCutscene(); - cmd += 2; - - return cmd; -} - -/** - * @cmd 017f - */ -static u8 *aiPlayTemporaryTrack(u8 *cmd) -{ - musicStartTemporaryAmbient(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0180 - */ -static u8 *aiStopAmbientTrack(u8 *cmd) -{ - musicEndTemporaryAmbient(); - cmd += 2; - - return cmd; -} - -/** - * @cmd 00fb - */ -static u8 *aiChrExplosions(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - playerSurroundWithExplosions(0); - setCurrentPlayerNum(prevplayernum); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 00fc - */ -static u8 *aiIfKillCountGreaterThan(u8 *cmd) -{ - if (g_Vars.killcount > cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 01ab - */ -static u8 *aiIfNumKnockedOutChrs(u8 *cmd) -{ - if (cmd[2] < mpstatsGetTotalKnockoutCount() && cmd[3] == 0) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else if (mpstatsGetTotalKnockoutCount() < cmd[2] && cmd[3] == 1) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0102 - */ -static u8 *aiSetLights(u8 *cmd) -{ - u16 padnum = cmd[3] | (cmd[2] << 8); - s32 roomnum = chrGetPadRoom(g_Vars.chrdata, padnum); - - if (roomnum >= 0) { - switch (cmd[4]) { - case LIGHTOP_TURNOFF: - roomSetLightsOn(roomnum, false); - break; - case LIGHTOP_TURNON: - roomSetLightsOn(roomnum, true); - break; - default: - roomSetLighting(roomnum, cmd[4], cmd[5], cmd[6], TICKS(cmd[7])); - } - } - - cmd += 11; - - return cmd; -} - -/** - * @cmd 0106 - */ -static u8 *aiSetTarget(u8 *cmd) -{ - if (g_Vars.chrdata) { - s16 prop_id; - - if (!cmd[3] && !cmd[4]) { - prop_id = propGetIndexByChrId(g_Vars.chrdata, cmd[2]); - } else if (!cmd[4]) { - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - prop_id = chr->target; - } - - if (prop_id != g_Vars.chrdata->target) { - g_Vars.chrdata->lastvisibletarget60 = 0; - g_Vars.chrdata->lastseetarget60 = 0; - g_Vars.chrdata->lastheartarget60 = 0; - g_Vars.chrdata->hidden &= ~CHRHFLAG_IS_HEARING_TARGET; - g_Vars.chrdata->chrflags &= ~CHRCFLAG_NEAR_MISS; - g_Vars.chrdata->target = prop_id; - } - } else if (g_Vars.hovercar) { - chopperSetTarget(g_Vars.hovercar, cmd[2]); - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 0107 - */ -static u8 *aiIfPresetsTargetIsNotMyTarget(u8 *cmd) -{ - s32 mypresetchrstarget; - - if (g_Vars.chrdata->chrpreset1 != -1) { - mypresetchrstarget = propGetIndexByChrId(g_Vars.chrdata, g_Vars.chrdata->chrpreset1); - } - - if (g_Vars.chrdata->target != -1 && mypresetchrstarget != g_Vars.chrdata->target) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0108 - */ -static u8 *aiIfChrTarget(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - bool pass = false; - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - // empty - } else if (cmd[2] != CHR_BOND) { - if (cmd[4] == 0) { - struct chrdata *chr2 = chrFindById(g_Vars.chrdata, cmd[3]); - - if (chr2 && chr2->prop && chrGetTargetProp(chr) == chr2->prop) { - pass = true; - } - } else { - if (chr->target != -1 && chr && chr->prop) { - pass = true; - } - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 010b - */ -static u8 *aiChrSetTeam(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->team = cmd[3]; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 011f - */ -static u8 *aiIfSkedar(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && CHRRACE(chr) == RACE_SKEDAR) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0120 - */ -static u8 *aiIfSafety2LessThan(u8 *cmd) -{ - u8 score; - u8 numnearby; - s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team); - - score = 6; - numnearby = 0; - - if (chrGetNumArghs(g_Vars.chrdata) > 0) { - score -= 2; - } - - switch (bgunGetWeaponNum(HAND_RIGHT)) { - case WEAPON_FALCON2: - case WEAPON_FALCON2_SILENCER: - case WEAPON_FALCON2_SCOPE: - case WEAPON_MAGSEC4: - case WEAPON_MAULER: - case WEAPON_PHOENIX: - case WEAPON_DY357MAGNUM: - case WEAPON_DY357LX: - case WEAPON_CROSSBOW: - break; - case WEAPON_CMP150: - case WEAPON_CYCLONE: - case WEAPON_CALLISTO: - case WEAPON_RCP120: - case WEAPON_LAPTOPGUN: - case WEAPON_DRAGON: - case WEAPON_K7AVENGER: - case WEAPON_AR34: - case WEAPON_SUPERDRAGON: - case WEAPON_SHOTGUN: - case WEAPON_SNIPERRIFLE: - score--; - break; - case WEAPON_REAPER: - case WEAPON_FARSIGHT: - case WEAPON_DEVASTATOR: - case WEAPON_ROCKETLAUNCHER: - case WEAPON_SLAYER: - score -= 2; - break; - default: - score++; - break; - } - - while (*chrnums != -2) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && chr->model - && !chrIsDead(chr) - && chr->actiontype != ACT_DEAD - && chr->alertness > 100 - && g_Vars.chrdata->squadron == chr->squadron - && g_Vars.chrdata->chrnum != chr->chrnum - && chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) { - numnearby++; - } - - chrnums++; - } - - if (numnearby == 0) { - score -= 2; - } else if (numnearby == 1) { - score--; - } - - if (score < 3 && numnearby != 0) { - score = 3; - } - - if (score < cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0121 - */ -static u8 *aiFindCover(u8 *cmd) -{ - u16 criteria = cmd[3] | (cmd[2] << 8); - - if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, 0) != -1) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0124 - */ -static u8 *aiGoToCover(u8 *cmd) -{ - chrGoToCover(g_Vars.chrdata, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0125 - */ -static u8 *aiCheckCoverOutOfSight(u8 *cmd) -{ - if (chrCheckCoverOutOfSight(g_Vars.chrdata, g_Vars.chrdata->cover, false)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0126 - */ -static u8 *aiIfPlayerUsingCmpOrAr34(u8 *cmd) -{ - u32 hand = HAND_RIGHT; - - switch (bgunGetWeaponNum(hand)) { - case WEAPON_CMP150: - case WEAPON_AR34: - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - break; - default: - cmd += 4; - break; - } - - return cmd; -} - -/** - * @cmd 0127 - */ -static u8 *aiDetectEnemyOnSameFloor(u8 *cmd) -{ \ - s32 team = 0; - f32 closestdist = 9999.9; - f32 distance; - u32 stack[2]; - f32 y; - f32 scandist; - s16 *chrnums = teamGetChrIds(1); - struct chrdata *chr; - s16 newtarget = -1; - - if (g_Vars.chrdata->teamscandist == 0) { - scandist = 1500; - } else if (g_Vars.chrdata->teamscandist == 255) { - scandist = 9999; - } else { - scandist = g_Vars.chrdata->teamscandist * 40.0f; - } - - y = g_Vars.chrdata->prop->pos.y; - - while (team < 8) { - chr = chrFindByLiteralId(*chrnums); - - if (*chrnums != -2) { - if (chr && chr->prop - && chr->team != TEAM_NONCOMBAT - && !chrIsDead(chr) - && chr->actiontype != ACT_DEAD - && chr->actiontype != ACT_DRUGGEDKO - && chr->actiontype != ACT_DRUGGEDDROP - && chr->actiontype != ACT_DRUGGEDCOMINGUP - && chrCompareTeams(g_Vars.chrdata, chr, COMPARE_ENEMIES) - && (chr->hidden & CHRHFLAG_CLOAKED) == 0 - && (chr->chrflags & CHRCFLAG_HIDDEN) == 0 - && (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0 - && y - chr->prop->pos.y > -200 - && y - chr->prop->pos.y < 200 - && ((g_Vars.chrdata->hidden & CHRHFLAG_PSYCHOSISED) == 0 - || (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0 - || (chr->hidden & CHRHFLAG_DONTSHOOTME)) - && g_Vars.chrdata->chrnum != chr->chrnum) { - distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum); - - if (distance < closestdist) { - if (distance < scandist || stageGetIndex(g_Vars.stagenum) == STAGEINDEX_MAIANSOS) { - if (distance < closestdist) { - closestdist = distance; - newtarget = chr->chrnum; - } - } - } - } - - chrnums++; - } else { - chrnums++; - team++; - } - } - - if (newtarget != -1) { - g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, newtarget); - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd = cmd + 4; - } - - return cmd; -} - -/** - * @cmd 0128 - */ -static u8 *aiDetectEnemy(u8 *cmd) -{ - s16 *chrnums; - s32 team = 0; - u32 stack[4]; - f32 closestdist = 10000000; - f32 maxdist = (s32)cmd[2] * 10.0f; - s16 closesttarg = -1; - - chrnums = teamGetChrIds(1); - - if (!g_Vars.chrdata) { - cmd = cmd + 5; - return cmd; - } - - /** - * Iterate all the chrs in team order. Generally the outer loop iterates the - * teams and the inner loop iterates the chrs within that team, but for the - * chr's current team the inner loop won't iterate so the outer loop handles - * it. - * - * The chrnums list returned by teamGetChrIds is an array of chrnums in - * team 1 terminated by a -2, then an array of chrnums in team 2 terminated - * by -2, and so on. - */ - do { - u8 teamvalue = (1 << team); - - while (*chrnums != -2 && g_Vars.chrdata->team != teamvalue) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && chr->prop - && !chrIsDead(chr) - && chr->actiontype != ACT_DEAD - && chr->actiontype != ACT_DIE - && chr->actiontype != ACT_DRUGGEDKO - && chr->actiontype != ACT_DRUGGEDDROP - && chr->actiontype != ACT_DRUGGEDCOMINGUP - && chrCompareTeams(g_Vars.chrdata, chr, COMPARE_ENEMIES) - && chr != g_Vars.chrdata - && (chr->hidden & CHRHFLAG_CLOAKED) == 0 - && (chr->chrflags & CHRCFLAG_HIDDEN) == 0 - && (chr->hidden & CHRHFLAG_DISGUISED) == 0 - && chr->team != TEAM_NONCOMBAT - && ( - (g_Vars.chrdata->hidden & CHRHFLAG_PSYCHOSISED) == 0 - || (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0 - || (chr->hidden & CHRHFLAG_DONTSHOOTME))) { - f32 distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum); - - if (distance < maxdist && distance != 0 && distance < closestdist - && chrCanSeeProp(g_Vars.chrdata, chr->prop) - && (chr->chrflags & CHRCFLAG_HIDDEN) == 0) { - if (g_Vars.chrdata->yvisang == 0) { - closestdist = distance; - closesttarg = chr->chrnum; - } else { - s16 prevtarget = g_Vars.chrdata->target; - g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum); - - if (chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang)) { - closestdist = distance; - closesttarg = chr->chrnum; - } - - g_Vars.chrdata->target = prevtarget; - } - } - } - - chrnums++; - } - - // If the inner loop was at the end of the current team, - // move to the next team - if (*chrnums == -2) { - team++; - } - - // And progress chrnums past the -2 terminator - chrnums++; - } while (team < 8); - - if (closesttarg != -1) { - g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, closesttarg); - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd = cmd + 5; - } - - return cmd; -} - -/** - * @cmd 012a - */ -static u8 *aiIfTargetMovingSlowly(u8 *cmd) -{ - s32 delta; - s32 absdelta; - - if (cmd[2] == 0) { - delta = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata); - } else { - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - delta = chrGetDistanceLostToTargetInLastSecond(chr); - } - - absdelta = delta > 0 ? delta : -delta; - - if (absdelta < 50) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 012b - */ -static u8 *aiIfTargetMovingCloser(u8 *cmd) -{ - if (chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata) < -50) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 012c - */ -static u8 *aiIfTargetMovingAway(u8 *cmd) -{ - if (chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata) > 50) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 012f - */ -static u8 *ai012f(u8 *cmd) -{ - if (g_Vars.chrdata->cover >= 0) { - coverSetInUse(g_Vars.chrdata->cover, 0); - } - - cmd += 2; - - return cmd; -} - -s16 g_GuardQuipBank[][4] = { - // Voicebox 0 - { QUIP_ATTACK1, SFX_M0_CLEAR_SHOT, SFX_M0_CLEAR_SHOT, SFX_M0_SHES_MINE }, - { QUIP_ATTACK2, SFX_M0_OPEN_FIRE, SFX_M0_WIPE_HER_OUT, SFX_M0_WASTE_HER }, - { QUIP_GOTOCOVER1, SFX_M0_COVER_ME, SFX_M0_WATCH_MY_BACK, SFX_M0_TAKE_COVER }, - { QUIP_GRENADE1, SFX_M0_M1_LOOK_OUT_LOOK_OUT, SFX_M0_M1_ITS_A_GRENADE, SFX_M0_M1_CLEAR_THE_AREA }, - { QUIP_RETREAT1, SFX_M0_GO_TO_PLAN_B, SFX_M0_GET_THE_HELL_OUT_OF_HERE, SFX_M0_RETREAT }, - { QUIP_GRENADE2, SFX_M0_CATCH, SFX_M0_EVERYBODY_DOWN, SFX_M0_GRENADE }, - { QUIP_RETREAT2, SFX_M0_FALL_BACK, SFX_M0_EVERYONE_BACK_OFF, SFX_M0_WITHDRAW }, - { QUIP_FLANK, SFX_M0_FLANK_THE_TARGET, SFX_M0_LETS_SPLIT_UP, SFX_M0_SURROUND_HER }, - { QUIP_SURRENDER, SFX_M0_DONT_SHOOT_ME, SFX_M0_I_GIVE_UP, SFX_M0_YOU_WIN_I_SURRENDER }, - { QUIP_HEARNOISE, SFX_M0_HEAR_THAT, SFX_M0_WHATS_THAT_NOISE, SFX_M0_HEARD_A_NOISE }, - { QUIP_10, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SEEPLAYER, SFX_M0_HEY_YOU, SFX_M0_INTRUDER_ALERT, SFX_M0_GOT_A_CONTACT }, -#if VERSION >= VERSION_NTSC_1_0 - { QUIP_SHOTUNALERT, SFX_M0_HOLY_SHH, SFX_M0_HOLY_SHH, SFX_M0_WHAT_THE_HELL }, -#else - { QUIP_SHOTUNALERT, SFX_80F6, SFX_80F6, SFX_M0_WHAT_THE_HELL }, -#endif - { QUIP_INJURED1, SFX_M0_MEDIC, SFX_M0_OW, SFX_M0_YOU_SHOT_ME }, - { QUIP_INJURED2, SFX_M0_IM_HIT, SFX_M0_IM_TAKING_FIRE, SFX_M0_TAKING_DAMAGE }, - { QUIP_KILLEDPLAYER1, SFX_M0_GRAB_A_BODY_BAG, SFX_M0_ONE_FOR_THE_MORGUE, SFX_M0_REST_IN_PEACE }, - { QUIP_WARNFRIENDS, SFX_M0_INTRUDER_ALERT2, SFX_M0_WEVE_GOT_TROUBLE, SFX_M0_WEVE_GOT_PROBLEMS }, - { QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SURPRISED, SFX_M0_WHAT_THE, SFX_M0_WHO_THE, SFX_M0_WHO_THE }, - { QUIP_INSPECTBODY, SFX_M0_ARE_YOU_OKAY, SFX_M0_GOT_A_MAN_DOWN, SFX_M0_HES_BOUGHT_IT }, - { QUIP_20, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_HITPLAYER, SFX_M0_GIVE_IT_UP, SFX_M0_SURRENDER_NOW, SFX_M0_TAKE_THAT }, - { QUIP_MISSEDPLAYER1, SFX_M0_DAMN_IT_MISSED, SFX_M0_DAMN_IT_MISSED, SFX_M0_HOW_DID_I_MISS }, - { QUIP_MISSEDPLAYER2, SFX_M0_GODS_SAKE_SOMEONE_HIT_HER, SFX_M0_GODS_SAKE_SOMEONE_HIT_HER, SFX_M0_SHES_A_TRICKY_ONE }, - { QUIP_GOTOCOVER2, SFX_M0_TAKE_COVER_028D, SFX_M0_ILL_COVER_YOU, SFX_M0_GET_DOWN }, - { QUIP_DIE, SFX_M0_YOU_BITCH, SFX_M0_OH_MY_GOD, SFX_M0_SHE_GOT_ME }, - { QUIP_26, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SEARCHSUCCESS, SFX_M0_I_SEE_HER, SFX_M0_THERE_SHE_IS, SFX_M0_THERE_MOVEMENT }, - { QUIP_SEEEYESPY, SFX_M0_WHAT_THE_HELL_8167, SFX_M0_HELLO_THERE, SFX_M0_WHATS_THIS }, - { QUIP_GREETING, SFX_M0_HOWS_THINGS, SFX_M0_HEY_THERE, SFX_M0_HI_HOW_ARE_YOU }, - { QUIP_ASKWEAPON1, MP3_M0_WHERE_DID_YOU_GET_THAT, MP3_M0_SHOULD_YOU_HAVE_THAT, MP3_M0_WHAT_ARE_YOU_DOING }, - { QUIP_ASKWEAPON2, SFX_0037, MP3_M0_DONT_POINT_THAT_AT_ME, MP3_M0_WATCH_WHERE_YOURE_POINTING }, - { QUIP_UNCOVERDISGUISE1, MP3_M0_IMPOSTER, MP3_M0_IMPOSTER, MP3_M0_ITS_A_SPY }, - { QUIP_LOSTGUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN }, - { QUIP_GOFORALARM, SFX_M0_TRIGGER_THE_ALARM, SFX_M0_TRIGGER_THE_ALARM, SFX_M0_TRIGGER_THE_ALARM }, - { QUIP_SEARCHFAIL, SFX_M0_IM_SURE_I_HEARD_A_NOISE, SFX_M0_IM_SURE_I_HEARD_A_NOISE, SFX_M0_HEARING_THINGS }, - { QUIP_ATTACK3, SFX_M0_CLEAR_SHOT, SFX_M0_CLEAR_SHOT, SFX_M0_OPEN_FIRE }, - { QUIP_ATTACK4, SFX_M0_CLEAR_SHOT, SFX_M0_OPEN_FIRE, SFX_M0_OPEN_FIRE }, - { QUIP_KILLEDPLAYER2, SFX_M0_GRAB_A_BODY_BAG, SFX_M0_ONE_FOR_THE_MORGUE, SFX_M0_REST_IN_PEACE }, - { QUIP_GUNJAMMED, SFX_M0_MY_GUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN }, - { QUIP_UNCOVEREDDISGUISE2, MP3_M0_ITS_A_SPY, MP3_M0_ITS_A_SPY, MP3_M0_ITS_A_SPY }, - // Voicebox 1 - { QUIP_ATTACK1, SFX_M1_LAST_MISTAKE, SFX_M1_WHAT_ARE_YOU_WAITING_FOR, SFX_M1_BRING_IT_ON }, - { QUIP_ATTACK2, SFX_M1_TAKE_HER_DOWN, SFX_M1_EVERYBODY_GET_HER, SFX_M1_ATTACK }, - { QUIP_GOTOCOVER1, SFX_M1_COVER_MY_ASS, SFX_M1_COVER_ME_NOW, SFX_M1_IM_GOING_FOR_COVER }, - { QUIP_GRENADE1, SFX_M0_M1_LOOK_OUT_LOOK_OUT, SFX_M0_M1_ITS_A_GRENADE, SFX_M0_M1_CLEAR_THE_AREA }, - { QUIP_RETREAT1, SFX_M1_SHES_TOO_GOOD_RUN, SFX_M1_GET_SOME_BACKUP, SFX_M1_EVACUATE_THE_AREA }, - { QUIP_GRENADE2, SFX_M1_CATCH_THIS, SFX_M1_HERE_KEEP_IT, SFX_M1_GRENADE }, - { QUIP_RETREAT2, SFX_M1_WITHDRAW, SFX_M1_FALL_BACK, SFX_M1_EVERYONE_GET_BACK }, - { QUIP_FLANK, SFX_M1_SURROUND_HER, SFX_M1_SPREAD_OUT, SFX_M1_SPLIT_UP }, - { QUIP_SURRENDER, SFX_M1_PLEASE_DONT, SFX_M1_DONT_SHOOT, SFX_M1_IM_ONLY_DOING_MY_JOB }, - { QUIP_HEARNOISE, SFX_M1_THAT_SOUNDED_LIKE, SFX_M1_GUNFIRE, SFX_M1_SOMEONES_SHOOTING }, - { QUIP_10, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SEEPLAYER, SFX_M1_COME_HERE, SFX_M1_THERES_SOMEONE_HERE, SFX_M1_GET_HER }, - { QUIP_SHOTUNALERT, SFX_M1_WHOA, SFX_M1_MY_GOD, SFX_M1_IS_THAT_A_BULLET }, - { QUIP_INJURED1, SFX_M1_OH_MY_GOD, SFX_M1_IM_HIT_IM_HIT, SFX_M1_IM_BLEEDING }, - { QUIP_INJURED2, SFX_M1_OH_GOD_IM_HIT, SFX_M1_HELP_ME_OUT, SFX_M1_IM_IN_TROUBLE }, - { QUIP_KILLEDPLAYER1, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_WARNFRIENDS, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT }, - { QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SURPRISED, SFX_M1_HOLY, SFX_M1_WHAT_THE_HELL, SFX_M1_WHA }, -#if VERSION >= VERSION_NTSC_1_0 - { QUIP_INSPECTBODY, SFX_M1_NOOO, SFX_M1_OH_GOD_HES_DEAD, SFX_M1_HES_GONE }, -#else - { QUIP_INSPECTBODY, SFX_0313, SFX_M1_NOOO, SFX_M1_HES_GONE }, -#endif - { QUIP_20, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT }, - { QUIP_HITPLAYER, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEAH_BABY, SFX_M1_YEAH_BABY }, - { QUIP_MISSEDPLAYER1, SFX_M1_BLOODY_STUPID_GUN, SFX_M1_MY_GUN_ITS_USELESS, SFX_M1_DAMN_IT }, - { QUIP_MISSEDPLAYER2, SFX_M1_STOP_DODGING, SFX_M1_SOMEONE_HIT_HER, SFX_M1_DAMN_SHES_GOOD }, - { QUIP_GOTOCOVER2, SFX_M1_GO_FOR_IT, SFX_M1_GO_GO_GO, SFX_M1_RUN }, -#if VERSION >= VERSION_NTSC_1_0 - { QUIP_DIE, SFX_M1_SCREAM, SFX_M1_WHY_ME, SFX_M1_CHOKING }, -#else - { QUIP_DIE, SFX_034C, SFX_M1_WHY_ME, SFX_M1_CHOKING }, -#endif - { QUIP_26, SFX_M1_OUTSTANDING, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEEHAH_GOT_ONE }, - { QUIP_SEARCHSUCCESS, SFX_M1_OVER_THERE, SFX_M1_HALT, SFX_M1_FREEZE }, - { QUIP_SEEEYESPY, SFX_M1_WHAT_IS_IT, SFX_M1_HOW_DID_THAT_GET_HERE, SFX_M1_DONT_TOUCH_IT }, - { QUIP_GREETING, SFX_M1_HI_THERE, SFX_M1_HI_THERE, SFX_M1_HOWS_THINGS }, - { QUIP_ASKWEAPON1, MP3_M1_WHERE_ARE_YOU_TAKING, MP3_M1_WHERE_ARE_YOU_TAKING, MP3_M1_GET_THAT_FIREARM_APPROVED }, - { QUIP_ASKWEAPON2, MP3_M1_WATCH_WHAT_YOURE_DOING, MP3_M1_WATCH_WHAT_YOURE_DOING, MP3_M1_BE_CAREFUL }, - { QUIP_UNCOVERDISGUISE1, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE, MP3_M1_DROP_THE_GUN }, - { QUIP_LOSTGUN, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ }, - { QUIP_GOFORALARM, SFX_M1_WARN_THE_OTHERS, SFX_M1_WARN_THE_OTHERS, SFX_M1_WARN_THE_OTHERS }, - { QUIP_SEARCHFAIL, SFX_M1_I_CANT_SEE_ANYBODY, SFX_M1_THERES_NO_ONE_HERE, SFX_M1_THERES_NO_ONE_HERE }, - { QUIP_ATTACK3, SFX_M1_LAST_MISTAKE, SFX_M1_WHAT_ARE_YOU_WAITING_FOR, SFX_M1_BRING_IT_ON }, - { QUIP_ATTACK4, SFX_M1_BRING_IT_ON, SFX_M1_ATTACK, SFX_M1_ATTACK }, - { QUIP_KILLEDPLAYER2, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEEHAH_GOT_ONE, SFX_M1_ANOTHER_ONE_BITES_THE_DUST }, - { QUIP_GUNJAMMED, SFX_M1_BLOODY_STUPID_GUN, SFX_M1_MY_GUN_ITS_USELESS, SFX_M1_DAMN_IT }, - { QUIP_UNCOVEREDDISGUISE2, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE }, - // Voicebox 2 - { QUIP_ATTACK1, SFX_M2_COME_ON_MAN2, SFX_M2_DIE, SFX_M2_TAKE_THIS }, - { QUIP_ATTACK2, SFX_M2_MOVE_IN, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE, SFX_M2_LET_HER_HAVE_IT }, - { QUIP_GOTOCOVER1, SFX_M2_HELP_ME_OUT_HERE, SFX_M2_HEY_DISTRACT_HER, SFX_M2_KEEP_HER_OCCUPIED }, - { QUIP_GRENADE1, SFX_M2_GET_BACK_QUICK, SFX_M2_WERE_GONNA_DIE, SFX_M2_GOD_RUN }, - { QUIP_RETREAT1, SFX_M2_RETREAT, SFX_M2_LETS_GET_THE_HELL_OUT_OF_HERE, SFX_M2_GET_BACK_GET_BACK }, - { QUIP_GRENADE2, SFX_M2_FIRE_IN_THE_HOLE, SFX_M2_HERES_A_LITTLE_PRESENT_FOR_YA, SFX_M2_TRY_THIS_FOR_SIZE }, - { QUIP_RETREAT2, SFX_M2_GET_OUT_OF_THE_WAY, SFX_M2_FALL_BACK, SFX_M2_MOVE_OUT }, - { QUIP_FLANK, SFX_M2_TEAM_UP_GUYS, SFX_M2_COME_ON_AROUND_THE_SIDE, SFX_M2_SCATTER }, - { QUIP_SURRENDER, SFX_M2_I_DONT_LIKE_THIS_ANY_MORE, SFX_M2_DONT_HURT_ME, SFX_M2_YOU_WIN_I_GIVE_UP }, - { QUIP_HEARNOISE, SFX_M2_LISTEN_GUNSHOTS, SFX_M2_LISTEN_GUNSHOTS, SFX_M2_SOMEONES_NEARBY }, - { QUIP_10, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SEEPLAYER, SFX_M2_TARGET_SIGHTED, SFX_M2_COME_ON_MAN, SFX_M2_GOD_DAMN_IT }, - { QUIP_SHOTUNALERT, SFX_M2_THAT_WAS_CLOSE, SFX_M2_HOLY_MOLY, SFX_M2_AY_CARAMBA }, - { QUIP_INJURED1, SFX_M2_GEEZ_THAT_HURT, SFX_M2_WHY_YOU, SFX_M2_WHY_YOU }, - { QUIP_INJURED2, SFX_M2_IM_INJURED, SFX_M2_IM_HIT_IM_HIT, SFX_M2_DAMN_IT_IM_TAKING_FIRE }, - { QUIP_KILLEDPLAYER1, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_WARNFRIENDS, SFX_M2_WATCH_OUT, SFX_M2_HELP_ME_OUT, SFX_M2_WEVE_GOT_AN_INTRUDER }, - { QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 }, - { QUIP_SURPRISED, SFX_M2_HOW_THE, SFX_M2_HEY, SFX_M2_STOP }, - { QUIP_INSPECTBODY, SFX_M2_BODY_COUNTS_TOO_HIGH, SFX_M2_I_NEVER_LIKED_HIM_ANYWAY, SFX_M2_THAT_WAS_MY_BEST_FRIEND }, - { QUIP_20, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT }, - { QUIP_HITPLAYER, SFX_M2_SURRENDER_OR_DIE, SFX_M2_I_HAVE_YOU_NOW, SFX_M2_YOU_WANT_BEAT_ME }, - { QUIP_MISSEDPLAYER1, SFX_M2_DAMN_MISSED_AGAIN, SFX_M2_I_DONT_BELIEVE_IT, SFX_M2_DAMN_YOU }, - { QUIP_MISSEDPLAYER2, SFX_M2_HELL_SHES_GOOD, SFX_M2_STOP_MOVING, SFX_M2_NO_ESCAPE_FOR_YOU }, - { QUIP_GOTOCOVER2, SFX_M2_MOVE_IT_MOVE_IT, SFX_M2_GET_TO_COVER_NOW, SFX_M2_RUN_FOR_IT }, -#if VERSION >= VERSION_NTSC_1_0 - { QUIP_DIE, SFX_M2_NOOO, SFX_M2_OH_GOD_IM_DYING, SFX_M2_I_DONT_WANT_TO_DIE }, -#else - { QUIP_DIE, SFX_0411, SFX_M2_OH_GOD_IM_DYING, SFX_M2_I_DONT_WANT_TO_DIE }, -#endif - { QUIP_26, SFX_M2_IM_THE_MAN, SFX_M2_BOY_THAT_WAS_CLOSE, SFX_M2_DID_YOU_SEE_THAT }, - { QUIP_SEARCHSUCCESS, SFX_M2_GET_HER, SFX_M2_THERE_ATTACK, SFX_M2_HEY_YOU_STOP }, - { QUIP_SEEEYESPY, SFX_M2_IS_IT_DANGEROUS, SFX_M2_DONT_MOVE, SFX_M2_STAY_BACK }, - { QUIP_GREETING, SFX_M2_HELLO, SFX_M2_HELLO, SFX_M2_HEY_WHATS_UP }, - { QUIP_ASKWEAPON1, MP3_M2_DO_YOU_HAVE_PERMISSION_FOR_THAT, MP3_M2_DO_YOU_HAVE_PERMISSION_FOR_THAT, MP3_M2_WHAT_ARE_YOU_DOING }, - { QUIP_ASKWEAPON2, MP3_M2_HEY_THATS_DANGEROUS, MP3_M2_HEY_THATS_DANGEROUS, MP3_M2_WATCH_IT_THAT_THING_COULD_GO_OFF }, - { QUIP_UNCOVERDISGUISE1, MP3_M2_PUT_YOUR_HANDS_UP, MP3_M2_PUT_YOUR_HANDS_UP, MP3_M2_ITS_A_TERRORIST }, - { QUIP_LOSTGUN, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ }, - { QUIP_GOFORALARM, SFX_M2_ACTIVATE_THE_ALARM, SFX_M2_ACTIVATE_THE_ALARM, SFX_M2_ACTIVATE_THE_ALARM }, - { QUIP_SEARCHFAIL, SFX_M2_I_BET_THIS_IS_ANOTHER_DRILL, SFX_M2_I_BET_THIS_IS_ANOTHER_DRILL, SFX_M2_ANOTHER_FALSE_ALARM }, - { QUIP_ATTACK3, SFX_M2_COME_ON_MAN2, SFX_M2_DIE, SFX_M2_TAKE_THIS }, - { QUIP_ATTACK4, SFX_M2_DIE, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE }, - { QUIP_KILLEDPLAYER2, SFX_M2_IM_THE_MAN, SFX_M2_ITS_ALL_OVER_FOR_THIS_ONE, SFX_M2_DID_YOU_SEE_THAT }, - { QUIP_GUNJAMMED, SFX_M2_GOD_DAMN_IT, SFX_M2_I_DONT_BELIEVE_IT, SFX_M2_GOD_DAMN_IT }, - { QUIP_UNCOVEREDDISGUISE2, MP3_M2_ITS_A_TERRORIST, MP3_M2_ITS_A_TERRORIST, MP3_M2_ITS_A_TERRORIST }, - // Voicebox 3 (female) - { QUIP_ATTACK1, SFX_F_COME_ON, SFX_F_COME_ON, SFX_F_COME_ON }, - { QUIP_ATTACK2, SFX_0037, SFX_F_EVERYONE_GET_HER, SFX_F_ATTACK }, - { QUIP_GOTOCOVER1, SFX_F_COVER_ME, SFX_0037, SFX_F_TAKE_COVER }, - { QUIP_GRENADE1, SFX_F_LOOK_OUT, SFX_F_ITS_A_GRENADE, SFX_F_ITS_A_GRENADE }, - { QUIP_RETREAT1, SFX_F_GET_REINFORCEMENTS, SFX_F_EVACUATE_THE_AREA, SFX_F_RETREAT }, - { QUIP_GRENADE2, SFX_F_CATCH_THIS, SFX_F_TIME_TO_DIE, SFX_0037 }, - { QUIP_RETREAT2, SFX_F_WITHDRAW, SFX_F_WITHDRAW, SFX_F_FALL_BACK }, - { QUIP_FLANK, SFX_0037, SFX_F_SPREAD_OUT, SFX_F_SPLIT_UP }, - { QUIP_SURRENDER, SFX_F_PLEASE_DONT, SFX_F_PLEASE_DONT, SFX_F_DONT_SHOOT }, - { QUIP_HEARNOISE, SFX_0037, SFX_F_0389, SFX_F_SOMEONES_SHOOTING }, - { QUIP_10, 0, 0, 0 }, - { QUIP_SEEPLAYER, SFX_F_GET_HER, SFX_F_HEY_YOU_COME_HERE, SFX_0037 }, - { QUIP_SHOTUNALERT, SFX_F_UNDER_FIRE, SFX_0037, SFX_F_WERE_UNDER_FIRE }, - { QUIP_INJURED1, SFX_0037, SFX_F_IM_WOUNDED, SFX_F_HELP_ME_OUT }, - { QUIP_INJURED2, SFX_F_IM_WOUNDED, SFX_F_HELP_ME_OUT, SFX_F_IM_IN_TROUBLE }, - { QUIP_KILLEDPLAYER1, 0, 0, 0 }, - { QUIP_WARNFRIENDS, SFX_F_TARGET_ATTACKING, SFX_F_UNDER_FIRE, SFX_0037 }, - { QUIP_GOFORALARM, SFX_F_GET_REINFORCEMENTS, SFX_F_EVACUATE_THE_AREA, SFX_F_RETREAT }, - { QUIP_SURPRISED, SFX_0037, SFX_F_HEY, SFX_F_HUH }, - { QUIP_INSPECTBODY, SFX_F_UNIT_DOWN, SFX_F_UNIT_DOWN, SFX_F_UNIT_DOWN }, - { QUIP_20, SFX_F_TARGET_ATTACKING, SFX_F_UNDER_FIRE, SFX_F_WERE_UNDER_FIRE }, - { QUIP_HITPLAYER, SFX_F_DID_THAT_HURT, SFX_F_YOU_WANT_SOME_MORE, SFX_0037 }, - { QUIP_MISSEDPLAYER1, SFX_F_THIS_GUNS_USELESS, SFX_0037, SFX_F_STAND_STILL }, -#if VERSION >= VERSION_NTSC_1_0 - { QUIP_MISSEDPLAYER2, SFX_F_STAND_STILL, SFX_F_SOMEONE_HIT_HER, SFX_F_DAMN_SHES_GOOD }, -#else - { QUIP_MISSEDPLAYER2, SFX_F_STAND_STILL, SFX_F_SOMEONE_HIT_HER, SFX_M1_SCREAM }, -#endif - { QUIP_GOTOCOVER2, SFX_F_GO_FOR_IT, SFX_0037, SFX_F_RUN }, - { QUIP_DIE, SFX_F_WHY_ME, SFX_F_NOO, SFX_F_MY_GOD }, - { QUIP_26, SFX_F_IM_JUST_TOO_GOOD, SFX_0037, SFX_F_SUCH_A_WASTE }, - { QUIP_SEARCHSUCCESS, SFX_F_GET_HER, SFX_F_HEY_YOU_COME_HERE, SFX_0037 }, - { QUIP_SEEEYESPY, 0, 0, 0 }, - { QUIP_GREETING, SFX_0037, SFX_F_COME_ON, SFX_0037 }, - { QUIP_ASKWEAPON1, SFX_0037, SFX_F_COME_ON, SFX_0037 }, - { QUIP_ASKWEAPON2, SFX_0037, SFX_F_COME_ON, SFX_0037 }, - { QUIP_UNCOVERDISGUISE1, SFX_0037, SFX_F_COME_ON, SFX_0037 }, - { QUIP_LOSTGUN, SFX_F_HEY, SFX_F_HUH, SFX_F_HEY }, - { QUIP_GOFORALARM, SFX_F_GET_REINFORCEMENTS, SFX_F_FALL_BACK, SFX_F_EVACUATE_THE_AREA }, - { QUIP_SEARCHFAIL, 0, 0, 0 }, - { QUIP_ATTACK3, SFX_F_COME_ON, SFX_F_COME_ON, SFX_F_ATTACK }, - { QUIP_ATTACK4, SFX_F_ATTACK, SFX_F_ATTACK, SFX_F_COME_ON }, - { QUIP_KILLEDPLAYER2, SFX_F_GET_A_CLEANER, SFX_F_IM_JUST_TOO_GOOD, SFX_F_SUCH_A_WASTE }, - { QUIP_GUNJAMMED, SFX_F_THIS_GUNS_USELESS, SFX_F_THIS_GUNS_USELESS, SFX_F_THIS_GUNS_USELESS }, - { QUIP_UNCOVEREDDISGUISE2, 0, 0, 0 }, -}; - -s16 g_SpecialQuipBank[][4] = { -#if VERSION >= VERSION_NTSC_1_0 - { 0, MP3_CASS_HOW_DARE_YOU_DISTURB_ME, MP3_CASS_YOU_WILL_REGRET, MP3_CASS_LEAVE_NOW }, -#else - { 0, 0x12f2, 0x12f3, 0x12f8 }, -#endif - { 1, MP3_SEC_PLEASE_DONT_KILL_ME, MP3_SEC_DONT_SHOOT, MP3_SEC_PLEASE_DONT_KILL_ME }, - { 2, SFX_DRCAROLL_COME_ON, SFX_DRCAROLL_TAKING_YOUR_TIME, SFX_DRCAROLL_GET_OUT_OF_HERE }, - { 3, SFX_DRCAROLL_KNOW_WHAT_YOURE_DOING, SFX_DRCAROLL_0249, SFX_DRCAROLL_GOING_TO_THE_HELIPAD }, - { 4, SFX_DRCAROLL_STOP_THAT, SFX_DRCAROLL_WHAT, SFX_ARGH_DRCAROLL_0240 }, - { 5, SFX_ARGH_DRCAROLL_024C, SFX_DRCAROLL_QUITE_ENOUGH, SFX_ARGH_DRCAROLL_0251 }, - { 6, SFX_DRCAROLL_I_CANT_MAKE_IT, SFX_DRCAROLL_YOU_WERE_SUPPOSED, SFX_DRCAROLL_SYSTEMS_FAILURE }, - { 7, SFX_DRCAROLL_OH_CRIKEY, SFX_DRCAROLL_GOODNESS_GRACIOUS, SFX_DRCAROLL_DONT_THEY_KNOW }, - { 8, MP3_K7_IM_NOT_SURE, MP3_K7_ONE_MORE_TIME, MP3_K7_I_DUNNO }, - { 9, MP3_SCI_AND_AGAIN, MP3_SCI_TRY_IT_NOW, MP3_SCI_AND_AGAIN }, - { 10, MP3_SCI_WHAT_ARE_YOU_DOING, MP3_SCI_HAVENT_SEEN_YOU, SFX_SCI_WHO_THE_HELL_ARE_YOU }, - { 11, MP3_JO_SHUT_DOWN_EXPERIMENTS, MP3_JO_PULL_THE_PLUG, MP3_JO_SWITCH_THIS_THING_OFF }, - { 12, MP3_SCI_ILL_SHUT_IT_DOWN, MP3_SCI_PLEASE_DONT_HURT_ME, MP3_SCI_ALLOW_ME_TO_ASSIST_YOU }, - { 13, MP3_SCI_MY_EXPERIMENTS, MP3_SCI_EXPERIMENT_IS_DOWN, MP3_SCI_LEAVE_THIS_AREA }, - { 14, MP3_SCI_SECURITY, MP3_SCI_IM_CALLING_SECURITY, MP3_SCI_ACCIDENTS_WILL_HAPPEN }, - { 15, MP3_SCI_HOW_DID_THAT_HAPPEN, MP3_SCI_OFF_ALREADY, MP3_SCI_HAVE_YOU_BEEN_TAMPERING }, - { 16, MP3_SCI_SOMEONES_BROKEN_MY_EQUIPMENT, MP3_SCI_WHATS_HAPPENED_TO_THE_TERMINAL, MP3_SCI_YOU_VANDAL }, - { 17, SFX_ARGH_FEMALE_000D, SFX_ARGH_FEMALE_000D, SFX_ARGH_FEMALE_000D }, - { 18, SFX_M0_HOWS_THINGS, SFX_M0_HEY_THERE, SFX_M0_HI_HOW_ARE_YOU }, - { 19, MP3_M0_WHERE_DID_YOU_GET_THAT, MP3_M0_SHOULD_YOU_HAVE_THAT, MP3_M0_WHAT_ARE_YOU_DOING }, - { 20, SFX_0037, MP3_M0_DONT_POINT_THAT_AT_ME, MP3_M0_WATCH_WHERE_YOURE_POINTING }, - { 21, MP3_M0_IMPOSTER, MP3_M0_IMPOSTER, MP3_M0_ITS_A_SPY }, - { 22, SFX_CIV_GREETINGS_CITIZEN, SFX_CIV_HEY_SUGAR_WANNA_PARTY, SFX_CIV_HEY_BABY }, - { 23, SFX_CIV_HOWS_IT_GOING, SFX_CIV_TAKE_IT_EASY, SFX_CIV_WHISTLE }, - { 24, SFX_CIV_OH_MY_GOD, SFX_CIV_I_DONT_WANT_ANY_TROUBLE, SFX_CIV_TAKE_THE_WALLET }, - { 25, SFX_CIV_THERES_A_MANIAC, SFX_CIV_QUICK_DOWN_THERE, SFX_CIV_GET_ME_OUT_OF_HERE }, - { 26, SFX_CIV_GUNS_DONT_SCARE_ME, SFX_CIV_KEEP_AWAY_FROM_THIS_CAR, SFX_CIV_KEEP_AWAY_FROM_THIS_CAR }, - { 27, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY }, - { 28, SFX_SHOULD_HAVE_COME_HERE_GIRL, SFX_SECURE_THE_PERIMETER, SFX_WERE_TAKING_OVER }, - { 29, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY }, - { 30, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY }, - { 31, MP3_ROBOT_STOP_WHERE_YOU_ARE, MP3_ROBOT_STOP_WHERE_YOU_ARE, MP3_ROBOT_STOP_WHERE_YOU_ARE }, - { 32, MP3_COME_BACK_LATER_IM_BUSY, MP3_GO_AWAY, MP3_LOOK_I_CANT_HELP_YOU }, - { 33, MP3_PRES_STOP_SHOOTING, MP3_PRES_YOU_SURE_THIS_IS_THE_WAY, MP3_PRES_WHY_ARE_THEY_SHOOTING }, - { 34, SFX_CIV_GREETINGS_CITIZEN, SFX_CIV_HEY_SUGAR_WANNA_PARTY, 0 }, - { 35, SFX_CIV_HOWS_IT_GOING, SFX_CIV_TAKE_IT_EASY, 0 }, - { 36, SFX_CIV_OH_MY_GOD, SFX_CIV_I_DONT_WANT_ANY_TROUBLE, MP3_SEC_PLEASE_DONT_KILL_ME }, - { 37, SFX_CIV_THERES_A_MANIAC, SFX_CIV_QUICK_DOWN_THERE, 0 }, - { 38, SFX_ELVIS_INTERGALACTIC_PEACE, SFX_ELVIS_EAT_HOT_LEAD_WEIRDOS, SFX_ELVIS_KISS_MY_ALIEN_BUTT }, - { 39, SFX_ELVIS_ILL_KICK_YOUR_ASS, SFX_ELVIS_FOR_YOUR_OWN_GOOD, SFX_ELVIS_YOU_DARE_SHOOT_AT_ME }, - { 40, SFX_ELVIS_DONT_MESS_WITH_THE_MAIAN, SFX_ELVIS_IM_BAD, SFX_ELVIS_HEHE }, - { 41, SFX_ELVIS_ALL_GOING_WRONG, SFX_ELVIS_ALL_GOING_WRONG, SFX_ELVIS_WATCH_THE_SUIT }, - { 42, MP3_M2_ITS_A_TERRORIST, MP3_M0_ITS_A_SPY, MP3_M1_STOP_RIGHT_THERE }, -#if VERSION >= VERSION_NTSC_1_0 - { 43, MP3_CASS_HOW_DARE_YOU_DISTURB_ME, MP3_CASS_LEAVE_NOW, MP3_CASS_LEAVE_NOW }, -#else - { 43, 0x12f2, 0x12f8, 0x12f8, }, -#endif - { 44, SFX_ELVIS_HEHE, SFX_ELVIS_HEHE, SFX_ELVIS_HEHE }, - { 45, MP3_ROBOT_ALERT_UNDER_ATTACK, MP3_ROBOT_ALERT_UNDER_ATTACK, MP3_ROBOT_ALERT_UNDER_ATTACK }, -}; - -s16 g_QuipTexts[][4] = { - { 1, L_AME_083, L_AME_084, L_AME_085 }, // "How dare you disturb me!", "You will regret this intrusion, girl!", "If I were you, I'd leave...NOW!" - { 2, L_AME_086, L_AME_087, L_AME_086 }, // "Please don't kill me!", "Don't shoot!" - { 3, L_EAR_064, L_EAR_065, L_EAR_066 }, // "What are you doing in my lab?", "I haven't seen you before...", "Who the hell are you?" - { 4, L_EAR_067, L_EAR_068, L_EAR_069 }, // "Shut down the experiment.", "Pull the plug on that, NOW.", "Switch this thing off." - { 5, L_EAR_070, L_EAR_071, L_EAR_072 }, // "I'll shut it down.", "Please don't hurt me.", "Allow me to assist you." - { 6, L_EAR_073, L_EAR_074, L_EAR_075 }, // "My experiments!", "There the experiment is down.", "Leave this area NOW!" - { 7, L_EAR_076, L_EAR_077, L_EAR_078 }, // "Security!", "I'm calling security.", "Accidents will happen." - { 8, L_EAR_079, L_EAR_080, L_EAR_081 }, // "How did that happen?", "Looks like it's off already.", "Have you been tampering with this?" - { 9, L_EAR_082, L_EAR_083, L_EAR_084 }, // "Someone's broken my equipment.", "What's happened to the terminal?", "You vandal - you've broken it." - { 10, L_WAX_010, L_WAX_012, L_WAX_012 }, // "How dare you disturb me!", "If I were you, I'd leave... NOW!" -}; - -s16 g_SkedarQuipBank[][4] = { - { 1, SFX_SKEDAR_ROAR_0529, SFX_SKEDAR_ROAR_052A, SFX_SKEDAR_ROAR_052B }, - { 2, SFX_SKEDAR_ROAR_052D, SFX_SKEDAR_ROAR_052E, SFX_SKEDAR_ROAR_052F }, - { 3, SFX_SKEDAR_ROAR_0530, SFX_SKEDAR_ROAR_0530, SFX_SKEDAR_ROAR_0531 }, - { 1, SFX_SKEDAR_ROAR_0532, SFX_SKEDAR_ROAR_0533, SFX_SKEDAR_ROAR_0534 }, - { 2, SFX_SKEDAR_ROAR_0536, SFX_SKEDAR_ROAR_0537, SFX_SKEDAR_ROAR_0538 }, - { 3, SFX_SKEDAR_ROAR_0539, SFX_SKEDAR_ROAR_0539, SFX_SKEDAR_ROAR_053A }, - { 0 }, -}; - -s16 g_MaianQuipBank[][4] = { - { 1, SFX_MAIAN_05E2, SFX_MAIAN_05E3, SFX_MAIAN_05E4 }, - { 2, SFX_MAIAN_05E5, SFX_MAIAN_05E6, SFX_MAIAN_05E7 }, - { 3, SFX_ARGH_MAIAN_05DF, SFX_ARGH_MAIAN_05E0, SFX_ARGH_MAIAN_05E1 }, - { 0 }, -}; - -/** - * @cmd 0130 - */ -static u8 *aiSayQuip(u8 *cmd) -{ - u8 column; // 167 - s16 audioid; // 164 - u8 i; // 163 - s32 numnearbychrs; // 152 - bool issomeonetalking; // 148 - s32 probability; // 144 - u32 stack; // 140 - not referenced - s16 *chrnums; // 136 - s16 (*bank)[4]; // 132 - char *text; // 128 - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); // 124 - u32 prevplayernum = g_Vars.currentplayernum; // 120 - s32 distance; // 116 - not referenced - s32 row = cmd[3]; // 112 - u32 playernum; // 108 - not referenced - u8 headshotted = (g_Vars.chrdata->hidden2 & CHRH2FLAG_HEADSHOTTED) & 0xff; // 107 - struct chrdata *loopchr; // 100 - - // Choose bank - // 2c0 - if (CHRRACE(g_Vars.chrdata) == RACE_SKEDAR) { - bank = g_SkedarQuipBank; - - if (row > 5) { - row = 0; - } - // 2e0 - } else if (g_Vars.chrdata->headnum == HEAD_MAIAN_S) { - bank = g_MaianQuipBank; - - if (row > 2) { - row = random() & 1; - } - // 324 - } else if (cmd[7] == 0) { - if (g_Vars.chrdata->voicebox > 3) { - g_Vars.chrdata->voicebox = 3; - } - - bank = &g_GuardQuipBank[g_Vars.chrdata->voicebox * 41]; - } else { - // 37c - bank = g_SpecialQuipBank; - } - - // 37c - if (!row && !cmd[4] && !cmd[6]) { - g_Vars.chrdata->soundtimer = 0; - cmd += 10; - return cmd; - } - - // 3bc - chrnums = teamGetChrIds(g_Vars.chrdata->team); - numnearbychrs = 0; - issomeonetalking = false; - probability = cmd[4]; - - // Make it impossible for Elvis and Jon to use anything but special phrases - // 3f0 - if ((g_Vars.chrdata->headnum == HEAD_ELVIS - || g_Vars.chrdata->headnum == HEAD_THEKING - || g_Vars.chrdata->headnum == HEAD_ELVIS_GOGS - || g_Vars.chrdata->headnum == HEAD_JONATHAN) && - bank != g_SpecialQuipBank) { - probability = 0; - } - - // If the person talking is a player, and they've just died, - // try using the other coop player. - // 420 - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - // 444 - playernum = playermgrGetPlayerNumByProp(chr->prop); - - if (g_Vars.coopplayernum >= 0 && g_Vars.players[playernum]->isdead) { - // 470 - if (playernum == g_Vars.bondplayernum) { - playernum = g_Vars.coopplayernum; - } else { - playernum = g_Vars.bondplayernum; - } - } - - setCurrentPlayerNum(playernum); - } - - // If soundgap permits talking at this time and probability passes - // 494 - if ((g_Vars.chrdata->soundgap == 0 || g_Vars.chrdata->soundgap * 60 < g_Vars.chrdata->soundtimer) - && probability > (u8)random()) { - // Try and find a chr in the same squadron who is currently talking - // 4dc - while (*chrnums != -2) { - loopchr = chrFindByLiteralId(*chrnums); - - if (loopchr && loopchr->model - && !chrIsDead(loopchr) - && loopchr->actiontype != ACT_DEAD - && g_Vars.chrdata->squadron == loopchr->squadron - && loopchr->alertness >= 100 - && g_Vars.chrdata->chrnum != loopchr->chrnum - && chrGetDistanceToChr(g_Vars.chrdata, loopchr->chrnum) < 7000) { - // 584 - numnearbychrs++; - - // 594 - if (loopchr->soundtimer < 60 && cmd[6] != 0 && cmd[6] != 255) { - issomeonetalking = true; - } - } - - chrnums++; - } - - // 5dc - if (!issomeonetalking && - ((numnearbychrs == 0 && (cmd[6] == 0 || cmd[6] == 255)) || - (numnearbychrs > 0 && cmd[6] > 0))) { - column = random() % 3; - - // 64c - if ((cmd[7] & 0x80) == 0) { - audioid = bank[row][1 + column]; - } else { - audioid = bank[row][1 + g_Vars.chrdata->tude]; - } - - // 6a0 - if (audioWasNotPlayedRecently(audioid) || CHRRACE(g_Vars.chrdata) == RACE_SKEDAR) { - // 6d4 - audioMarkAsRecentlyPlayed(audioid); - - // 6e8 - // Replace gurgle with "why me" - if (audioid == 0x34e && !headshotted) { - audioid = 0x34d; - } - - // 700 - g_Vars.chrdata->soundtimer = 0; - g_Vars.chrdata->soundgap = cmd[5]; - g_Vars.chrdata->propsoundcount++; - - // 72c - if (audioid != 0x3f7 && audioid != 0x331 && audioid != 0x3a1) { - func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); - // 7a8 - propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, - -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); - } else { - // Audio is "Stop moving", "Stop dodging" or "Stand still" - distance = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata); - - if (ABS(distance) > 50) { - func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); - // 840 - propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, - -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); - } - } - - // Consider putting text on screen - // Note: if cmd[8] is 0 then it means no text, so the value - // needs to be be decremented by one so it's 0-indexed. - // 850 - if (cmd[8] && (cmd[7] & 0x80) == 0) { - if (column > 2) { - column = 2; - } - - text = langGet(g_QuipTexts[cmd[8] - 1][1 + column]); - - if (!sndIsFiltered(audioid)) { - // 8ac - hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[9]); - } - } else if (cmd[8]) { - text = langGet(g_QuipTexts[cmd[8] - 1][1 + g_Vars.chrdata->tude]); - - if (!sndIsFiltered(audioid)) { - // 904 - hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[9]); - } - } - } else { - // Audio was played recently - try and find a different one - audioid = 0; - - // 92c - for (i = 1; i < 4; i++) { - if (audioWasNotPlayedRecently(g_GuardQuipBank[row][i]) - && audioWasNotPlayedRecently(bank[row][i])) { - audioid = bank[row][i]; - break; - } - } - - // 99c - if (audioid) { - audioMarkAsRecentlyPlayed(audioid); - - // Replace gurgle with "why me" - if (audioid == 0x34e && !headshotted) { - audioid = 0x34d; - } - - g_Vars.chrdata->soundtimer = 0; - g_Vars.chrdata->soundgap = cmd[5]; - g_Vars.chrdata->propsoundcount++; - - // 9fc - if (audioid != 0x3f7 && audioid != 0x331 && audioid != 0x3a1) { - func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); - // a80 - propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, - -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); - } else { - // Audio is "Stop moving", "Stop dodging" or "Stand still" - // a90 - distance = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata); - - if (ABS(distance) > 50) { - func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); - // b28 - propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, - -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); - } - } - - // b44 - if (cmd[8]) { - text = langGet(g_QuipTexts[cmd[8] - 1][i]); - - if (!sndIsFiltered(audioid)) { - // b78 - hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, cmd[9]); - } - } - } else { - g_Vars.chrdata->soundtimer = 0; - g_Vars.chrdata->soundgap = cmd[5]; - chrUnsetFlags(g_Vars.chrdata, CHRFLAG1_TALKINGTODISGUISE, BANK_1); - } - } - } - } - - setCurrentPlayerNum(prevplayernum); - - cmd += 10; - - return cmd; -} - -void propDecrementSoundCount(struct prop *prop) -{ - if (prop && prop->chr && prop->chr->model && prop->chr->propsoundcount > 0) { - prop->chr->propsoundcount--; - } -} - -/** - * @cmd 01a7 - */ -static u8 *aiIfChrNotTalking(u8 *cmd) -{ - struct chrdata *chr = chrFindByLiteralId(cmd[2]); - - if (chr && chr->propsoundcount == 0) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd = cmd + 5; - } - - return cmd; -} - -/** - * @cmd 0131 - */ -static u8 *aiIncreaseSquadronAlertness(u8 *cmd) -{ - s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team); - - for (; *chrnums != -2; chrnums++) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && - chr->model && - !chrIsDead(chr) && - chr->actiontype != ACT_DEAD && - (g_Vars.chrdata->squadron == chr->squadron || g_Vars.chrdata->squadron == 255) && - g_Vars.chrdata->chrnum != chr->chrnum && - (chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 1000 || chrHasFlag(g_Vars.chrdata, CHRFLAG0_SQUADALERTANYDIST, BANK_0))) { - incrementByte(&chr->alertness, cmd[2]); - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 0132 - */ -static u8 *aiSetAction(u8 *cmd) -{ - struct bytelist *cmd2 = (struct bytelist *)(cmd); - g_Vars.chrdata->myaction = cmd2->b2; - - if (cmd2->b3 == 0) { - g_Vars.chrdata->orders = 0; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0133 - */ -static u8 *aiSetTeamOrders(u8 *cmd) -{ - struct chrnumaction *chraction; - s32 chrcount = 1; - s16 *chrnums; - struct chrnumaction chractions[50]; - s32 num; - u32 stack; - - // Get list of chrs in the current chr's squadron - chrnums = squadronGetChrIds(g_Vars.chrdata->squadron); - - // Iterate chrs in squadron and build list of their actions. - // Put the current chr's action first. - chraction = chractions; - chraction->chrnum = g_Vars.chrdata->chrnum; - chraction->myaction = g_Vars.chrdata->myaction; - chraction++; - - if (chrnums) { - while (*chrnums != -2) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && chr->model - && !chrIsDead(chr) - && chr->actiontype != ACT_DEAD - && chrCompareTeams(g_Vars.chrdata, chr, COMPARE_FRIENDS) - && g_Vars.chrdata->chrnum != chr->chrnum) { - if (chr->myaction == MA_COVERWAIT - || chr->myaction == MA_NORMAL - || chr->myaction == MA_WAITING - || chr->myaction == MA_SHOOTING) { - if (chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) { - chrcount++; - chraction->chrnum = chr->chrnum; - chraction->myaction = chr->myaction; - chraction++; - } - } - } - - chrnums++; - } - } - - chraction->myaction = MA_END; - - // Iterate the list of chrs and decide how to reassign orders to them - // based on the current chr's action - if (chrcount != 1) { - chraction = &chractions[1]; - num = 1; - - while (chraction->myaction != MA_END) { - struct chrdata *chr = chrFindByLiteralId(chraction->chrnum); - - switch (chractions[0].myaction) { - case MA_COVERGOTO: - if (!chrIsInTargetsFovX(chr, 45)) { - chr->orders = MA_SHOOTING; - } - break; - case MA_COVERBREAK: - if (!chrIsInTargetsFovX(chr, 30)) { - chr->orders = MA_SHOOTING; - } - num++; - break; - case MA_COVERSEEN: - if (!chrIsInTargetsFovX(chr, 30)) { - chr->orders = MA_SHOOTING; - g_Vars.chrdata->orders = MA_COVERGOTO; - } - num++; - break; - case MA_FLANKLEFT: - if (chrIsInTargetsFovX(chr, 50)) { - chr->orders = MA_FLANKRIGHT; - } else { - chr->orders = MA_SHOOTING; - } - num++; - g_Vars.chrdata->orders = MA_FLANKLEFT; - break; - case MA_FLANKRIGHT: - if (chrIsInTargetsFovX(chr, 50)) { - chr->orders = MA_FLANKLEFT; - } else { - chr->orders = MA_SHOOTING; - } - num++; - g_Vars.chrdata->orders = MA_FLANKRIGHT; - break; - case MA_DODGE: - if (!chrIsInTargetsFovX(chr, 30) && - chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { - chr->orders = MA_WITHDRAW; - } else { - chr->orders = MA_SHOOTING; - } - num++; - break; - case MA_GRENADE: - if (num < 2) { - chr->orders = MA_WAITING; - } else if (chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { - chr->orders = MA_WITHDRAW; - } - num++; - break; - case MA_WAITSEEN: - if (chrIsInTargetsFovX(chr, 30) && - chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { - chr->orders = MA_WITHDRAW; - } else { - chr->orders = MA_SHOOTING; - } - num++; - break; - case MA_WITHDRAW: - if (chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { - chr->orders = MA_WITHDRAW; - } - break; - } - - chraction++; - } - - if (num != 1) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0134 - */ -static u8 *aiIfOrders(u8 *cmd) -{ - struct bytelist *cmd2 = (struct bytelist *)(cmd); - - if (g_Vars.chrdata->orders == cmd2->b3) { - cmd = AILABEL(g_Vars.ailist, cmd2->b4, cmd2->b5); - - if (g_Vars.chrdata->orders == MA_WITHDRAW) { - // empty - } - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0135 - */ -static u8 *aiIfHasOrders(u8 *cmd) -{ - if (g_Vars.chrdata->orders) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0136 - */ -static u8 *aiRetreat(u8 *cmd) -{ - if (cmd[3] == 0) { - chrRunFromPos(g_Vars.chrdata, cmd[2], (cmd[2] & 0x10) ? 400.0f : 10000.0f, &g_Vars.chrdata->runfrompos); - } else if (cmd[3] == 1) { - struct prop *target = chrGetTargetProp(g_Vars.chrdata); - chrRunFromPos(g_Vars.chrdata, cmd[2], 10000, &target->pos); - } else { - chrAssignCoverByCriteria(g_Vars.chrdata, - COVERCRITERIA_FURTHEREST - | COVERCRITERIA_DISTTOTARGET - | COVERCRITERIA_ONLYNEIGHBOURINGROOMS - | COVERCRITERIA_ROOMSFROMME, 0); - chrGoToCover(g_Vars.chrdata, cmd[2]); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0137 - */ -static u8 *aiIfChrInSquadronDoingAction(u8 *cmd) -{ - s32 ret; - s16 *chrnums = squadronGetChrIds(g_Vars.chrdata->squadron); - struct bytelist *cmd2 = (struct bytelist *)(cmd); - ret = 1; - - if (chrnums) { - for (; *chrnums != -2; chrnums++) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && chr->model && chrIsDead(chr) == false && - chr->actiontype != ACT_DEAD && - chrCompareTeams(g_Vars.chrdata, chr, COMPARE_FRIENDS) && - g_Vars.chrdata->chrnum != chr->chrnum && - chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500 && - chr->myaction == cmd2->b2) { - ret = 2; - break; - } - } - } - - if (ret != 1) { - cmd = AILABEL(g_Vars.ailist, cmd2->b3, cmd2->b4); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0139 - */ -static u8 *ai0139(u8 *cmd) -{ - u32 angle = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - struct coord pos; - - chr0f04c874(g_Vars.chrdata, angle, &pos, cmd[7], cmd[6]); - - cmd += 8; - - return cmd; -} - -/** - * @cmd 013a - */ -static u8 *aiSetChrPresetToUnalertedTeammate(u8 *cmd) -{ - f32 closest_distance = 30999.9; - s16 candidate_chrnum = -1; - s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team); - - if (g_Vars.chrdata->talktimer > TICKS(480) && g_Vars.chrdata->listening) { - g_Vars.chrdata->listening = 0; - } - - for (; *chrnums != -2; chrnums++) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (cmd[3] == 0 && chr && chr->model && - chrIsDead(chr) == false && - chr->actiontype != ACT_DEAD && - chr->actiontype != ACT_DIE && - chr->actiontype != ACT_DRUGGEDKO && - chr->actiontype != ACT_DRUGGEDDROP && - chr->actiontype != ACT_DRUGGEDCOMINGUP && - chr->alertness < 100 && - (g_Vars.chrdata->squadron == chr->squadron || g_Vars.chrdata->squadron == 0xff) && - g_Vars.chrdata->chrnum != chr->chrnum) { - - f32 distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum); - - if (distance < closest_distance && - (distance < 100.0f * (s32)cmd[2] || cmd[2] == 0) && - distance < closest_distance) { - closest_distance = distance; - - if (cmd[3] != 1) { - candidate_chrnum = chr->chrnum; - } else if (distance > 200) { - candidate_chrnum = chr->chrnum; - } - } - } - } - - if (candidate_chrnum != -1) { - chrSetChrPreset(g_Vars.chrdata, candidate_chrnum); - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 013b - */ -static u8 *aiSetSquadron(u8 *cmd) -{ - g_Vars.chrdata->squadron = cmd[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 013d - */ -static u8 *aiIfDangerousObjectNearby(u8 *cmd) -{ - if (chrDetectDangerousObject(g_Vars.chrdata, cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 013e - */ -static u8 *ai013e(u8 *cmd) -{ - if (func0f03aca0(g_Vars.chrdata, 400, true) == 0 && chrAssignCoverAwayFromDanger(g_Vars.chrdata, 1000, 12000) != -1) { - chrGoToCover(g_Vars.chrdata, GOPOSFLAG_RUN); - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 0140 - */ -static u8 *aiIfHoverbotNextStep(u8 *cmd) -{ - if (g_Vars.hovercar) { - if ((g_Vars.hovercar->nextstep > cmd[3] && cmd[2] == 1) || - (g_Vars.hovercar->nextstep < cmd[3] && cmd[2] == 0)) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0141 - */ -static u8 *aiShuffleInvestigationTerminals(u8 *cmd) -{ - // 2 = goodtag - // 3 = badtag - // 4 = pc1 - // 5 = pc2 - // 6 = pc3 - // 7 = pc4 - // 8 = always 00 - - u8 rand1; - u8 rand2; - struct tag *goodtag = tagFindById(cmd[2]); - struct tag *badtag = tagFindById(cmd[3]); - struct tag *pc; - - /** - * @bug: These should be using modulus 4. Because it's 1 short, the final - * else conditions are unreachable so only 3 of the 4 terminals can be - * selected as the destination. - */ - rand1 = random() % 3; - rand2 = random() % 3; - - if (cmd[8] == 0) { - // Place the good terminal - if (rand1 == 0) { - pc = tagFindById(cmd[4]); - goodtag->cmdoffset = pc->cmdoffset; - goodtag->obj = pc->obj; - } else if (rand1 == 1) { - pc = tagFindById(cmd[5]); - goodtag->cmdoffset = pc->cmdoffset; - goodtag->obj = pc->obj; - } else if (rand1 == 2) { - pc = tagFindById(cmd[6]); - goodtag->cmdoffset = pc->cmdoffset; - goodtag->obj = pc->obj; - } else { - pc = tagFindById(cmd[7]); - goodtag->cmdoffset = pc->cmdoffset; - goodtag->obj = pc->obj; - } - - // Handle both good and alarm terminals having the same destination - if (rand2 == rand1 && rand2 > 0) { - rand2--; - } else if (rand2 == rand1 && rand2 < 3) { - rand2++; - } - - // Place the alarm terminal - if (rand2 == 0) { - pc = tagFindById(cmd[4]); - badtag->cmdoffset = pc->cmdoffset; - badtag->obj = pc->obj; - } else if (rand2 == 1) { - pc = tagFindById(cmd[5]); - badtag->cmdoffset = pc->cmdoffset; - badtag->obj = pc->obj; - } else if (rand2 == 2) { - pc = tagFindById(cmd[6]); - badtag->cmdoffset = pc->cmdoffset; - badtag->obj = pc->obj; - } else { - pc = tagFindById(cmd[7]); - badtag->cmdoffset = pc->cmdoffset; - badtag->obj = pc->obj; - } - } - - cmd += 9; - - return cmd; -} - -/** - * Used by the blow command, which makes Investigation scientists run to the - * computer terminals. The number of the left is the pad that the terminal sits - * on, and the number on the right is the pad that the scientist will run to - * when running to the terminal. - */ -u16 g_InvestigationPadMap[] = { - 0x0246, 0x007b, - 0x0247, 0x007d, - 0x0248, 0x007e, - 0x0249, 0x007c, - 0x024a, 0x0093, - 0x024b, 0x0091, - 0x024c, 0x0092, - 0x024d, 0x0093, - 0x024e, 0x00ae, - 0x024f, 0x00ac, - 0x0250, 0x00ab, - 0x0251, 0x00ad, - 0x0252, 0x00a1, - 0x0253, 0x009f, - 0x0254, 0x00a0, - 0x0255, 0x009e, - 0x0256, 0x00bb, - 0x0257, 0x00b8, - 0x0258, 0x00b9, - 0x0259, 0x00ba, -}; - -/** - * @cmd 0142 - */ -static u8 *aiSetPadPresetToInvestigationTerminal(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj) { - s16 objpad = obj->pad; - s32 i; - - for (i = 0; i < sizeof(g_InvestigationPadMap) / sizeof(g_InvestigationPadMap[0]); i += 2) { - if (objpad == g_InvestigationPadMap[i]) { - chrSetPadPreset(g_Vars.chrdata, g_InvestigationPadMap[i + 1]); - } - } - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 0143 - */ -static u8 *aiHeliArmWeapons(u8 *cmd) -{ - if (g_Vars.hovercar) { - chopperSetArmed(g_Vars.hovercar, true); - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 0145 - */ -static u8 *aiRebuildTeams(u8 *cmd) -{ - rebuildTeams(); - rebuildSquadrons(); - cmd += 2; - - return cmd; -} - -/** - * @cmd 0147 - */ -static u8 *aiIfSquadronIsDead(u8 *cmd) -{ - /** - * @bug: anyalive is initialised to true here, and reset to false in each - * loop iteration. This causes it to use the last chr's status only. - */ - u32 stack[2]; - bool anyalive = true; - s16 *chrnums = squadronGetChrIds(cmd[2]); - - if (chrnums) { - while (*chrnums != -2) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && chr->model) { - anyalive = false; - - if (!chrIsDead(chr) && chr->actiontype != ACT_DEAD) { - anyalive = true; - } - } - - chrnums++; - } - } - - if (!anyalive) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0157 - */ -static u8 *aiSetTintedGlassEnabled(u8 *cmd) -{ - g_TintedGlassEnabled = cmd[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 0152 - */ -static u8 *aiIfNumChrsInSquadronGreaterThan(u8 *cmd) -{ - s32 count = 0; - s16 *chrnums = squadronGetChrIds(cmd[3]); - - if (chrnums) { - while (*chrnums != -2) { - struct chrdata *chr = chrFindByLiteralId(*chrnums); - - if (chr && chr->prop && chrIsDead(chr) == false - && chr->actiontype != ACT_DEAD - && chr->actiontype != ACT_DRUGGEDKO - && chr->actiontype != ACT_DRUGGEDDROP - && chr->actiontype != ACT_DRUGGEDCOMINGUP) { - count++; - } - - chrnums++; - } - } - - if (count > cmd[2]) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0165 - */ -static u8 *aiIfChrInjured(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && (chr->chrflags & CHRCFLAG_INJUREDTARGET)) { - chr->chrflags &= ~CHRCFLAG_INJUREDTARGET; - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0167 - */ -static u8 *aiHovercopterFireRocket(u8 *cmd) -{ - chopperFireRocket(g_Vars.hovercar, cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0169 - */ -static u8 *aiIfNaturalAnim(u8 *cmd) -{ - struct bytelist *cmd2 = (struct bytelist *)(cmd); - - if (g_Vars.chrdata->naturalanim == cmd2->b2) { - cmd = AILABEL(g_Vars.ailist, cmd2->b3, cmd2->b4); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 016a - */ -static u8 *aiIfY(u8 *cmd) -{ - struct chrdata *chr = NULL; - f32 cutoff_y = ((cmd[4] | (cmd[3] << 8)) << 16) >> 16; - - if (cmd[2] == CHR_TARGET && g_Vars.hovercar) { - struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar); - - if (chopper) { - struct prop *target = chopperGetTargetProp(chopper); - - if (target && (target->type == PROPTYPE_CHR || target->type == PROPTYPE_PLAYER)) { - chr = target->chr; - } - } - } else { - chr = chrFindById(g_Vars.chrdata, cmd[2]); - } - - if (chr && chr->prop && ( - (chr->prop->pos.y < cutoff_y && cmd[5] == 0) || - (chr->prop->pos.y > cutoff_y && cmd[5] == 1))) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - } - - return cmd; -} - -/** - * @cmd 016d - */ -static u8 *aiChrAdjustMotionBlur(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - if (cmd[4] == 0) { - chr->blurdrugamount -= TICKS(cmd[3]); - } else { - chr->blurdrugamount += TICKS(cmd[3]); - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 016e - */ -static u8 *aiDamageChrByAmount(u8 *cmd) -{ - struct coord coord = {0, 0, 0}; - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop) { - if (cmd[4] == 2) { - struct gset gset = {WEAPON_COMBATKNIFE, 0, 0, FUNC_POISON}; - chrDamageByMisc(chr, (s32)cmd[3] * 0.03125f, &coord, &gset, NULL); - } else if (cmd[4] == 0) { - chrDamageByMisc(chr, (s32)cmd[3] * 0.03125f, &coord, NULL, NULL); - } else { - chrDamageByMisc(chr, (s32)cmd[3] * -0.03125f, &coord, NULL, NULL); - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 016f - */ -static u8 *aiIfChrHasGun(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->model && chr->gunprop == NULL) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0170 - */ -static u8 *aiDoGunCommand(u8 *cmd) -{ - struct weaponobj *weapon = g_Vars.chrdata->gunprop->weapon; - - if (cmd[2] == 0 || ((weapon->base.hidden & OBJHFLAG_PROJECTILE) == 0 && cmd[2] == 1)) { - if (cmd[2] == 0) { - chrGoToProp(g_Vars.chrdata, g_Vars.chrdata->gunprop, GOPOSFLAG_JOG); - } - - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0171 - */ -static u8 *aiIfDistanceToGunLessThan(u8 *cmd) -{ - f32 distance = (cmd[3] | (cmd[2] << 8)) * 10.0f; - f32 xdiff = 0; - f32 ydiff = 0; - f32 zdiff = 0; - - if (g_Vars.chrdata->gunprop) { - xdiff = g_Vars.chrdata->prop->pos.x - g_Vars.chrdata->gunprop->pos.x; - ydiff = g_Vars.chrdata->prop->pos.y - g_Vars.chrdata->gunprop->pos.y; - zdiff = g_Vars.chrdata->prop->pos.z - g_Vars.chrdata->gunprop->pos.z; - } - - if (ydiff < 200 && ydiff > -200 && - xdiff < distance && xdiff > -distance && - zdiff < distance && zdiff > -distance) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0172 - */ -static u8 *aiRecoverGun(u8 *cmd) -{ \ - struct prop *prop = g_Vars.chrdata->gunprop; - g_Vars.chrdata->gunprop = NULL; - - if (prop && prop->obj && prop->parent == NULL && prop->type == PROPTYPE_WEAPON) { - propDeregisterRooms(prop); - propDelist(prop); - propDisable(prop); - chrEquipWeapon(prop->weapon, g_Vars.chrdata); - } - - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - - if (1); - - return cmd; -} - -/** - * @cmd 0173 - */ -static u8 *aiChrCopyProperties(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->model) { - g_Vars.chrdata->hearingscale = chr->hearingscale; - g_Vars.chrdata->visionrange = chr->visionrange; - g_Vars.chrdata->padpreset1 = chr->padpreset1; - g_Vars.chrdata->chrpreset1 = chr->chrpreset1; - g_Vars.chrdata->flags = chr->flags; - g_Vars.chrdata->flags2 = chr->flags2; - g_Vars.chrdata->team = chr->team; - g_Vars.chrdata->squadron = chr->squadron; - - // @bug? Copying from self to self - g_Vars.chrdata->accuracyrating = g_Vars.chrdata->accuracyrating; - g_Vars.chrdata->speedrating = g_Vars.chrdata->speedrating; - - g_Vars.chrdata->naturalanim = chr->naturalanim; - g_Vars.chrdata->myspecial = chr->myspecial; - g_Vars.chrdata->yvisang = chr->yvisang; - g_Vars.chrdata->teamscandist = chr->teamscandist; - - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0177 - */ -static u8 *aiPlayerAutoWalk(u8 *cmd) -{ - s16 pad_id = cmd[4] | (cmd[3] << 8); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - playerAutoWalk(pad_id, cmd[5], cmd[6], cmd[7], cmd[8]); - setCurrentPlayerNum(prevplayernum); - } - - cmd += 9; - - return cmd; -} - -/** - * @cmd 0178 - */ -static u8 *aiIfPlayerAutoWalkFinished(u8 *cmd) -{ - bool walking = false; - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - - if (g_Vars.tickmode == TICKMODE_AUTOWALK) { - walking = true; - } - - setCurrentPlayerNum(prevplayernum); - } - - if (walking) { - cmd += 5; - } else { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } - - return cmd; -} - -/** - * @cmd 0181 - */ -static u8 *aiIfPlayerLookingAtObject(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - bool pass = false; - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - - if (g_Vars.currentplayer->lookingatprop.prop == obj->prop) { - pass = true; - } - - setCurrentPlayerNum(prevplayernum); - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 0182 - */ -static u8 *aiPunchOrKick(u8 *cmd) -{ - if (g_Vars.chrdata && chrTryPunch(g_Vars.chrdata, cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0183 - */ -static u8 *aiIfTargetIsPlayer(u8 *cmd) -{ - struct prop *target = chrGetTargetProp(g_Vars.chrdata); - - if (target->type == PROPTYPE_EYESPY || target->type == PROPTYPE_PLAYER) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0184 - */ -static u8 *ai0184(u8 *cmd) -{ - chrTryAttackAmount(g_Vars.chrdata, 512, 0, cmd[2], cmd[3]); - cmd += 4; - - return cmd; -} - -/** - * @cmd 0186 - */ -static u8 *aiIfSoundTimer(u8 *cmd) -{ - s32 value = TICKS(cmd[3] | (cmd[2] << 8)); - - if ((g_Vars.chrdata->soundtimer > value && cmd[4] == 0) || - (g_Vars.chrdata->soundtimer < value && cmd[4] == 1)) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 0187 - */ -static u8 *aiSetTargetToEyespyIfInSight(u8 *cmd) -{ - s16 prevtarget = g_Vars.chrdata->target; - struct eyespy *eyespy = g_Vars.players[g_Vars.chrdata->p1p2]->eyespy; - - if (eyespy) { - struct chrdata *chr = eyespy->prop->chr; - g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum); - - if (chrCheckTargetInSight(g_Vars.chrdata)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - g_Vars.chrdata->target = prevtarget; - } - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0188 - */ -static u8 *aiIfLiftStationary(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - bool pass = false; - - if (obj && obj->prop && obj->type == OBJTYPE_LIFT) { - struct liftobj *lift = (struct liftobj *)obj; - - if ((obj->flags & OBJFLAG_DEACTIVATED) || lift->dist == 0) { - pass = true; - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 018b - */ -static u8 *aiConfigureRain(u8 *cmd) -{ - weatherConfigureRain(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 01b6 - */ -static u8 *aiConfigureSnow(u8 *cmd) -{ - weatherConfigureSnow(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 018c - */ -static u8 *aiChrToggleModelPart(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chrToggleModelPart(chr, cmd[3]); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 018d - */ -static u8 *aiActivateLift(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - - if (obj && obj->prop) { - liftActivate(obj->prop, cmd[2]); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 018e - */ -static u8 *aiMiniSkedarTryPounce(u8 *cmd) -{ - u16 thing = cmd[4] | (cmd[3] << 8); - - if (chrTrySkJump(g_Vars.chrdata, g_Vars.chrdata->pouncebits, cmd[2], thing, cmd[5])) { - cmd = AILABEL(g_Vars.ailist, cmd[6], cmd[7]); - } else { - cmd += 8; - - } - - return cmd; -} - -/** - * @cmd 018f - */ -static u8 *aiIfObjectDistanceToPadLessThan(u8 *cmd) -{ - f32 distance = (f32)(cmd[4] | (cmd[3] << 8)) * 10; - f32 xdiff; - f32 ydiff; - f32 zdiff; -#if VERSION >= VERSION_NTSC_1_0 - s32 pad_id = (cmd[6] | (cmd[5] << 8)) & 0xffff; -#else - u16 pad_id = cmd[6] | (cmd[5] << 8); -#endif - struct defaultobj *obj = objFindByTagId(cmd[2]); - struct pad pad; - bool pass = false; - - if (obj && obj->prop) { - pad_id = chrResolvePadId(g_Vars.chrdata, pad_id); - - if (pad_id >= 0) { - xdiff = obj->prop->pos.x - g_Pads[pad_id].pos.x; - ydiff = obj->prop->pos.y - g_Pads[pad_id].pos.y; - zdiff = obj->prop->pos.z - g_Pads[pad_id].pos.z; - - if (ydiff < 200 && ydiff > -200 && - xdiff < distance && xdiff > -distance && - zdiff < distance && zdiff > -distance) { - pass = true; - } - } - } - - if (pass) { - cmd = AILABEL(g_Vars.ailist, cmd[7], cmd[8]); - } else { - cmd += 9; - } - - return cmd; -} - -/** - * @cmd 0190 - */ -static u8 *aiSetSavefileFlag(u8 *cmd) -{ - gamefileSetFlag(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0191 - */ -static u8 *aiUnsetSavefileFlag(u8 *cmd) -{ - gamefileUnsetFlag(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 0192 - */ -static u8 *aiIfSavefileFlagIsSet(u8 *cmd) -{ - if (gamefileHasFlag(cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 0193 - */ -static u8 *aiIfSavefileFlagIsUnset(u8 *cmd) -{ - if (!gamefileHasFlag(cmd[2])) { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } else { - cmd += 5; - } - - return cmd; -} - -/** - * @cmd 019e - */ -static u8 *aiIfObjHealthLessThan(u8 *cmd) -{ - s32 damage = cmd[4] | (cmd[3] << 8); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - bool condition_passes = false; - - if (obj && obj->prop && obj->damage < damage) { - condition_passes = true; - } - - if (condition_passes) { - cmd = AILABEL(g_Vars.ailist, cmd[5], cmd[6]); - } else { - cmd += 7; - } - - return cmd; -} - -/** - * @cmd 019f - */ -static u8 *aiSetObjHealth(u8 *cmd) -{ - s32 damage = cmd[4] | (cmd[3] << 8); - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - obj->damage = damage; - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 01a0 - */ -static u8 *aiSetChrSpecialDeathAnimation(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->specialdie = cmd[3]; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01a1 - */ -static u8 *aiSetRoomToSearch(u8 *cmd) -{ - struct chrdata *target = chrFindById(g_Vars.chrdata, CHR_TARGET); - - if (target && target->prop) { - g_Vars.chrdata->roomtosearch = target->prop->rooms[0]; - } - - cmd += 2; - - return cmd; -} - -s16 g_CiMainQuips[][3] = { - { MP3_CARR_WHAT_IS_IT, MP3_CARR_A_LITTLE_BUSY, MP3_CARR_PROUD_OF_YOU }, - { MP3_CIFEM_FOSTER, MP3_CIFEM_COME_TO_SEE_ME, MP3_CIFEM_PRACTICE_MAKES_PERFECT }, - { MP3_GRIMSHAW_KNOW_YOUR_ENEMY, MP3_GRIMSHAW_ALL_EARS, MP3_GRIMSHAW_GAP_IN_RECORDS }, - { MP3_HOLO_LAST_MINUTE_TRAINING, MP3_HOLO_PRACTICE_MAKES_PERFECT, MP3_HOLO_HAVE_A_LIFE }, - { MP3_HANGERGUY_DONT_SCREW_UP, MP3_HANGERGUY_DONT_MAKE_A_MESS, MP3_HANGERGUY_HALF_HOUR_AGO }, - { MP3_FOSTER_WHAT_TO_SHOOT_AT, MP3_FOSTER_ZEROED_THE_SIGHTS, MP3_FOSTER_GOOD_SHOW }, -}; - -s16 g_CiGreetingQuips[][3] = { - { SFX_CARR_HELLO_JOANNA, SFX_CARR_HELLO_JOANNA, SFX_CARR_HELLO_JOANNA }, - { SFX_CIFEM_HI_THERE, SFX_CIFEM_HI_THERE, SFX_CIFEM_HI_THERE }, - { SFX_GRIMSHAW_WELCOME, SFX_GRIMSHAW_HI_THERE, SFX_GRIMSHAW_UMM_ERR_HI }, - { SFX_HOLO_HI, SFX_HOLO_HI, SFX_HOLO_HI }, - { SFX_HANGAR_WHAT_DO_YOU_WANT, SFX_HANGAR_WHAT_DO_YOU_WANT, SFX_HANGAR_WHAT_DO_YOU_WANT }, - { SFX_FOSTER_STAR_AGENT, SFX_FOSTER_STAR_AGENT, SFX_FOSTER_STAR_AGENT }, - { SFX_CIM_HEY_THERE, SFX_CIM_HEY_THERE, SFX_CIM_HI }, - { SFX_CIM_HI, SFX_CIM_HOWS_IT_GOING, SFX_CIM_HOWS_IT_GOING }, - { SFX_CIFEM_HELLO, SFX_CIFEM_HELLO, SFX_CIFEM_HI_JO }, - { SFX_CIFEM_HI_JO, SFX_CIFEM_HOWS_IT_GOING, SFX_CIFEM_HOWS_IT_GOING }, -}; - -s16 g_CiAnnoyedQuips[][3] = { - { MP3_CARR_WORRIES_ME, MP3_CARR_WORRIES_ME, MP3_CARR_WORRIES_ME }, - { MP3_CIFEM_PATIENCE, MP3_CIFEM_PATIENCE, MP3_CIFEM_PATIENCE }, - { MP3_GRIMSHAW_BUG_OFF, MP3_GRIMSHAW_CRIMINAL_RECORD, MP3_GRIMSHAW_LOSER }, - { MP3_HOLO_IRRITATING, MP3_HOLO_IRRITATING, MP3_HOLO_IRRITATING }, - { MP3_HANGAR_LIVED_THIS_LONG, MP3_HANGAR_LIVED_THIS_LONG, MP3_HANGAR_LIVED_THIS_LONG }, - { MP3_FOSTER_LEAVE_ME_ALONE, MP3_FOSTER_LEAVE_ME_ALONE, MP3_FOSTER_LEAVE_ME_ALONE }, - { MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE }, - { MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE }, - { MP3_CIFEM_BE_SOMEWHERE, MP3_CIFEM_BE_SOMEWHERE, MP3_CIFEM_BE_SOMEWHERE }, - { MP3_CIFEM_BOTHER_SOMEONE_ELSE, MP3_CIFEM_BOTHER_SOMEONE_ELSE, MP3_CIFEM_BOTHER_SOMEONE_ELSE }, -}; - -s16 g_CiThanksQuips[] = { - 0, - MP3_CIFEM_THANKS1, - MP3_GRIMSHAW_TOO_CLOSE, - MP3_CIFEM_THANKS2, - 0, - MP3_FOSTER_RELY_ON_YOU, - MP3_CIM_THANKS_JO, - MP3_CIM_THANKS_JO, - MP3_CIFEM_THANKS3, - MP3_CIFEM_THANKS3, -}; - -/** - * @cmd 01a2 - */ -static u8 *aiSayCiStaffQuip(u8 *cmd) -{ - s16 quip; - - if (cmd[2] == CIQUIP_GREETING) { - quip = g_CiGreetingQuips[g_Vars.chrdata->morale][random() % 3]; - audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0); - } - - if (cmd[2] == CIQUIP_MAIN) { - quip = g_CiMainQuips[g_Vars.chrdata->morale][random() % 3]; - audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0); - } - - if (cmd[2] == CIQUIP_ANNOYED) { - quip = g_CiAnnoyedQuips[g_Vars.chrdata->morale][random() % 3]; - audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0); - } - - if (cmd[2] == CIQUIP_THANKS) { - quip = g_CiThanksQuips[g_Vars.chrdata->morale]; - audioPlayFromProp((s8)cmd[3], quip, 0, g_Vars.chrdata->prop, 9, 0); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01a3 - */ -static u8 *aiDoPresetAnimation(u8 *cmd) -{ - // These all appear to be talking animations - u16 anims[] = { - /* 0*/ ANIM_0296, - /* 1*/ ANIM_0297, - /* 2*/ ANIM_0298, - /* 3*/ ANIM_028A, // when value is 3 (1/2 chance) - /* 4*/ ANIM_028C, // when value is 3 (1/2 chance) - /* 5*/ ANIM_0290, - /* 6*/ ANIM_0291, - /* 7*/ ANIM_TALKING_00A3, // when value is 255 (1/8 chance) - /* 8*/ ANIM_028E, // when value is 255 (1/8 chance) - /* 9*/ ANIM_028F, // when value is 255 (1/8 chance) - /*10*/ ANIM_TALKING_0231, // when value is 255 (1/8 chance) - /*11*/ ANIM_TALKING_0232, // when value is 255 (1/8 chance) - /*12*/ ANIM_TALKING_0233, // when value is 255 (1/8 chance) - /*13*/ ANIM_TALKING_0234, // when value is 255 (1/8 chance) - /*14*/ ANIM_028D, // when value is 255 (1/8 chance) - }; - - if (cmd[2] == 255) { - chrTryStartAnim(g_Vars.chrdata, anims[7 + (random() % 8)], 0, -1, 0, 15, 0.5); - } else if (cmd[2] == 254) { - struct prop *prop0 = chrGetHeldProp(g_Vars.chrdata, 1); - struct prop *prop1 = chrGetHeldProp(g_Vars.chrdata, 0); - - if (weaponIsOneHanded(prop0) || weaponIsOneHanded(prop1)) { - chrTryStartAnim(g_Vars.chrdata, ANIM_FIX_GUN_JAM_EASY, 0, -1, 0, 5, 0.5); - } else { - chrTryStartAnim(g_Vars.chrdata, ANIM_FIX_GUN_JAM_HARD, 0, -1, 0, 5, 0.5); - } - } else if (cmd[2] == 3) { - chrTryStartAnim(g_Vars.chrdata, anims[3 + (random() & 1)], 0, -1, 0, 15, 0.5); - } else { - chrTryStartAnim(g_Vars.chrdata, anims[cmd[2]], 0, -1, 0, 15, 0.5); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 01ae - */ -static u8 *aiClearInventory(u8 *cmd) -{ - u32 stackpadding[2]; - u32 prevplayernum = g_Vars.currentplayernum; - s32 playernum; - - for (playernum = 0; playernum < PLAYERCOUNT(); playernum++) { - setCurrentPlayerNum(playernum); - - if (g_Vars.currentplayer == g_Vars.bond || g_Vars.currentplayer == g_Vars.coop) { - invClear(); -#if VERSION >= VERSION_NTSC_1_0 - g_Vars.currentplayer->devicesactive = 0; -#endif - invGiveSingleWeapon(WEAPON_UNARMED); - bgunEquipWeapon(WEAPON_UNARMED); - } - } - - setCurrentPlayerNum(prevplayernum); - cmd += 3; - - return cmd; -} - -/** - * @cmd 01ad - */ -static u8 *aiReleaseObject(u8 *cmd) -{ - bmoveSetModeForAllPlayers(MOVEMODE_WALK); - cmd += 3; - - return cmd; -} - -/** - * @cmd 01af - */ -static u8 *aiChrGrabObject(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[3]); - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER && obj && obj->prop) { - u32 prevplayernum = g_Vars.currentplayernum; - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - - if (g_Vars.currentplayer->bondmovemode == MOVEMODE_WALK - && bmoveGetCrouchPos() == CROUCHPOS_STAND - && g_Vars.currentplayer->crouchoffset == 0) { - bmoveGrabProp(obj->prop); - } - - setCurrentPlayerNum(prevplayernum); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01b1 - */ -static u8 *aiShuffleRuinsPillars(u8 *cmd) -{ - struct tag *ptr1 = tagFindById(cmd[2]); - struct tag *ptr2 = tagFindById(cmd[3]); - struct tag *ptr3 = tagFindById(cmd[4]); - struct tag *src; - u8 marked1index = random() % 5; - u8 marked2index = random() % 5; - u8 marked3index = random() % 5; - u8 pillars[5]; - u8 mines[5]; - pillars[0] = cmd[5]; - pillars[1] = cmd[6]; - pillars[2] = cmd[7]; - pillars[3] = cmd[8]; - pillars[4] = cmd[9]; - mines[0] = cmd[13]; - mines[1] = cmd[14]; - mines[2] = cmd[15]; - mines[3] = cmd[16]; - mines[4] = cmd[17]; - - while (marked2index == marked1index) { - marked2index = random() % 5; - } - - while (marked3index == marked2index || marked3index == marked1index) { - marked3index = random() % 5; - } - - // Pillar/mine 1 - src = tagFindById(pillars[marked1index]); - ptr1->cmdoffset = src->cmdoffset; - ptr1->obj = src->obj; - - ptr1 = tagFindById(cmd[10]); - src = tagFindById(mines[marked1index]); - ptr1->cmdoffset = src->cmdoffset; - ptr1->obj = src->obj; - - // Pillar/mine 2 - src = tagFindById(pillars[marked2index]); - ptr2->cmdoffset = src->cmdoffset; - ptr2->obj = src->obj; - - ptr2 = tagFindById(cmd[11]); - src = tagFindById(mines[marked2index]); - ptr2->cmdoffset = src->cmdoffset; - ptr2->obj = src->obj; - - // Pillar/mine 3 - src = tagFindById(pillars[marked3index]); - ptr3->cmdoffset = src->cmdoffset; - ptr3->obj = src->obj; - - ptr3 = tagFindById(cmd[12]); - src = tagFindById(mines[marked3index]); - ptr3->cmdoffset = src->cmdoffset; - ptr3->obj = src->obj; - - cmd += 18; - - return cmd; -} - -/** - * @cmd 01b2 - */ -static u8 *aiSetWindSpeed(u8 *cmd) -{ - g_SkyWindSpeed = 0.1f * (s32)cmd[2]; - cmd += 3; - - return cmd; -} - -/** - * @cmd 01b3 - */ -static u8 *aiToggleP1P2(u8 *cmd) -{ - if (g_Vars.coopplayernum >= 0) { - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - if (chr->p1p2 == g_Vars.bondplayernum && !g_Vars.coop->isdead) { - chr->p1p2 = g_Vars.coopplayernum; - } else if (!g_Vars.bond->isdead) { - chr->p1p2 = g_Vars.bondplayernum; - } - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 01b7 - */ -static u8 *aiChrSetCloaked(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop) { - if (!chrIsDead(chr)) { - if (cmd[3]) { - chrCloak(chr, cmd[4]); - } else { - chrUncloak(chr, cmd[4]); - } - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 01b8 - */ -static u8 *aiSetAutogunTargetTeam(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop && obj->type == OBJTYPE_AUTOGUN) { - struct autogunobj *autogun = (struct autogunobj *)obj; - autogun->targetteam = cmd[3]; - autogun->target = NULL; - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01b9 - */ -static u8 *aiShufflePelagicSwitches(u8 *cmd) -{ - u8 buttonsdone[] = {0, 0, 0, 0, 0, 0, 0, 0}; - u8 i; - u8 j; - struct tag *tag; - struct tag *button; - u8 index; - - for (i = 8; i < 16; i++) { - tag = tagFindById(i); - index = random() & 7; - - if (buttonsdone[index] == 0) { - // Switch has not yet been mapped - button = tagFindById(index); - tag->cmdoffset = button->cmdoffset; - tag->obj = button->obj; - buttonsdone[index] = 1; - } else { - // Switch is already mapped - find first unmapped switch - for (j = 0; buttonsdone[j]; j++); - - button = tagFindById(j); - tag->cmdoffset = button->cmdoffset; - tag->obj = button->obj; - buttonsdone[j] = 1; - } - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 01bd - */ -static u8 *aiIfTrainingPcHolographed(u8 *cmd) -{ - struct trainingdata *data = dtGetData(); - - if (data->holographedpc) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 01be - */ -static u8 *aiIfPlayerUsingDevice(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - struct prop *prop = chr ? chr->prop : NULL; - u8 active = false; - - if (prop && prop->type == PROPTYPE_PLAYER) { - u32 playernum = playermgrGetPlayerNumByProp(prop); - u32 prevplayernum = g_Vars.currentplayernum; - setCurrentPlayerNum(playernum); - - if (currentPlayerGetDeviceState(cmd[3]) == DEVICESTATE_ACTIVE) { - active = true; - } - - setCurrentPlayerNum(prevplayernum); - } - - if (active) { - cmd = AILABEL(g_Vars.ailist, cmd[4], cmd[5]); - } else { - cmd += 6; - } - - return cmd; -} - -/** - * @cmd 01bf - */ -static u8 *aiChrBeginOrEndTeleport(u8 *cmd) -{ - u16 pad_id = cmd[3] | (cmd[2] << 8); - f32 fvalue; - struct chrdata *chr; -#if VERSION >= VERSION_NTSC_1_0 - s32 mainpri; -#endif - u32 playernum; - u32 prevplayernum; -#if VERSION >= VERSION_NTSC_1_0 - s32 audiopri; -#endif - struct sndstate *handle; - fvalue = 0.4; - chr = chrFindById(g_Vars.chrdata, cmd[4]); - prevplayernum = g_Vars.currentplayernum; - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - } - - if (pad_id == 0) { - g_Vars.currentplayer->teleportstate = TELEPORTSTATE_EXITING; - g_Vars.currentplayer->teleporttime = 0; - } else { - g_Vars.currentplayer->teleporttime = 0; - g_Vars.currentplayer->teleportstate = TELEPORTSTATE_PREENTER; - g_Vars.currentplayer->teleportpad = pad_id; - g_Vars.currentplayer->teleportcamerapad = 0; - -#if VERSION >= VERSION_NTSC_1_0 - mainpri = osGetThreadPri(0); - audiopri = osGetThreadPri(&g_AudioManager.thread); - osSetThreadPri(0, audiopri + 1); -#endif - - handle = sndStart(var80095200, SFX_RELOAD_FARSIGHT, NULL, -1, -1, -1, -1, -1); - - if (handle) { - audioPostEvent(handle, 16, *(u32 *)&fvalue); - } - -#if VERSION >= VERSION_NTSC_1_0 - osSetThreadPri(0, mainpri); -#endif - } - - cmd += 5; - - setCurrentPlayerNum(prevplayernum); - - return cmd; -} - -/** - * @cmd 01c0 - */ -static u8 *aiIfChrTeleportFullWhite(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[4]); - u32 prevplayernum = g_Vars.currentplayernum; -#if VERSION >= VERSION_NTSC_1_0 - s32 mainpri; -#endif - f32 fvalue; -#if VERSION >= VERSION_NTSC_1_0 - s32 audiopri; -#endif - struct sndstate *handle; - - if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { - u32 playernum = playermgrGetPlayerNumByProp(chr->prop); - setCurrentPlayerNum(playernum); - } - - if (g_Vars.currentplayer->teleportstate < TELEPORTSTATE_WHITE) { - cmd += 5; - } else { - fvalue = 0.4; - -#if VERSION >= VERSION_NTSC_1_0 - mainpri = osGetThreadPri(0); - audiopri = osGetThreadPri(&g_AudioManager.thread); - osSetThreadPri(0, audiopri + 1); -#endif - - handle = sndStart(var80095200, SFX_FIRE_SHOTGUN, NULL, -1, -1, -1, -1, -1); - - if (handle) { - audioPostEvent(handle, 16, *(u32 *)&fvalue); - } - -#if VERSION >= VERSION_NTSC_1_0 - osSetThreadPri(0, mainpri); -#endif - - g_Vars.currentplayer->teleportstate = TELEPORTSTATE_WHITE; - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } - - setCurrentPlayerNum(prevplayernum); - - return cmd; -} - -/** - * @cmd 01ca - */ -static u8 *aiChrSetCutsceneWeapon(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - s32 model_id = playermgrGetModelOfWeapon(cmd[3]); - s32 fallback_model_id = playermgrGetModelOfWeapon(cmd[4]); - - if (chr) { - if (cmd[3] == 0xff) { - if (cmd[4] == 0xff) { - if (chr->weapons_held[0]) { - struct weaponobj *weapon = chr->weapons_held[0]->weapon; - bool valid = true; - - switch (weapon->weaponnum) { - case WEAPON_FALCON2: - case WEAPON_FALCON2_SILENCER: - case WEAPON_FALCON2_SCOPE: - case WEAPON_MAGSEC4: - case WEAPON_MAULER: - case WEAPON_PHOENIX: - case WEAPON_DY357MAGNUM: - case WEAPON_DY357LX: - case WEAPON_CMP150: - valid = false; - } - - if (valid) { - weaponDeleteFromChr(chr, HAND_LEFT); - weaponDeleteFromChr(chr, HAND_RIGHT); - } - } - } else { - if (chr->weapons_held[0] == NULL && chr->weapons_held[1] == NULL && fallback_model_id >= 0) { - weaponCreateForChr(chr, fallback_model_id, cmd[4], 0, NULL, NULL); - } - } - } else { - weaponDeleteFromChr(chr, HAND_LEFT); - weaponDeleteFromChr(chr, HAND_RIGHT); - - if (model_id >= 0) { - weaponCreateForChr(chr, model_id, cmd[3], 0, NULL, NULL); - } - - if (fallback_model_id >= 0) { - weaponCreateForChr(chr, fallback_model_id, cmd[4], OBJFLAG_WEAPON_LEFTHANDED, NULL, NULL); - } - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 01cb - */ -static u8 *aiFadeScreen(u8 *cmd) -{ - u32 color = (cmd[3] << 16) | (cmd[4] << 8) | cmd[5] | (cmd[2] << 24); - s16 num_frames = (cmd[7] | (cmd[6] << 8)); - lvConfigureFade(color, num_frames); - cmd += 8; - - return cmd; -} - -/** - * @cmd 01cd - */ -static u8 *aiSetChrHudpieceVisible(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr && chr->prop && chr->model) { - chrSetHudpieceVisible(chr, cmd[3]); - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01ce - */ -static u8 *aiSetPassiveMode(u8 *cmd) -{ - bgunSetPassiveMode(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 01cf - */ -static u8 *aiChrSetFiringInCutscene(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - struct coord from = {0, 0, 0}; - struct coord to = {0, 0, 0}; - - if (chr && chr->weapons_held[HAND_RIGHT]) { - if (cmd[3]) { - chrSetFiring(chr, HAND_RIGHT, true); - chrCreateFireslot(chr, HAND_RIGHT, true, false, &from, &to); - } else { - chrSetFiring(chr, HAND_RIGHT, false); - } - } - - cmd += 4; - - return cmd; -} - -/** - * @cmd 01d0 - */ -static u8 *aiSetPortalFlag(u8 *cmd) -{ - s16 portalnum = cmd[3] | (cmd[2] << 8); - - g_BgPortals[portalnum].flags |= cmd[4]; - cmd += 5; - - return cmd; -} - -/** - * @cmd 01d1 - */ -static u8 *aiObjSetModelPartVisible(u8 *cmd) -{ - struct defaultobj *obj = objFindByTagId(cmd[2]); - - if (obj && obj->prop) { - objSetModelPartVisible(obj, cmd[3], cmd[4]); - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 01d2 - */ -static u8 *aiChrEmitSparks(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chrDrCarollEmitSparks(chr); - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 01d3 - */ -static u8 *aiSetDrCarollImages(u8 *cmd) -{ - struct chrdata *drcaroll = chrFindById(g_Vars.chrdata, cmd[2]); - - if (drcaroll) { - if (cmd[4] == 7) { - if ((g_Vars.lvframenum % 4) == 2) { - drcaroll->drcarollimage_left = random() % 6; - } - } else if (cmd[4] == 8) { - drcaroll->drcarollimage_left = random() % 6; - } else { - drcaroll->drcarollimage_left = cmd[4]; - } - - if (cmd[3] == 7) { - if ((g_Vars.lvframenum % 4) == 2) { - drcaroll->drcarollimage_right = random() % 6; - } - } else if (cmd[3] == 8) { - drcaroll->drcarollimage_right = random() % 6; - } else { - drcaroll->drcarollimage_right = cmd[3]; - } - } - - cmd += 5; - - return cmd; -} - -/** - * @cmd 01d4 - */ -static u8 *aiSetRoomFlag(u8 *cmd) -{ - s16 roomnum = cmd[3] | cmd[2] << 8; - s16 flag = cmd[5] | cmd[4] << 8; - - g_Rooms[roomnum].flags |= flag; - - cmd += 6; - - return cmd; -} - -/** - * @cmd 01d5 - */ -static u8 *aiShowCutsceneChrs(u8 *cmd) -{ - bool show = cmd[2]; - s32 i; - - if (show) { - for (i = chrsGetNumSlots() - 1; i >= 0; i--) { - if (g_ChrSlots[i].chrnum >= 0 && g_ChrSlots[i].prop && (g_ChrSlots[i].hidden2 & CHRH2FLAG_HIDDENFORCUTSCENE)) { - g_ChrSlots[i].hidden2 &= ~CHRH2FLAG_HIDDENFORCUTSCENE; - g_ChrSlots[i].chrflags &= ~CHRCFLAG_HIDDEN; - } - } - } else { - for (i = chrsGetNumSlots() - 1; i >= 0; i--) { - if (g_ChrSlots[i].chrnum >= 0 && g_ChrSlots[i].prop && - (g_ChrSlots[i].chrflags & (CHRCFLAG_UNPLAYABLE | CHRCFLAG_HIDDEN)) == 0) { - g_ChrSlots[i].hidden2 |= CHRH2FLAG_HIDDENFORCUTSCENE; - g_ChrSlots[i].chrflags |= CHRCFLAG_HIDDEN; - } - } - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 01d6 - */ -static u8 *aiConfigureEnvironment(u8 *cmd) -{ - s16 room_id = (cmd[3] | (cmd[2] << 8)); - s32 value = cmd[5]; - s32 i; - - switch (cmd[4]) { - case AIENVCMD_00: - var8006ae18 = value; - break; - case AIENVCMD_01: - var8006ae1c = value; - break; - case AIENVCMD_02: - var8006ae20 = value; - break; - case AIENVCMD_03: - var8006ae24 = value; - break; - case AIENVCMD_04: - var8006ae28 = value; - break; - case AIENVCMD_ROOM_SETAMBIENT: - g_Rooms[room_id].flags &= ~ROOMFLAG_PLAYAMBIENTTRACK; - if (value) { - g_Rooms[room_id].flags |= ROOMFLAG_PLAYAMBIENTTRACK; - } - break; - case AIENVCMD_ROOM_SETOUTDOORS: - g_Rooms[room_id].flags &= ~ROOMFLAG_OUTDOORS; - if (value) { - g_Rooms[room_id].flags |= ROOMFLAG_OUTDOORS; - } - break; - case AIENVCMD_07: - g_Rooms[room_id].unk4e_04 = value; - break; - case AIENVCMD_08: - g_Rooms[room_id].unk4d = value; - break; - case AIENVCMD_SETAMBIENT: - for (i = 1; i < g_Vars.roomcount; i++) { - if (value) { - g_Rooms[i].flags |= ROOMFLAG_PLAYAMBIENTTRACK; - } else { - g_Rooms[i].flags &= ~ROOMFLAG_PLAYAMBIENTTRACK; - } - } - break; - case AIENVCMD_PLAYNOSEDIVE: - sndPlayNosedive(value); - break; - case AIENVCMD_TICKMUSICQUEUE: - musicTickEvents(); - break; - case AIENVCMD_ROOM_SETFAULTYLIGHTS: - roomSetLightsFaulty(room_id, value); - break; - case AIENVCMD_STOPNOSEDIVE: - sndStopNosedive(); - break; - case AIENVCMD_PLAYUFOHUM: - sndPlayUfo(value); - break; - case AIENVCMD_STOPUFOHUM: - sndStopUfo(); - break; - } - - cmd += 6; - - return cmd; -} - -/** - * @cmd 01d9 - */ -static u8 *aiPlaySoundFromProp(u8 *cmd) -{ - s16 audio_id = cmd[5] | (cmd[4] << 8); - s32 volumemaybe = cmd[7] | (cmd[6] << 8); - u16 unk1 = cmd[10] | (cmd[10] << 8); // @bug: Using 10 twice - s32 channel = (s8)cmd[2]; - s16 unk2 = cmd[8]; - struct defaultobj *obj = objFindByTagId(cmd[3]); - - audioPlayFromProp(channel, audio_id, volumemaybe, obj->prop, unk2, unk1); - - cmd += 11; - - return cmd; -} - -/** - * @cmd 01da - */ -static u8 *aiPlayTemporaryPrimaryTrack(u8 *cmd) -{ - musicStartTemporaryPrimary(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 01db - */ -static u8 *aiChrKill(u8 *cmd) -{ - struct chrdata *chr = chrFindById(g_Vars.chrdata, cmd[2]); - - if (chr) { - chr->actiontype = ACT_DEAD; - chr->act_dead.fadetimer60 = -1; - chr->act_dead.fadenow = false; - chr->act_dead.fadewheninvis = false; - chr->act_dead.invistimer60 = 0; - chr->act_dead.notifychrindex = 0; - chr->sleep = 0; - chr->chrflags |= CHRCFLAG_KEEPCORPSEKO | CHRCFLAG_PERIMDISABLEDTMP; - } - - cmd += 3; - - return cmd; -} - -/** - * @cmd 01dc - */ -static u8 *aiRemoveWeaponFromInventory(u8 *cmd) -{ - invRemoveItemByNum(cmd[2]); - cmd += 3; - - return cmd; -} - -/** - * @cmd 01dd - */ -static u8 *aiIfMusicEventQueueIsEmpty(u8 *cmd) -{ - f32 value = (u64)osGetCount() * 64 / 3000; - - if (g_MusicEventQueueLength) { - cmd += 5; - } else { - cmd = AILABEL(g_Vars.ailist, cmd[3], cmd[4]); - } - - return cmd; -} - -/** - * @cmd 01de - */ -static u8 *aiIfCoopMode(u8 *cmd) -{ - if (g_Vars.normmplayerisrunning == false && g_MissionConfig.iscoop) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 01e0 - */ -static u8 *aiRemoveReferencesToChr(u8 *cmd) -{ - if (g_Vars.chrdata && g_Vars.chrdata->prop) { - u32 index = g_Vars.chrdata->prop - g_Vars.props; - chrClearReferences(index); - } - - cmd += 2; - - return cmd; -} - -/** - * @cmd 01b4 - */ -static u8 *ai01b4(u8 *cmd) -{ - if (g_Vars.chrdata && g_Vars.chrdata->prop && - chr0f01f264(g_Vars.chrdata, &g_Vars.chrdata->prop->pos, g_Vars.chrdata->prop->rooms, 0, false)) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - } else { - cmd += 4; - } - - return cmd; -} - -/** - * @cmd 0185 - */ -static u8 *aiMpInitSimulants(u8 *cmd) -{ - botSpawnAll(); - cmd += 2; - return cmd; -} - -/** - * @cmd 0176 - */ -static u8 *ai0176(u8 *cmd) -{ - struct aibot *aibot; - - /** - * @bug: Missing return means a crash will occur if either of these are - * null. - */ - if (!g_Vars.chrdata || !g_Vars.chrdata->aibot) { - cmd += 4; - return cmd; - } - - aibot = g_Vars.chrdata->aibot; - - if (aibot->unk059 == 1) { - cmd = AILABEL(g_Vars.ailist, cmd[2], cmd[3]); - aibot->unk059 = 0; - } else { - cmd += 4; - } - - return cmd; -} - -static u8 *aiSubCommand(u8 *cmd) -{ - switch (cmd[1]) { - case 0x00: return aiIfCutsceneButtonPressed(cmd); - case 0x01: return aiIfPlayerAutoWalkFinished(cmd); - case 0x02: return aiIfSavefileFlagIsSet(cmd); - case 0x03: return aiIfSavefileFlagIsUnset(cmd); - case 0x04: return aiIfTrainingPcHolographed(cmd); - case 0x05: return aiIfChrTeleportFullWhite(cmd); - case 0x06: return aiIfMusicEventQueueIsEmpty(cmd); - case 0x07: return aiSetPath(cmd); - case 0x08: return aiStartPatrol(cmd); - case 0x09: return aiSurrender(cmd); - case 0x0a: return aiLockDoor(cmd); - case 0x0b: return aiSetGrenadeProbability(cmd); - case 0x0c: return aiSetChrNum(cmd); - case 0x0d: return aiSetMaxDamage(cmd); - case 0x0e: return aiAddHealth(cmd); - case 0x0f: return aiSetReactionSpeed(cmd); - case 0x10: return aiSetRecoverySpeed(cmd); - case 0x11: return aiSetAccuracy(cmd); - case 0x12: return aiShowCountdownTimer(cmd); - case 0x13: return aiHideCountdownTimer(cmd); - case 0x14: return aiSetCountdownTimerValue(cmd); - case 0x15: return aiStopCountdownTimer(cmd); - case 0x16: return aiStartCountdownTimer(cmd); - case 0x17: return ai00d0(cmd); - case 0x18: return aiHovercarBeginPath(cmd); - case 0x19: return aiSetVehicleSpeed(cmd); - case 0x1a: return aiSetRotorSpeed(cmd); - case 0x1b: return aiEndLevel(cmd); - case 0x1c: return ai00dd(cmd); - case 0x1d: return aiWarpJoToPad(cmd); - case 0x1e: return aiRevokeControl(cmd); - case 0x1f: return aiGrantControl(cmd); - case 0x20: return aiChrDrawWeaponInCutscene(cmd); - case 0x21: return aiChrSetInvincible(cmd); - case 0x22: return aiPlayXTrack(cmd); - case 0x23: return aiStopXTrack(cmd); - case 0x24: return aiChrExplosions(cmd); - case 0x25: return aiSetLights(cmd); - case 0x26: return aiChrSetTeam(cmd); - case 0x27: return aiSetShield(cmd); - case 0x28: return aiSetCameraAnimation(cmd); - case 0x29: return aiSetSquadron(cmd); - case 0x2a: return aiShuffleInvestigationTerminals(cmd); - case 0x2b: return aiSetPadPresetToInvestigationTerminal(cmd); - case 0x2c: return aiHeliArmWeapons(cmd); - case 0x2d: return aiSetTintedGlassEnabled(cmd); - case 0x2e: return aiPlayTrackIsolated(cmd); - case 0x2f: return aiPlayDefaultTracks(cmd); - case 0x30: return ai016b(cmd); - case 0x31: return aiChrAdjustMotionBlur(cmd); - case 0x32: return aiPlayerAutoWalk(cmd); - case 0x33: return aiPlayCutsceneTrack(cmd); - case 0x34: return aiStopCutsceneTrack(cmd); - case 0x35: return aiPlayTemporaryTrack(cmd); - case 0x36: return aiStopAmbientTrack(cmd); - case 0x37: return aiMpInitSimulants(cmd); - case 0x38: return aiConfigureRain(cmd); - case 0x39: return aiChrToggleModelPart(cmd); - case 0x3a: return aiActivateLift(cmd); - case 0x3b: return aiSetSavefileFlag(cmd); - case 0x3c: return aiUnsetSavefileFlag(cmd); - case 0x3d: return aiSayCiStaffQuip(cmd); - case 0x3e: return aiReleaseObject(cmd); - case 0x3f: return aiClearInventory(cmd); - case 0x40: return aiChrGrabObject(cmd); - case 0x41: return aiShuffleRuinsPillars(cmd); - case 0x42: return aiSetWindSpeed(cmd); - case 0x43: return aiConfigureSnow(cmd); - case 0x44: return aiShufflePelagicSwitches(cmd); - case 0x45: return aiChrBeginOrEndTeleport(cmd); - case 0x46: return aiSetDodgeRating(cmd); - case 0x47: return aiSetUnarmedDodgeRating(cmd); - case 0x48: return aiChrSetCutsceneWeapon(cmd); - case 0x49: return aiSetChrHudpieceVisible(cmd); - case 0x4a: return aiSetPassiveMode(cmd); - case 0x4b: return aiChrSetFiringInCutscene(cmd); - case 0x4c: return aiSetPortalFlag(cmd); - case 0x4d: return aiObjSetModelPartVisible(cmd); - case 0x4e: return aiSetDrCarollImages(cmd); - case 0x4f: return aiSetRoomFlag(cmd); - case 0x50: return aiShowCutsceneChrs(cmd); - case 0x51: return aiConfigureEnvironment(cmd); - case 0x52: return aiPlaySoundFromProp(cmd); - case 0x53: return aiPlayTemporaryPrimaryTrack(cmd); - case 0x54: return aiRemoveWeaponFromInventory(cmd); - case 0x55: return aiRemoveReferencesToChr(cmd); - } - - while (1); -} +u8 *aiTick(u8 *ptr); void chraiExecute(void *entity, s32 proptype) { - u8 *cmd = NULL; - g_Vars.chrdata = NULL; g_Vars.truck = NULL; g_Vars.heli = NULL; g_Vars.hovercar = NULL; g_Vars.ailist = NULL; + g_Vars.aioffset = NULL; if (proptype == PROPTYPE_CHR) { g_Vars.chrdata = entity; @@ -7981,23 +79,19 @@ void chraiExecute(void *entity, s32 proptype) if (g_Vars.chrdata) { g_Vars.ailist = g_Vars.chrdata->ailist; - cmd = g_Vars.chrdata->aioffset; + g_Vars.aioffset = g_Vars.chrdata->aioffset; } else if (g_Vars.truck) { g_Vars.ailist = g_Vars.truck->ailist; - cmd = g_Vars.truck->aioffset; + g_Vars.aioffset = g_Vars.truck->aioffset; } else if (g_Vars.heli) { g_Vars.ailist = g_Vars.heli->ailist; - cmd = g_Vars.heli->aioffset; + g_Vars.aioffset = g_Vars.heli->aioffset; } else if (g_Vars.hovercar) { g_Vars.ailist = g_Vars.hovercar->ailist; - cmd = g_Vars.hovercar->aioffset; + g_Vars.aioffset = g_Vars.hovercar->aioffset; } if (g_Vars.ailist) { - if (!cmd) { - cmd = g_Vars.ailist; - } - if (g_Vars.chrdata) { chrAddTargetToBdlist(g_Vars.chrdata); } @@ -8014,7 +108,7 @@ void chraiExecute(void *entity, s32 proptype) // Set shot list g_Vars.chrdata->chrflags &= ~CHRCFLAG_TRIGGERSHOTLIST; g_Vars.ailist = ailistFindById(g_Vars.chrdata->aishotlist); - cmd = g_Vars.ailist; + g_Vars.aioffset = g_Vars.ailist; } } else if (g_Vars.chrdata && (g_Vars.chrdata->chrflags & CHRCFLAG_CONSIDER_DODGE)) { g_Vars.chrdata->chrflags &= ~CHRCFLAG_CONSIDER_DODGE; @@ -8034,7 +128,7 @@ void chraiExecute(void *entity, s32 proptype) && g_Vars.chrdata->actiontype != ACT_ATTACKROLL) { // Set shooting at me list g_Vars.ailist = ailistFindById(g_Vars.chrdata->aishootingatmelist); - cmd = g_Vars.ailist; + g_Vars.aioffset = g_Vars.ailist; g_Vars.chrdata->dodgerating = 0; } else { // Increase dodge rating @@ -8060,273 +154,33 @@ void chraiExecute(void *entity, s32 proptype) chrSetFlags(g_Vars.chrdata, CHRFLAG1_SEARCHSAMEROOM, BANK_1); g_Vars.chrdata->alertness = 0; g_Vars.ailist = ailistFindById(g_Vars.chrdata->aidarkroomlist); - cmd = g_Vars.ailist; + g_Vars.aioffset = g_Vars.ailist; } } else { // empty } // Iterate and execute the ailist - do { - switch (cmd[0]) { - case 0x00: cmd = aiGoToNext(cmd); break; - case 0x01: cmd = aiGoToFirst(cmd); break; - case 0x02: cmd = aiIfIdle(cmd); break; - case 0x03: cmd = aiTrySidestep(cmd); break; - case 0x04: cmd = aiTryJumpOut(cmd); break; - case 0x05: cmd = aiTryRunSideways(cmd); break; - case 0x06: cmd = aiTryAttackWalk(cmd); break; - case 0x07: cmd = aiTryAttackRoll(cmd); break; - case 0x08: cmd = aiTryAttackStand(cmd); break; - case 0x09: cmd = aiTryAttackKneel(cmd); break; - case 0x0a: cmd = aiTryModifyAttack(cmd); break; - case 0x0b: cmd = aiFaceEntity(cmd); break; - case 0x0c: cmd = aiConsiderGrenadeThrow(cmd); break; - case 0x0d: cmd = aiIfPatrolling(cmd); break; - case 0x0e: cmd = aiTryJogToTargetProp(cmd); break; - case 0x0f: cmd = aiTryWalkToTargetProp(cmd); break; - case 0x10: cmd = aiTryRunToTargetProp(cmd); break; - case 0x11: cmd = aiTryJogToChr(cmd); break; - case 0x12: cmd = aiTryRunToChr(cmd); break; - case 0x13: cmd = aiIfStopped(cmd); break; - case 0x14: cmd = aiIfChrDead(cmd); break; - case 0x15: cmd = aiIfChrDeathAnimationFinished(cmd); break; - case 0x16: cmd = aiIfTargetInSight(cmd); break; - case 0x17: cmd = aiIfRandomLessThan(cmd); break; - case 0x18: cmd = aiIfRandomGreaterThan(cmd); break; - case 0x19: cmd = aiIfCanHearAlarm(cmd); break; - case 0x1a: cmd = aiIfAlarmActive(cmd); break; - case 0x1b: cmd = aiIfHearsTarget(cmd); break; - case 0x1c: cmd = aiIfSawInjury(cmd); break; - case 0x1d: cmd = aiIfSawDeath(cmd); break; - case 0x1e: cmd = aiIfCanSeeTarget(cmd); break; - case 0x1f: cmd = aiIfNearlyInTargetsSight(cmd); break; - case 0x20: cmd = aiIfHeardTargetRecently(cmd); break; - case 0x21: cmd = ai0045(cmd); break; - case 0x22: cmd = aiIfNeverBeenOnScreen(cmd); break; - case 0x23: cmd = aiIfOnScreen(cmd); break; - case 0x24: cmd = aiIfRoomIsOnScreen(cmd); break; - case 0x25: cmd = ai004a(cmd); break; - case 0x26: cmd = aiIfNearMiss(cmd); break; - case 0x27: cmd = aiIfSeesSuspiciousItem(cmd); break; - case 0x28: cmd = aiIfTargetInFovLeft(cmd); break; - case 0x29: cmd = aiIfCheckFovWithTarget(cmd); break; - case 0x2a: cmd = aiIfTargetOutOfFovLeft(cmd); break; - case 0x2b: cmd = aiIfTargetInFov(cmd); break; - case 0x2c: cmd = aiIfDistanceToTargetLessThan(cmd); break; - case 0x2d: cmd = aiIfDistanceToTargetGreaterThan(cmd); break; - case 0x2e: cmd = aiIfChrDistanceToPadLessThan(cmd); break; - case 0x2f: cmd = aiIfChrDistanceToPadGreaterThan(cmd); break; - case 0x30: cmd = aiIfDistanceToChrLessThan(cmd); break; - case 0x31: cmd = aiIfDistanceToChrGreaterThan(cmd); break; - case 0x32: cmd = aiIfDistanceFromTargetToPadLessThan(cmd); break; - case 0x33: cmd = aiIfChrInRoom(cmd); break; - case 0x34: cmd = aiIfChrHasObject(cmd); break; - case 0x35: cmd = aiIfWeaponThrown(cmd); break; - case 0x36: cmd = aiIfWeaponThrownOnObject(cmd); break; - case 0x37: cmd = aiIfChrHasWeaponEquipped(cmd); break; - case 0x38: cmd = aiIfGunUnclaimed(cmd); break; - case 0x39: cmd = aiIfObjectHealthy(cmd); break; - case 0x3a: cmd = aiIfChrActivatedObject(cmd); break; - case 0x3b: cmd = aiIfDoorState(cmd); break; - case 0x3c: cmd = aiIfDoorLocked(cmd); break; - case 0x3d: cmd = aiIfObjectiveComplete(cmd); break; - case 0x3e: cmd = aiIfObjectiveFailed(cmd); break; - case 0x3f: cmd = ai0075(cmd); break; - case 0x40: cmd = aiSetPadPresetToTargetQuadrant(cmd); break; - case 0x41: cmd = aiIfDifficultyLessThan(cmd); break; - case 0x42: cmd = aiIfDifficultyGreaterThan(cmd); break; - case 0x43: cmd = aiIfStageIsNot(cmd); break; - case 0x44: cmd = aiIfNumArghsLessThan(cmd); break; - case 0x45: cmd = aiIfNumArghsGreaterThan(cmd); break; - case 0x46: cmd = aiIfInjured(cmd); break; - case 0x47: cmd = aiIfMoraleLessThan(cmd); break; - case 0x48: cmd = aiIfAlertness(cmd); break; - case 0x49: cmd = aiIfChrAlertnessLessThan(cmd); break; - case 0x4a: cmd = aiIfHasFlag(cmd); break; - case 0x4b: cmd = aiIfChrHasFlag(cmd); break; - case 0x4c: cmd = aiIfStageFlagEq(cmd); break; - case 0x4d: cmd = aiIfHasChrflag(cmd); break; - case 0x4e: cmd = aiIfChrHasChrflag(cmd); break; - case 0x4f: cmd = aiIfObjHasFlag2(cmd); break; - case 0x50: cmd = aiIfTimerLessThan(cmd); break; - case 0x51: cmd = aiIfTimerGreaterThan(cmd); break; - case 0x52: cmd = aiIfCountdownTimerLessThan(cmd); break; - case 0x53: cmd = aiIfCountdownTimerGreaterThan(cmd); break; - case 0x54: cmd = aiSpawnChrAtPad(cmd); break; - case 0x55: cmd = aiSpawnChrAtChr(cmd); break; - case 0x56: cmd = aiTryEquipWeapon(cmd); break; - case 0x57: cmd = aiDuplicateChr(cmd); break; - case 0x58: cmd = aiChrMoveToPad(cmd); break; - case 0x59: cmd = aiIfNumPlayersLessThan(cmd); break; - case 0x5a: cmd = aiIfChrAmmoQuantityLessThan(cmd); break; - case 0x5b: cmd = aiIfObjInRoom(cmd); break; - case 0x5c: cmd = aiIfAllObjectivesComplete(cmd); break; - case 0x5d: cmd = aiIfKillCountGreaterThan(cmd); break; - case 0x5e: cmd = aiIfPresetsTargetIsNotMyTarget(cmd); break; - case 0x5f: cmd = aiIfChrTarget(cmd); break; - case 0x60: cmd = aiIfChrShieldLessThan(cmd); break; - case 0x61: cmd = aiIfInCutscene(cmd); break; - case 0x62: cmd = aiIfObjHasFlag3(cmd); break; - case 0x63: cmd = aiIfChrHasHiddenFlag(cmd); break; - case 0x64: cmd = aiIfSkedar(cmd); break; - case 0x65: cmd = aiIfSafety2LessThan(cmd); break; - case 0x66: cmd = aiFindCover(cmd); break; - case 0x67: cmd = aiCheckCoverOutOfSight(cmd); break; - case 0x68: cmd = aiIfPlayerUsingCmpOrAr34(cmd); break; - case 0x69: cmd = aiDetectEnemyOnSameFloor(cmd); break; - case 0x6a: cmd = aiDetectEnemy(cmd); break; - case 0x6b: cmd = aiIfTargetMovingSlowly(cmd); break; - case 0x6c: cmd = aiIfTargetMovingCloser(cmd); break; - case 0x6d: cmd = aiIfTargetMovingAway(cmd); break; - case 0x6e: cmd = aiSetTeamOrders(cmd); break; - case 0x6f: cmd = aiIfOrders(cmd); break; - case 0x70: cmd = aiIfHasOrders(cmd); break; - case 0x71: cmd = aiIfChrInSquadronDoingAction(cmd); break; - case 0x72: cmd = aiIfChannelIdle(cmd); break; - case 0x73: cmd = aiSetChrPresetToUnalertedTeammate(cmd); break; - case 0x74: cmd = aiIfDangerousObjectNearby(cmd); break; - case 0x75: cmd = aiIfHoverbotNextStep(cmd); break; - case 0x76: cmd = aiIfSquadronIsDead(cmd); break; - case 0x77: cmd = aiIfNumChrsInSquadronGreaterThan(cmd); break; - case 0x78: cmd = aiIfChrInjured(cmd); break; - case 0x79: cmd = aiIfShieldDamaged(cmd); break; - case 0x7a: cmd = aiIfNaturalAnim(cmd); break; - case 0x7b: cmd = aiIfY(cmd); break; - case 0x7c: cmd = aiIfChrHasGun(cmd); break; - case 0x7d: cmd = aiDoGunCommand(cmd); break; - case 0x7e: cmd = aiIfDistanceToGunLessThan(cmd); break; - case 0x7f: cmd = aiRecoverGun(cmd); break; - case 0x80: cmd = aiChrCopyProperties(cmd); break; - case 0x81: cmd = ai0176(cmd); break; - case 0x82: cmd = aiIfCanSeeAttackTarget(cmd); break; - case 0x83: cmd = aiIfChrKnockedOut(cmd); break; - case 0x84: cmd = aiIfPlayerLookingAtObject(cmd); break; - case 0x85: cmd = aiPunchOrKick(cmd); break; - case 0x86: cmd = aiIfTargetIsPlayer(cmd); break; - case 0x87: cmd = aiIfSoundTimer(cmd); break; - case 0x88: cmd = aiSetTargetToEyespyIfInSight(cmd); break; - case 0x89: cmd = aiIfLiftStationary(cmd); break; - case 0x8a: cmd = aiMiniSkedarTryPounce(cmd); break; - case 0x8b: cmd = aiIfObjectDistanceToPadLessThan(cmd); break; - case 0x8c: cmd = aiIfObjHealthLessThan(cmd); break; - case 0x8d: cmd = aiIfChrNotTalking(cmd); break; - case 0x8e: cmd = aiIfNumKnockedOutChrs(cmd); break; - case 0x8f: cmd = ai01b4(cmd); break; - case 0x90: cmd = aiTryAttackLie(cmd); break; - case 0x91: cmd = aiIfPlayerUsingDevice(cmd); break; - case 0x92: cmd = aiIfCoopMode(cmd); break; - case 0x93: cmd = aiIfChrSameFloorDistanceToPadLessThan(cmd); break; - case 0x94: cmd = aiLabel(cmd); break; - case 0x95: cmd = aiYield(cmd); break; - case 0x96: cmd = aiEndList(cmd); break; - case 0x97: cmd = aiSetList(cmd); break; - case 0x98: cmd = aiSetReturnList(cmd); break; - case 0x99: cmd = aiSetShotList(cmd); break; - case 0x9a: cmd = aiReturn(cmd); break; - case 0x9b: cmd = aiStop(cmd); break; - case 0x9c: cmd = aiKneel(cmd); break; - case 0x9d: cmd = aiChrDoAnimation(cmd); break; - case 0x9e: cmd = ai0019(cmd); break; - case 0x9f: cmd = aiChrDamageChr(cmd); break; - case 0xa0: cmd = aiJogToPad(cmd); break; - case 0xa1: cmd = aiGoToPadPreset(cmd); break; - case 0xa2: cmd = aiWalkToPad(cmd); break; - case 0xa3: cmd = aiRunToPad(cmd); break; - case 0xa4: cmd = aiFadeOut(cmd); break; - case 0xa5: cmd = aiRemoveChr(cmd); break; - case 0xa6: cmd = aiActivateAlarm(cmd); break; - case 0xa7: cmd = aiDeactivateAlarm(cmd); break; - case 0xa8: cmd = aiRandom(cmd); break; - case 0xa9: cmd = aiDestroyObject(cmd); break; - case 0xaa: cmd = aiChrDropItems(cmd); break; - case 0xab: cmd = aiChrDropWeapon(cmd); break; - case 0xac: cmd = aiGiveObjectToChr(cmd); break; - case 0xad: cmd = aiObjectMoveToPad(cmd); break; - case 0xae: cmd = aiOpenDoor(cmd); break; - case 0xaf: cmd = aiCloseDoor(cmd); break; - case 0xb0: cmd = aiUnlockDoor(cmd); break; - case 0xb1: cmd = aiSetMorale(cmd); break; - case 0xb2: cmd = aiAddMorale(cmd); break; - case 0xb3: cmd = aiSubtractMorale(cmd); break; - case 0xb4: cmd = aiSetAlertness(cmd); break; - case 0xb5: cmd = aiAddAlertness(cmd); break; - case 0xb6: cmd = aiChrAddAlertness(cmd); break; - case 0xb7: cmd = aiSetHearDistance(cmd); break; - case 0xb8: cmd = aiSetViewDistance(cmd); break; - case 0xb9: cmd = aiSetFlag(cmd); break; - case 0xba: cmd = aiUnsetFlag(cmd); break; - case 0xbb: cmd = aiChrSetFlag(cmd); break; - case 0xbc: cmd = aiChrUnsetFlag(cmd); break; - case 0xbd: cmd = aiSetStageFlag(cmd); break; - case 0xbe: cmd = aiUnsetStageFlag(cmd); break; - case 0xbf: cmd = aiSetChrflag(cmd); break; - case 0xc0: cmd = aiUnsetChrflag(cmd); break; - case 0xc1: cmd = aiChrSetChrflag(cmd); break; - case 0xc2: cmd = aiChrUnsetChrflag(cmd); break; - case 0xc3: cmd = aiSetObjFlag(cmd); break; - case 0xc4: cmd = aiUnsetObjFlag(cmd); break; - case 0xc5: cmd = aiSetObjFlag2(cmd); break; - case 0xc6: cmd = aiUnsetObjFlag2(cmd); break; - case 0xc7: cmd = aiSetChrPreset(cmd); break; - case 0xc8: cmd = aiSetChrTarget(cmd); break; - case 0xc9: cmd = aiSetPadPreset(cmd); break; - case 0xca: cmd = aiRestartTimer(cmd); break; - case 0xcb: cmd = aiResetTimer(cmd); break; - case 0xcc: cmd = aiPauseTimer(cmd); break; - case 0xcd: cmd = aiResumeTimer(cmd); break; - case 0xce: cmd = aiShowHudmsg(cmd); break; - case 0xcf: cmd = aiShowHudmsgTopMiddle(cmd); break; - case 0xd0: cmd = aiSpeak(cmd); break; - case 0xd1: cmd = aiPlaySound(cmd); break; - case 0xd2: cmd = ai00cf(cmd); break; - case 0xd3: cmd = aiAudioMuteChannel(cmd); break; - case 0xd4: cmd = aiSetObjImage(cmd); break; - case 0xd5: cmd = aiSetDoorOpen(cmd); break; - case 0xd6: cmd = aiChrDrawWeapon(cmd); break; - case 0xd7: cmd = aiSetTarget(cmd); break; - case 0xd8: cmd = aiObjectDoAnimation(cmd); break; - case 0xd9: cmd = aiEnableChr(cmd); break; - case 0xda: cmd = aiDisableChr(cmd); break; - case 0xdb: cmd = aiEnableObj(cmd); break; - case 0xdc: cmd = aiDisableObj(cmd); break; - case 0xdd: cmd = aiSetObjFlag3(cmd); break; - case 0xde: cmd = aiUnsetObjFlag3(cmd); break; - case 0xdf: cmd = aiChrSetHiddenFlag(cmd); break; - case 0xe0: cmd = aiChrUnsetHiddenFlag(cmd); break; - case 0xe1: cmd = aiGoToCover(cmd); break; - case 0xe2: cmd = ai012f(cmd); break; - case 0xe3: cmd = aiSayQuip(cmd); break; - case 0xe4: cmd = aiIncreaseSquadronAlertness(cmd); break; - case 0xe5: cmd = aiSetAction(cmd); break; - case 0xe6: cmd = aiRetreat(cmd); break; - case 0xe7: cmd = ai0139(cmd); break; - case 0xe8: cmd = ai013e(cmd); break; - case 0xe9: cmd = aiRebuildTeams(cmd); break; - case 0xea: cmd = aiHovercopterFireRocket(cmd); break; - case 0xeb: cmd = aiDamageChrByAmount(cmd); break; - case 0xec: cmd = ai0175(cmd); break; - case 0xed: cmd = ai0179(cmd); break; - case 0xee: cmd = aiAssignSound(cmd); break; - case 0xef: cmd = ai0184(cmd); break; - case 0xf0: cmd = aiSetObjHealth(cmd); break; - case 0xf1: cmd = aiSetChrSpecialDeathAnimation(cmd); break; - case 0xf2: cmd = aiSetRoomToSearch(cmd); break; - case 0xf3: cmd = aiDoPresetAnimation(cmd); break; - case 0xf4: cmd = aiShowHudmsgMiddle(cmd); break; - case 0xf5: cmd = aiToggleP1P2(cmd); break; - case 0xf6: cmd = aiChrSetCloaked(cmd); break; - case 0xf7: cmd = aiSetAutogunTargetTeam(cmd); break; - case 0xf8: cmd = aiSetShootingAtMeList(cmd); break; - case 0xf9: cmd = aiSetDarkRoomList(cmd); break; - case 0xfa: cmd = aiFadeScreen(cmd); break; - case 0xfb: cmd = aiChrEmitSparks(cmd); break; - case 0xfc: cmd = aiChrKill(cmd); break; - case 0xfd: cmd = aiIfChrDeadish(cmd); break; - case 0xff: cmd = aiSubCommand(cmd); break; - default: - while (1); + { + u8 *cmd = g_Vars.aioffset; + + if (cmd) { + cmd = aiTick(cmd); + + if (g_Vars.chrdata) { + g_Vars.chrdata->ailist = g_Vars.ailist; + g_Vars.chrdata->aioffset = cmd; + } else if (g_Vars.truck) { + g_Vars.truck->ailist = g_Vars.ailist; + g_Vars.truck->aioffset = cmd; + } else if (g_Vars.heli) { + g_Vars.heli->ailist = g_Vars.ailist; + g_Vars.heli->aioffset = cmd; + } else if (g_Vars.hovercar) { + g_Vars.hovercar->ailist = g_Vars.ailist; + g_Vars.hovercar->aioffset = cmd; + } } - } while (cmd); + } } } diff --git a/src/game/chraiasm.s b/src/game/chraiasm.s new file mode 100644 index 000000000..4d0cbb877 --- /dev/null +++ b/src/game/chraiasm.s @@ -0,0 +1,39 @@ +#include "macros.inc" +.set noat +.set noreorder +.set gp=64 + +.text + +/** + * AI execution is entered via aiTick and exited through either aiYield + * or aiTerminate. + * + * aiTick's $a0 is a pointer to the code where the execution should be resumed. + * aiTick saves $ra to the stack before jumping to AI code so that execution can + * be returned to the caller once aiYield or aiTerminate is used. + * + * aiYield returns a pointer to the code where execution should be resumed on + * the next AI tick for this chr, while aiTerminate returns NULL. + * + * Stack usage: + * 0x20 = saved $ra + * 0x00 through 0x1c = function arguments used in AI code + */ + +glabel aiTick + addiu $sp, $sp, -0x28 + jr $a0 + sw $ra, 0x20($sp) + +glabel aiYield + move $v0, $ra + lw $ra, 0x20($sp) + jr $ra + addiu $sp, $sp, 0x28 + +glabel aiTerminate + move $v0, $zero + lw $ra, 0x20($sp) + jr $ra + addiu $sp, $sp, 0x28 diff --git a/src/game/chraicommands.c b/src/game/chraicommands.c index f923f83c5..9ee123348 100644 --- a/src/game/chraicommands.c +++ b/src/game/chraicommands.c @@ -1,54 +1,4385 @@ #include #include "constants.h" -#include "constants.h" -#include "game/bondmove.h" -#include "game/cheats.h" -#include "game/chraction.h" -#include "game/chrai.h" -#include "game/chraicommands.h" -#include "game/debug.h" -#include "game/dlights.h" -#include "game/playerreset.h" -#include "game/title.h" -#include "game/chr.h" -#include "game/prop.h" -#include "game/setuputils.h" -#include "game/propsnd.h" -#include "game/objectives.h" -#include "game/atan2f.h" -#include "game/bondgun.h" -#include "game/game_0b0fd0.h" -#include "game/modelmgr.h" -#include "game/player.h" -#include "game/hudmsg.h" -#include "game/inv.h" -#include "game/playermgr.h" -#include "game/explosions.h" -#include "game/smoke.h" -#include "game/weather.h" -#include "game/bg.h" -#include "game/stagetable.h" -#include "game/env.h" -#include "game/lv.h" -#include "game/music.h" -#include "game/training.h" -#include "game/gamefile.h" -#include "game/lang.h" -#include "game/pad.h" -#include "game/options.h" -#include "game/propobj.h" -#include "game/mpstats.h" #include "bss.h" -#include "lib/main.h" -#include "lib/model.h" -#include "lib/snd.h" -#include "lib/music.h" -#include "lib/rng.h" -#include "lib/mtx.h" +#include "data.h" #include "lib/ailist.h" #include "lib/anim.h" #include "lib/lib_317f0.h" -#include "lib/libc/ll.h" -#include "data.h" +#include "lib/main.h" +#include "lib/model.h" +#include "lib/mtx.h" +#include "lib/rng.h" +#include "lib/snd.h" +#include "game/atan2f.h" +#include "game/bg.h" +#include "game/bondgun.h" +#include "game/bondmove.h" +#include "game/cheats.h" +#include "game/chr.h" +#include "game/chraction.h" +#include "game/dlights.h" +#include "game/explosions.h" +#include "game/game_0b0fd0.h" +#include "game/hudmsg.h" +#include "game/inv.h" +#include "game/lang.h" +#include "game/lv.h" +#include "game/modelmgr.h" +#include "game/objectives.h" +#include "game/pad.h" +#include "game/player.h" +#include "game/playermgr.h" +#include "game/playerreset.h" +#include "game/prop.h" +#include "game/propobj.h" +#include "game/propsnd.h" +#include "game/smoke.h" +#include "game/stagetable.h" +#include "game/training.h" #include "types.h" +bool ai0045(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chr && chr->prop && chrHasLineOfSightToPos(g_Vars.chrdata, &chr->prop->pos, chr->prop->rooms); +} + +bool ai0075(s32 value) +{ + return func0f04a4ec(g_Vars.chrdata, value); +} + +void ai00cf(s32 channel, s32 tagnum, bool thing) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + audioPlayFromProp2(channel, -1, -1, obj->prop, thing, 2500, 3000, 0); + } +} + +void ai00d0(s32 padnum, s32 sound) +{ + propsnd0f0939f8(0, NULL, sound, padnum, -1, 2, 0, 0, 0, -1, 0, -1, -1, -1, -1); +} + +void ai0139(u32 angle, s32 arg1, s32 arg2) +{ + struct coord pos; + + chr0f04c874(g_Vars.chrdata, angle, &pos, arg1, arg2); +} + +void ai013e(void) +{ + if (func0f03aca0(g_Vars.chrdata, 400, true) == 0 && chrAssignCoverAwayFromDanger(g_Vars.chrdata, 1000, 12000) != -1) { + chrGoToCover(g_Vars.chrdata, GOPOSFLAG_RUN); + } +} + +void ai016b(s32 channel, s32 tagnum, s32 thing1, s32 thing2, s32 thing3) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + s32 thing1again; + + if (thing1 == 0) { + thing1again = -1; + } else { + thing1again = thing1; + } + + audioPlayFromProp2(channel, -1, -1, obj->prop, thing1again, thing2, thing3, 2); + } +} + +bool ai0176(void) +{ + if (g_Vars.chrdata->aibot->unk059 == 1) { + g_Vars.chrdata->aibot->unk059 = 0; + return true; + } + + return false; +} + +bool ai01b4(void) +{ + return g_Vars.chrdata + && g_Vars.chrdata->prop + && chr0f01f264(g_Vars.chrdata, &g_Vars.chrdata->prop->pos, g_Vars.chrdata->prop->rooms, 0, false); +} + +void aiActivateLift(s32 liftnum, s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + liftActivate(obj->prop, liftnum); + } +} + +void aiAddAlertness(s32 amount) +{ + incrementByte(&g_Vars.chrdata->alertness, amount); +} + +void aiAddHealth(f32 amount) +{ + chrAddHealth(g_Vars.chrdata, amount); +} + +void aiAddMorale(s32 amount) +{ + incrementByte(&g_Vars.chrdata->morale, amount); +} + +void aiAssignSound(s32 soundnum, s32 channel) +{ + audioPlayFromProp(channel, soundnum, -1, NULL, 11, 0); +} + +void aiAttackAmount(s32 value1, s32 value2) +{ + chrTryAttackAmount(g_Vars.chrdata, 512, 0, value1, value2); +} + +void aiAutoWalk(s32 chrref, s32 padnum, s32 walkspeed, s32 turnspeed, s32 lookup, s32 dist) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + playerAutoWalk(padnum, walkspeed, turnspeed, lookup, dist); + setCurrentPlayerNum(prevplayernum); + } +} + +void aiChrBeginTeleport(s32 chrref, s32 padnum) +{ + f32 fvalue; + struct chrdata *chr; + s32 mainpri; + u32 playernum; + u32 prevplayernum; + s32 audiopri; + struct sndstate *handle; + fvalue = 0.4; + + chr = chrFindById(g_Vars.chrdata, chrref); + prevplayernum = g_Vars.currentplayernum; + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + } + + g_Vars.currentplayer->teleporttime = 0; + g_Vars.currentplayer->teleportstate = TELEPORTSTATE_PREENTER; + g_Vars.currentplayer->teleportpad = padnum; + g_Vars.currentplayer->teleportcamerapad = 0; + + mainpri = osGetThreadPri(0); + audiopri = osGetThreadPri(&g_AudioManager.thread); + osSetThreadPri(0, audiopri + 1); + + handle = sndStart(var80095200, SFX_RELOAD_FARSIGHT, NULL, -1, -1, -1, -1, -1); + + if (handle) { + audioPostEvent(handle, 16, *(u32 *)&fvalue); + } + + osSetThreadPri(0, mainpri); + + setCurrentPlayerNum(prevplayernum); +} + +void aiChrEndTeleport(s32 chrref) +{ + struct chrdata *chr; + u32 playernum; + u32 prevplayernum; + + chr = chrFindById(g_Vars.chrdata, chrref); + prevplayernum = g_Vars.currentplayernum; + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + } + + g_Vars.currentplayer->teleportstate = TELEPORTSTATE_EXITING; + g_Vars.currentplayer->teleporttime = 0; + + setCurrentPlayerNum(prevplayernum); +} + +void aiCallRng(void) +{ + g_Vars.chrdata->random = random() & 0xff; +} + +bool aiCheckCoverOutOfSight(void) +{ + return chrCheckCoverOutOfSight(g_Vars.chrdata, g_Vars.chrdata->cover, false); +} + +void aiChrAddAlertness(s32 chrref, s32 amount) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + incrementByte(&chr->alertness, amount); + } +} + +void aiChrAddMotionBlur(s32 chrref, s32 amount) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->blurdrugamount += TICKS(amount); + } +} + +bool aiChrCopyProperties(s32 srcchrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, srcchrref); + + if (chr && chr->model) { + g_Vars.chrdata->hearingscale = chr->hearingscale; + g_Vars.chrdata->visionrange = chr->visionrange; + g_Vars.chrdata->padpreset1 = chr->padpreset1; + g_Vars.chrdata->chrpreset1 = chr->chrpreset1; + g_Vars.chrdata->flags = chr->flags; + g_Vars.chrdata->flags2 = chr->flags2; + g_Vars.chrdata->team = chr->team; + g_Vars.chrdata->squadron = chr->squadron; + g_Vars.chrdata->naturalanim = chr->naturalanim; + g_Vars.chrdata->myspecial = chr->myspecial; + g_Vars.chrdata->yvisang = chr->yvisang; + g_Vars.chrdata->teamscandist = chr->teamscandist; + + return true; + } + + return false; +} + +void aiChrDamageChr(s32 chr1num, s32 chr2num, s32 hitpart) +{ + struct chrdata *chr1 = chrFindById(g_Vars.chrdata, chr1num); + struct chrdata *chr2 = chrFindById(g_Vars.chrdata, chr2num); + + if (chr1 && chr2 && chr1->prop && chr2->prop) { + struct prop *prop = chrGetHeldUsableProp(chr1, HAND_RIGHT); + f32 damage; + struct coord vector = {0, 0, 0}; + struct weaponobj *weapon; + + if (!prop) { + prop = chrGetHeldUsableProp(chr1, HAND_LEFT); + } + + if (prop) { + vector.x = chr2->prop->pos.x - chr1->prop->pos.x; + vector.y = chr2->prop->pos.y - chr1->prop->pos.y; + vector.z = chr2->prop->pos.z - chr1->prop->pos.z; + guNormalize(&vector.x, &vector.y, &vector.z); + weapon = prop->weapon; + damage = gsetGetDamage(&weapon->gset); + chrDamageByImpact(chr2, damage, &vector, &weapon->gset, chr1->prop, hitpart); + } + } +} + +void aiChrDoAnimation(s32 anim_id, s32 startframe, s32 endframe, s32 chranimflags, s32 timemerge, s32 chrref, s32 animspeed) +{ + struct chrdata *chr = NULL; + f32 fstartframe; + f32 fendframe; + + if (g_Vars.chrdata) { + chr = chrFindById(g_Vars.chrdata, chrref); + } + + if (startframe == 0xffff) { + fstartframe = 0; + } else if (startframe == 0xfffe) { + fstartframe = animGetNumFrames(anim_id) - 1; + } else { + fstartframe = startframe; + } + + if (endframe == 0xffff) { + fendframe = -1.0f; + } else { + fendframe = endframe; + } + + if (chr && chr->model) { + f32 speed = 1.0f / animspeed; + + if (g_Vars.in_cutscene) { + if (startframe != 0xfffe) { + fstartframe += g_CutsceneFrameOverrun240 * speed * 0.25f; + } + + chr->prop->propupdate240 = 0; + } + + chrTryStartAnim(chr, anim_id, fstartframe, fendframe, chranimflags, timemerge, speed); + + if (startframe == 0xfffe) { + chr0f0220ec(chr, 1, 1); + + if (chr->prop->type == PROPTYPE_PLAYER) { + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + struct player *player = g_Vars.players[playernum]; + player->vv_ground = chr->ground; + player->vv_manground = chr->ground; + } + } + } +} + +void aiChrEmitSparks(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chrDrCarollEmitSparks(chr); + } +} + +void aiChrExplosions(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + playerSurroundWithExplosions(0); + setCurrentPlayerNum(prevplayernum); + } +} + +void aiChrGrabObject(s32 chrref, s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER && obj && obj->prop) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + + if (g_Vars.currentplayer->bondmovemode == MOVEMODE_WALK + && bmoveGetCrouchPos() == CROUCHPOS_STAND + && g_Vars.currentplayer->crouchoffset == 0) { + bmoveGrabProp(obj->prop); + } + + setCurrentPlayerNum(prevplayernum); + } +} + +void aiChrKill(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->actiontype = ACT_DEAD; + chr->act_dead.fadetimer60 = -1; + chr->act_dead.fadenow = false; + chr->act_dead.fadewheninvis = false; + chr->act_dead.invistimer60 = 0; + chr->act_dead.notifychrindex = 0; + chr->sleep = 0; + chr->chrflags |= CHRCFLAG_KEEPCORPSEKO | CHRCFLAG_PERIMDISABLEDTMP; + } +} + +bool aiChrMoveToChr(s32 chrref, s32 chrref2) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + struct chrdata *chr2 = chrFindById(g_Vars.chrdata, chrref2); + + if (chr2 && chr2->prop) { + f32 theta = chrGetInverseTheta(chr2); + return chrMoveToPos(chr, &chr2->prop->pos, chr2->prop->rooms, theta, 0); + } + } + + return false; +} + +bool aiChrMoveToPad(s32 chrref, s32 padnum, bool allowonscreen) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + padnum = chrResolvePadId(chr, padnum); + + if (padnum >= 0) { + struct pad *pad = &g_Pads[padnum]; + f32 theta = atan2f(pad->look.x, pad->look.z); + s16 rooms[2]; + + rooms[0] = pad->room; + rooms[1] = -1; + + return chrMoveToPos(chr, &pad->pos, rooms, theta, allowonscreen); + } + } + + return false; +} + +void aiChrSetCutsceneWeapon(s32 chrref, s32 weapon1num, s32 weapon2num) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + s32 model_id = playermgrGetModelOfWeapon(weapon1num); + s32 fallback_model_id = playermgrGetModelOfWeapon(weapon2num); + + if (chr) { + if (weapon1num == 0xff) { + if (weapon2num == 0xff) { + if (chr->weapons_held[0]) { + struct weaponobj *weapon = chr->weapons_held[0]->weapon; + bool valid = true; + + switch (weapon->weaponnum) { + case WEAPON_FALCON2: + case WEAPON_FALCON2_SILENCER: + case WEAPON_FALCON2_SCOPE: + case WEAPON_MAGSEC4: + case WEAPON_MAULER: + case WEAPON_PHOENIX: + case WEAPON_DY357MAGNUM: + case WEAPON_DY357LX: + case WEAPON_CMP150: + valid = false; + } + + if (valid) { + weaponDeleteFromChr(chr, HAND_LEFT); + weaponDeleteFromChr(chr, HAND_RIGHT); + } + } + } else { + if (chr->weapons_held[0] == NULL && chr->weapons_held[1] == NULL && fallback_model_id >= 0) { + weaponCreateForChr(chr, fallback_model_id, weapon2num, 0, NULL, NULL); + } + } + } else { + weaponDeleteFromChr(chr, HAND_LEFT); + weaponDeleteFromChr(chr, HAND_RIGHT); + + if (model_id >= 0) { + weaponCreateForChr(chr, model_id, weapon1num, 0, NULL, NULL); + } + + if (fallback_model_id >= 0) { + weaponCreateForChr(chr, fallback_model_id, weapon2num, OBJFLAG_WEAPON_LEFTHANDED, NULL, NULL); + } + } + } +} + +void aiChrSetFiringInCutscene(s32 chrref, bool firing) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + struct coord from = {0, 0, 0}; + struct coord to = {0, 0, 0}; + + if (chr && chr->weapons_held[HAND_RIGHT]) { + if (firing) { + chrSetFiring(chr, HAND_RIGHT, true); + chrCreateFireslot(chr, HAND_RIGHT, true, false, &from, &to); + } else { + chrSetFiring(chr, HAND_RIGHT, false); + } + } +} + +void aiChrSetFlag(s32 chrref, s32 bank, u32 flag) +{ + chrSetFlagsById(g_Vars.chrdata, chrref, flag, bank); +} + +void aiChrSetChrflag(s32 chrref, u32 flag) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->chrflags |= flag; + } +} + +void aiChrSetCloaked(s32 chrref, bool enable, bool withsound) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && !chrIsDead(chr)) { + if (enable) { + chrCloak(chr, withsound); + } else { + chrUncloak(chr, withsound); + } + } +} + +void aiChrSetHiddenFlag(s32 chrref, u32 flag) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->hidden |= flag; + } +} + +void aiChrSetInvincible(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + g_PlayerInvincible = true; + } +} + +void aiChrSetTeam(s32 chrref, s32 team) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->team = team; + } +} + +void aiChrToggleModelPart(s32 chrref, s32 partnum) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chrToggleModelPart(chr, partnum); + } +} + +void aiChrToggleP1P2(s32 chrref) +{ + if (g_Vars.coopplayernum >= 0) { + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + if (chr->p1p2 == g_Vars.bondplayernum && !g_Vars.coop->isdead) { + chr->p1p2 = g_Vars.coopplayernum; + } else if (!g_Vars.bond->isdead) { + chr->p1p2 = g_Vars.bondplayernum; + } + } + } +} + +void aiChrUnsetChrflag(s32 chrref, u32 flag) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->chrflags &= ~flag; + } +} + +void aiChrUnsetFlag(s32 chrref, u32 flag, s32 bank) +{ + chrUnsetFlagsById(g_Vars.chrdata, chrref, flag, bank); +} + +void aiChrUnsetHiddenFlag(s32 chrref, u32 flag) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->hidden &= ~flag; + } +} + +void aiClearInventory(void) +{ + u32 prevplayernum = g_Vars.currentplayernum; + s32 playernum; + + for (playernum = 0; playernum < PLAYERCOUNT(); playernum++) { + setCurrentPlayerNum(playernum); + + if (g_Vars.currentplayer == g_Vars.bond || g_Vars.currentplayer == g_Vars.coop) { + invClear(); + g_Vars.currentplayer->devicesactive = 0; + invGiveSingleWeapon(WEAPON_UNARMED); + bgunEquipWeapon(WEAPON_UNARMED); + } + } + + setCurrentPlayerNum(prevplayernum); +} + +void aiCloseDoor(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { + struct doorobj *door = (struct doorobj *) obj; + doorsRequestMode(door, DOORMODE_CLOSING); + } +} + +bool aiConsiderGrenadeThrow(void) +{ + return chrConsiderGrenadeThrow(g_Vars.chrdata, 512, 0); +} + +void aiDamageChrByAmount(s32 chrref, f32 damage) +{ + struct coord coord = {0, 0, 0}; + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + chrDamageByMisc(chr, damage, &coord, NULL, NULL); + } +} + +void aiDamageAndPoisonChrByAmount(s32 chrref, f32 damage) +{ + struct coord coord = {0, 0, 0}; + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + struct gset gset = {WEAPON_COMBATKNIFE, 0, 0, FUNC_POISON}; + chrDamageByMisc(chr, damage, &coord, &gset, NULL); + } +} + +void aiDamageChr(s32 chrref, s32 hitpart, u32 gset) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + struct coord pos = {0, 0, 0}; + + if (chr && chr->prop) { + f32 damage = gsetGetDamage((struct gset *)&gset); + chrDamageByImpact(chr, damage, &pos, (struct gset *)&gset, NULL, hitpart); + } +} + +void aiDestroyObject(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && objGetDestroyedLevel(obj) == 0) { + struct defaultobj *entity = obj->prop->obj; + + if (entity->modelnum == MODEL_ELVIS_SAUCER) { + obj->flags = (obj->flags & ~OBJFLAG_00010000) | OBJFLAG_INVINCIBLE; + explosionCreateSimple(entity->prop, &entity->prop->pos, entity->prop->rooms, EXPLOSIONTYPE_LAPTOP, 0); + smokeCreateAtProp(entity->prop, SMOKETYPE_UFO); + } else { + f32 damage = ((obj->maxdamage - obj->damage) + 1) / 250.0f; + objDamage(obj, damage, &obj->prop->pos, WEAPON_REMOTEMINE, -1); + } + } +} + +bool aiDetectEnemy(f32 maxdist) +{ + s16 *chrnums; + s32 team = 0; + f32 closestdist = 10000000; + s16 closesttarg = -1; + + chrnums = teamGetChrIds(1); + + if (!g_Vars.chrdata) { + return false; + } + + /** + * Iterate all the chrs in team order. Generally the outer loop iterates the + * teams and the inner loop iterates the chrs within that team, but for the + * chr's current team the inner loop won't iterate so the outer loop handles + * it. + * + * The chrnums list returned by teamGetChrIds is an array of chrnums in + * team 1 terminated by a -2, then an array of chrnums in team 2 terminated + * by -2, and so on. + */ + do { + u8 teamvalue = (1 << team); + + while (*chrnums != -2 && g_Vars.chrdata->team != teamvalue) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->prop + && !chrIsDead(chr) + && chr->actiontype != ACT_DEAD + && chr->actiontype != ACT_DIE + && chr->actiontype != ACT_DRUGGEDKO + && chr->actiontype != ACT_DRUGGEDDROP + && chr->actiontype != ACT_DRUGGEDCOMINGUP + && chrCompareTeams(g_Vars.chrdata, chr, COMPARE_ENEMIES) + && chr != g_Vars.chrdata + && (chr->hidden & CHRHFLAG_CLOAKED) == 0 + && (chr->chrflags & CHRCFLAG_HIDDEN) == 0 + && (chr->hidden & CHRHFLAG_DISGUISED) == 0 + && chr->team != TEAM_NONCOMBAT + && ( + (g_Vars.chrdata->hidden & CHRHFLAG_PSYCHOSISED) == 0 + || (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0 + || (chr->hidden & CHRHFLAG_DONTSHOOTME))) { + f32 distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum); + + if (distance < maxdist && distance != 0 && distance < closestdist + && chrCanSeeProp(g_Vars.chrdata, chr->prop) + && (chr->chrflags & CHRCFLAG_HIDDEN) == 0) { + if (g_Vars.chrdata->yvisang == 0) { + closestdist = distance; + closesttarg = chr->chrnum; + } else { + s16 prevtarget = g_Vars.chrdata->target; + g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum); + + if (chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang)) { + closestdist = distance; + closesttarg = chr->chrnum; + } + + g_Vars.chrdata->target = prevtarget; + } + } + } + + chrnums++; + } + + // If the inner loop was at the end of the current team, + // move to the next team + if (*chrnums == -2) { + team++; + } + + // And progress chrnums past the -2 terminator + chrnums++; + } while (team < 8); + + if (closesttarg != -1) { + g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, closesttarg); + return true; + } + + return false; +} + +bool aiDetectEnemyOnSameFloor(void) +{ + s32 team = 0; + f32 closestdist = 9999.9; + f32 distance; + u32 stack[2]; + f32 y; + f32 scandist; + s16 *chrnums = teamGetChrIds(1); + struct chrdata *chr; + s16 newtarget = -1; + + if (g_Vars.chrdata->teamscandist == 0) { + scandist = 1500; + } else if (g_Vars.chrdata->teamscandist == 255) { + scandist = 9999; + } else { + scandist = g_Vars.chrdata->teamscandist * 40.0f; + } + + y = g_Vars.chrdata->prop->pos.y; + + while (team < 8) { + chr = chrFindByLiteralId(*chrnums); + + if (*chrnums != -2) { + if (chr && chr->prop + && chr->team != TEAM_NONCOMBAT + && !chrIsDead(chr) + && chr->actiontype != ACT_DEAD + && chr->actiontype != ACT_DRUGGEDKO + && chr->actiontype != ACT_DRUGGEDDROP + && chr->actiontype != ACT_DRUGGEDCOMINGUP + && chrCompareTeams(g_Vars.chrdata, chr, COMPARE_ENEMIES) + && (chr->hidden & CHRHFLAG_CLOAKED) == 0 + && (chr->chrflags & CHRCFLAG_HIDDEN) == 0 + && (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0 + && y - chr->prop->pos.y > -200 + && y - chr->prop->pos.y < 200 + && ((g_Vars.chrdata->hidden & CHRHFLAG_PSYCHOSISED) == 0 + || (chr->hidden & CHRHFLAG_ANTINONINTERACTABLE) == 0 + || (chr->hidden & CHRHFLAG_DONTSHOOTME)) + && g_Vars.chrdata->chrnum != chr->chrnum) { + distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum); + + if (distance < closestdist) { + if (distance < scandist || stageGetIndex(g_Vars.stagenum) == STAGEINDEX_MAIANSOS) { + if (distance < closestdist) { + closestdist = distance; + newtarget = chr->chrnum; + } + } + } + } + + chrnums++; + } else { + chrnums++; + team++; + } + } + + if (newtarget != -1) { + g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, newtarget); + return true; + } + + return false; +} + +void aiDoPresetAnimation(u32 value) +{ + // These all appear to be talking animations + static u16 anims[] = { + /* 0*/ ANIM_0296, + /* 1*/ ANIM_0297, + /* 2*/ ANIM_0298, + /* 3*/ ANIM_028A, // when value is 3 (1/2 chance) + /* 4*/ ANIM_028C, // when value is 3 (1/2 chance) + /* 5*/ ANIM_0290, + /* 6*/ ANIM_0291, + /* 7*/ ANIM_TALKING_00A3, // when value is 255 (1/8 chance) + /* 8*/ ANIM_028E, // when value is 255 (1/8 chance) + /* 9*/ ANIM_028F, // when value is 255 (1/8 chance) + /*10*/ ANIM_TALKING_0231, // when value is 255 (1/8 chance) + /*11*/ ANIM_TALKING_0232, // when value is 255 (1/8 chance) + /*12*/ ANIM_TALKING_0233, // when value is 255 (1/8 chance) + /*13*/ ANIM_TALKING_0234, // when value is 255 (1/8 chance) + /*14*/ ANIM_028D, // when value is 255 (1/8 chance) + }; + + if (value == 255) { + chrTryStartAnim(g_Vars.chrdata, anims[7 + (random() % 8)], 0, -1, 0, 15, 0.5); + } else if (value == 254) { + struct prop *prop0 = chrGetHeldProp(g_Vars.chrdata, 1); + struct prop *prop1 = chrGetHeldProp(g_Vars.chrdata, 0); + + if (weaponIsOneHanded(prop0) || weaponIsOneHanded(prop1)) { + chrTryStartAnim(g_Vars.chrdata, ANIM_FIX_GUN_JAM_EASY, 0, -1, 0, 5, 0.5); + } else { + chrTryStartAnim(g_Vars.chrdata, ANIM_FIX_GUN_JAM_HARD, 0, -1, 0, 5, 0.5); + } + } else if (value == 3) { + chrTryStartAnim(g_Vars.chrdata, anims[3 + (random() & 1)], 0, -1, 0, 15, 0.5); + } else { + chrTryStartAnim(g_Vars.chrdata, anims[value], 0, -1, 0, 15, 0.5); + } +} + +void aiChrDrawWeapon(s32 chrref, s32 weaponnum) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + bgunEquipWeapon2(0, weaponnum); + bgunEquipWeapon2(1, 0); + setCurrentPlayerNum(prevplayernum); + } +} + +void aiChrDrawWeaponInCutscene(s32 chrref, s32 weaponnum) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + bgunEquipWeapon(weaponnum); + setCurrentPlayerNum(prevplayernum); + } +} + +void aiChrDropItems(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + chrDropConcealedItems(chr); + } +} + +void aiChrDropWeapon(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + if (chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + u32 weaponnum; + setCurrentPlayerNum(playernum); + weaponnum = bgunGetWeaponNum(HAND_RIGHT); + invRemoveItemByNum(weaponnum); + bgunCycleBack(); + setCurrentPlayerNum(prevplayernum); + } else { + if (chr->weapons_held[0]) { + objSetDropped(chr->weapons_held[0], DROPTYPE_DEFAULT); + chr->hidden |= CHRHFLAG_00000001; + } + + if (chr->weapons_held[1]) { + objSetDropped(chr->weapons_held[1], DROPTYPE_DEFAULT); + chr->hidden |= CHRHFLAG_00000001; + } + } + } +} + +void aiDisableChr(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->model) { + propDeregisterRooms(chr->prop); + propDelist(chr->prop); + propDisable(chr->prop); + } +} + +void aiDisableObj(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->model) { + if (obj->prop->parent) { + objDetach(obj->prop); + } else { + propDeregisterRooms(obj->prop); + propDelist(obj->prop); + propDisable(obj->prop); + } + } +} + +bool aiDuplicateChr(s32 chrref, s32 ailistid, u32 spawnflags) +{ + u8 *ailist = ailistFindById(ailistid); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + struct chrdata *clone = NULL; + struct weaponobj *srcweapon1 = NULL; + struct prop *cloneprop = NULL; + struct weaponobj *srcweapon0 = NULL; + struct prop *srcweapon0prop = NULL; + struct prop *cloneweapon0prop = NULL; + struct prop *srcweapon1prop = NULL; + struct weaponobj *cloneweapon1 = NULL; + struct weaponobj *cloneweapon0 = NULL; + struct prop *cloneweapon1prop = NULL; + + if (chr && (chr->chrflags & CHRCFLAG_CLONEABLE)) { + cloneprop = chrSpawnAtChr(g_Vars.chrdata, chr->bodynum, -1, chr->chrnum, ailist, spawnflags); + + if (cloneprop) { + clone = cloneprop->chr; + chrSetChrnum(clone, chrsGetNextUnusedChrnum()); + chr->chrdup = clone->chrnum; + + srcweapon0prop = chrGetHeldProp(chr, 0); + + if (srcweapon0prop) { + srcweapon0 = srcweapon0prop->weapon; + cloneweapon0prop = chrGiveWeapon(clone, srcweapon0->base.modelnum, srcweapon0->weaponnum, 0); + + if (cloneweapon0prop) { + cloneweapon0 = cloneweapon0prop->weapon; + } + } + + srcweapon1prop = chrGetHeldProp(chr, 1); + + if (srcweapon1prop) { + srcweapon1 = srcweapon1prop->weapon; + cloneweapon1prop = chrGiveWeapon(clone, srcweapon1->base.modelnum, srcweapon1->weaponnum, OBJFLAG_WEAPON_LEFTHANDED); + + if (cloneweapon1prop) { + cloneweapon1 = cloneweapon1prop->weapon; + } + } + + if (srcweapon1 && srcweapon0 + && cloneweapon1 && cloneweapon0 + && srcweapon0 == srcweapon1->dualweapon && srcweapon1 == srcweapon0->dualweapon) { + propweaponSetDual(cloneweapon1, cloneweapon0); + } + + if (chr->weapons_held[2]) { + struct defaultobj *obj = chr->weapons_held[2]->obj; + hatCreateForChr(clone, obj->modelnum, 0); + } + + clone->flags = chr->flags; + clone->flags2 = chr->flags2; + clone->padpreset1 = chr->padpreset1; + + if (g_Vars.normmplayerisrunning == false + && g_MissionConfig.iscoop + && g_Vars.numaibuddies > 0) { + clone->flags |= CHRFLAG0_AIVSAI; + } + + if (spawnflags & SPAWNFLAG_HIDDEN) { + clone->chrflags &= CHRCFLAG_HIDDEN; + } + + clone->team = chr->team; + clone->squadron = chr->squadron; + clone->voicebox = chr->voicebox; + + rebuildTeams(); + rebuildSquadrons(); + + return true; + } + } + + return false; +} + +void aiEnableChr(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->model) { + propActivate(chr->prop); + propEnable(chr->prop); + chr0f0220ac(chr); + } +} + +void aiEnableObj(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->model) { + propActivate(obj->prop); + propEnable(obj->prop); + + if (g_Vars.currentplayer->eyespy == NULL && obj->type == OBJTYPE_WEAPON) { + struct weaponobj *weapon = (struct weaponobj *) obj; + + if (weapon->weaponnum == WEAPON_EYESPY) { + playerInitEyespy(); + } + } + } +} + +void aiEndLevel(void) +{ + if (g_IsTitleDemo) { + mainChangeToStage(STAGE_TITLE); + } else if (g_Vars.autocutplaying) { + g_Vars.autocutfinished = true; + } else { + func0000e990(); + } +} + +void aiFadeOut(void) +{ + chrFadeOut(g_Vars.chrdata); +} + +bool aiFindCover(u32 criteria) +{ + return g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, 0) != -1; +} + +s32 aiGetAlertness(void) +{ + return g_Vars.chrdata->alertness; +} + +f32 aiGetAngleToTarget(void) +{ + return chrGetAngleToTarget(g_Vars.chrdata); +} + +f32 aiGetChrShield(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chrGetShield(chr); +} + +bool aiIfRoomIsOnScreen(s32 padnum) +{ + s32 roomnum = chrGetPadRoom(g_Vars.chrdata, padnum); + + return roomnum >= 0 && roomIsOnscreen(roomnum); +} + +f32 aiGetDistanceFromTargetToPad(s32 pad) +{ + return chrGetDistanceFromTargetToPad(g_Vars.chrdata, pad); +} + +f32 aiGetDistanceToChr(s32 chrref) +{ + return chrGetDistanceToChr(g_Vars.chrdata, chrref); +} + +f32 aiGetDistanceToTarget(void) +{ + return chrGetDistanceToTarget(g_Vars.chrdata); +} + +s32 aiGetHoverbotNextStep(void) +{ + if (g_Vars.hovercar) { + return g_Vars.hovercar->nextstep; + } + + return 0; +} + +s32 aiGetKillCount(void) +{ + return g_Vars.killcount; +} + +s32 aiGetNumChrsInSquadron(s32 squadron) +{ + s32 count = 0; + s16 *chrnums = squadronGetChrIds(squadron); + + if (chrnums) { + while (*chrnums != -2) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->prop && chrIsDead(chr) == false + && chr->actiontype != ACT_DEAD + && chr->actiontype != ACT_DRUGGEDKO + && chr->actiontype != ACT_DRUGGEDDROP + && chr->actiontype != ACT_DRUGGEDCOMINGUP) { + count++; + } + + chrnums++; + } + } + + return count; +} + +s32 aiGetNumPlayers(void) +{ + return PLAYERCOUNT(); +} + +s32 aiGetNumTimesShot(void) +{ + return chrGetNumArghs(g_Vars.chrdata); +} + +s32 aiGetObjDamage(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (!obj || !obj->prop) { + return 0; + } + + return obj->damage; +} + +s32 aiGetSoundTimer(void) +{ + return g_Vars.chrdata->soundtimer; +} + +s32 aiGetTimer(void) +{ + if (g_Vars.chrdata) { + return chrGetTimer(g_Vars.chrdata); + } + + if (g_Vars.hovercar) { + return chopperGetTimer(g_Vars.hovercar); + } + + return 0; +} + +s32 aiGetRandom(void) +{ + if (g_Vars.chrdata) { + return g_Vars.chrdata->random; + } + + if (g_Vars.hovercar) { + return random() & 0xff; + } + + return 0; +} + +void aiGiveObjectToChr(s32 tagnum, s32 chrref) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (obj && obj->prop && chr && chr->prop) { + if (chr->prop->type == PROPTYPE_PLAYER) { + u32 something; + u32 prevplayernum = g_Vars.currentplayernum; + struct defaultobj *obj2 = obj->prop->obj; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + + if (obj->prop->parent) { + objDetach(obj->prop); + objFreeEmbedmentOrProjectile(obj->prop); + propActivate(obj->prop); + } + + something = propPickupByPlayer(obj->prop, 0); + propExecuteTickOperation(obj->prop, something); + playernum = playermgrGetPlayerNumByProp(chr->prop); + obj2->hidden = (playernum << 28) | (obj2->hidden & 0x0fffffff); + setCurrentPlayerNum(prevplayernum); + } else { + if (obj->prop->parent) { + objDetach(obj->prop); + } else { + propDeregisterRooms(obj->prop); + propDelist(obj->prop); + propDisable(obj->prop); + } + + if (obj->type != OBJTYPE_WEAPON || chrEquipWeapon((struct weaponobj *) obj, chr) == 0) { + propReparent(obj->prop, chr->prop); + } + } + } +} + +void aiGoToCover(u32 speed) +{ + chrGoToCover(g_Vars.chrdata, speed); +} + +void aiGoToGun(void) +{ + chrGoToProp(g_Vars.chrdata, g_Vars.chrdata->gunprop, GOPOSFLAG_JOG); +} + +void aiGoToPadPreset(s32 speed) +{ + chrGoToPad(g_Vars.chrdata, g_Vars.chrdata->padpreset1, speed); +} + +void aiGrantControl(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + setCurrentPlayerNum(playermgrGetPlayerNumByProp(chr->prop)); + bgunSetSightVisible(GUNSIGHTREASON_NOCONTROL, true); + bgunSetGunAmmoVisible(GUNAMMOREASON_NOCONTROL, true); + hudmsgsSetOn(HUDMSGREASON_NOCONTROL); + countdownTimerSetVisible(COUNTDOWNTIMERREASON_NOCONTROL, true); + g_PlayersWithControl[g_Vars.currentplayernum] = true; + setCurrentPlayerNum(prevplayernum); + } +} + +void aiHeliArmWeapons(void) +{ + if (g_Vars.hovercar) { + chopperSetArmed(g_Vars.hovercar, true); + } +} + +void aiHideCutsceneChrs(void) +{ + s32 i; + + for (i = chrsGetNumSlots() - 1; i >= 0; i--) { + if (g_ChrSlots[i].chrnum >= 0 && g_ChrSlots[i].prop && + (g_ChrSlots[i].chrflags & (CHRCFLAG_UNPLAYABLE | CHRCFLAG_HIDDEN)) == 0) { + g_ChrSlots[i].hidden2 |= CHRH2FLAG_HIDDENFORCUTSCENE; + g_ChrSlots[i].chrflags |= CHRCFLAG_HIDDEN; + } + } +} + +void aiHovercarBeginPath(s32 pathid) +{ + struct path *path = pathFindById(pathid); + + if (g_Vars.hovercar) { + struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar); + g_Vars.hovercar->path = path; + g_Vars.hovercar->nextstep = 0; + g_Vars.hovercar->path->flags |= PATHFLAG_INUSE; + + if (chopper) { + chopper->targetvisible = false; + chopper->attackmode = CHOPPERMODE_PATROL; + chopper->turnrot60 = 0; + chopper->roty = 0; + chopper->rotx = 0; + chopper->gunroty = 0; + chopper->gunrotx = 0; + chopper->barrelrot = 0; + chopper->barrelrotspeed = 0; + chopper->vz = 0; + chopper->vy = 0; + chopper->vx = 0; + chopper->otz = 0; + chopper->oty = 0; + chopper->otx = 0; + chopper->power = 0; + chopper->bob = 0; + chopper->bobstrength = 0.05; + chopper->timer60 = 0; + chopper->patroltimer60 = 0; + chopper->cw = 0; + chopper->weaponsarmed = true; + chopper->base.flags |= OBJFLAG_20000000; + } else { + g_Vars.hovercar->weaponsarmed = false; + } + } +} + +void aiHovercopterFireRocket(s32 side) +{ + chopperFireRocket(g_Vars.hovercar, side); +} + +bool aiIfAnyoneActivatedObject(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + if (obj->hidden & (OBJHFLAG_ACTIVATED_BY_BOND | OBJHFLAG_ACTIVATED_BY_COOP)) { + obj->hidden &= ~(OBJHFLAG_ACTIVATED_BY_BOND | OBJHFLAG_ACTIVATED_BY_COOP); + return true; + } + } + + return false; +} + +bool aiIfAutoWalkFinished(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return !(chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER && g_Vars.tickmode == TICKMODE_AUTOWALK); +} + +bool aiIfCanHearAlarm(void) +{ + return chrCanHearAlarm(g_Vars.chrdata); +} + +bool aiIfCanSeeAttackTarget(void) +{ + return (g_Vars.chrdata && g_Vars.chrdata->prop && chrCanSeeAttackTarget(g_Vars.chrdata, &g_Vars.chrdata->prop->pos, g_Vars.chrdata->prop->rooms, true)) + || (g_Vars.hovercar && chopperCheckTargetInFov(g_Vars.hovercar, 64) && chopperCheckTargetInSight(g_Vars.hovercar)); +} + +bool aiIfCanSeeTarget(void) +{ + return (g_Vars.chrdata && chrCanSeeTarget(g_Vars.chrdata)) + || (g_Vars.hovercar && chopperCheckTargetInFov(g_Vars.hovercar, 64) && chopperCheckTargetInSight(g_Vars.hovercar)); +} + +bool aiIfChrActivatedObject(s32 chrref, s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + if (chr->prop == g_Vars.bond->prop && (obj->hidden & OBJHFLAG_ACTIVATED_BY_BOND)) { + obj->hidden &= ~OBJHFLAG_ACTIVATED_BY_BOND; + return true; + } + + if (g_Vars.coopplayernum >= 0 && chr->prop == g_Vars.coop->prop && (obj->hidden & OBJHFLAG_ACTIVATED_BY_COOP)) { + obj->hidden &= ~OBJHFLAG_ACTIVATED_BY_COOP; + return true; + } + } + } + + return false; +} + +bool aiIfChrDead(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (!chr) { + return true; + } + + if (chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + return false; + } + + if (!chr->model || chr->actiontype == ACT_DEAD || chr->actiontype == ACT_DIE) { + return true; + } + + return false; +} + +bool aiIfChrDeadish(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + bool dead = false; + + if (!chr || !chr->prop) { + dead = true; + } else if (chr->prop->type == PROPTYPE_PLAYER) { + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + dead = g_Vars.players[playernum]->isdead; + } else { + if (!chr->model + || chr->actiontype == ACT_DEAD + || chr->actiontype == ACT_DIE + || chr->actiontype == ACT_DRUGGEDKO + || chr->actiontype == ACT_DRUGGEDDROP + || chr->actiontype == ACT_DRUGGEDCOMINGUP) { + dead = true; + } + } + + return dead; +} + +bool aiIfChrDeathAnimationFinished(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (!chr || !chr->prop) { + return true; + } + + if (chr->prop->type == PROPTYPE_PLAYER) { + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + return g_Vars.players[playernum]->isdead; + } + + return chr->actiontype == ACT_DEAD; +} + +bool aiIfChrDistanceToPadGreaterThan(s32 chrref, s32 padnum, f32 distance) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (padnum == 9000) { + padnum = g_Vars.chrdata->padpreset1; + } + + return chr && padnum < 9000 && chrGetDistanceToPad(chr, padnum) > distance; +} + +bool aiIfChrDistanceToPadLessThan(s32 chrref, s32 padnum, f32 distance) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (padnum == 9000) { + padnum = g_Vars.chrdata->padpreset1; + } + + return chr && padnum < 9000 && chrGetDistanceToPad(chr, padnum) < distance; +} + +bool aiIfChrInjuredTarget(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && (chr->chrflags & CHRCFLAG_INJUREDTARGET)) { + chr->chrflags &= ~CHRCFLAG_INJUREDTARGET; + return true; + } + + return false; +} + +bool aiIfChrInSameRoomAsPad(s32 chrref, s32 padnum) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + s32 room = chrGetPadRoom(g_Vars.chrdata, padnum); + + return room >= 0 && chr && chr->prop && chr->prop->rooms[0] == room; +} + +bool aiIfChrInSearchRoom(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chr && chr->prop && chr->prop->rooms[0] == g_Vars.chrdata->roomtosearch; +} + +bool aiIfCountdownTimerExpired(void) +{ + return g_CountdownTimerValue60 <= 0.0f; +} + +bool aiIfCutsceneButtonPressed(void) +{ + return (g_CutsceneSkipRequested && g_Vars.in_cutscene) + || (g_Vars.stagenum == STAGE_CITRAINING && var80087260 > 0); +} + +bool aiIfEyespyNearG5Pad(s32 padnum) +{ + s32 i; + + if (stageGetIndex(g_Vars.stagenum) == STAGEINDEX_G5BUILDING) { + for (i = 0; i < PLAYERCOUNT(); i++) { + if (g_Vars.players[i]->eyespy && g_Vars.players[i]->eyespy->prop + && chrGetDistanceToPad(g_Vars.players[i]->eyespy->prop->chr, padnum) < 150.0f) { + return true; + } + } + } + + return false; +} + +bool aiIfChrAmmoQuantityLessThan(s32 chrref, s32 ammotype, s32 qty) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + bool passes = false; + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + + if (bgunGetAmmoCount(ammotype) < qty) { + passes = true; + } + + setCurrentPlayerNum(prevplayernum); + } + + return passes; +} + +bool aiIfChrKnockedOut(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return ((!chr || !chr->prop || chr->prop->type != PROPTYPE_PLAYER) + && (!chr || !chr->model || chr->actiontype == ACT_DRUGGEDKO || chr->actiontype == ACT_DRUGGEDDROP || chr->actiontype == ACT_DRUGGEDCOMINGUP)); +} + +bool aiIfChrSameFloorDistanceToPadLessThan(s32 chrref, s32 padnum, f32 distance) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (padnum == 9000) { + padnum = g_Vars.chrdata->padpreset1; + } + + return chr && chrGetSameFloorDistanceToPad(chr, padnum) < distance; +} + +bool aiIfChrSawDeath(s32 chrref) +{ + return chrSawDeath(g_Vars.chrdata, chrref); +} + +bool aiIfChrSawInjury(s32 chrref) +{ + return chrSawInjury(g_Vars.chrdata, chrref); +} + +bool aiIfShieldDamaged(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && (chr->chrflags & CHRCFLAG_SHIELDDAMAGED)) { + chr->chrflags &= ~CHRCFLAG_SHIELDDAMAGED; + return true; + } + + return false; +} + +bool aiIfCheckFovWithTarget0(s32 angle) +{ + return chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, angle); +} + +bool aiIfCheckFovWithTarget1(s32 angle) +{ + return chrIsInTargetsFovX(g_Vars.chrdata, angle); +} + +bool aiIfCheckFovWithTarget2(void) +{ + return g_Vars.chrdata->yvisang && chrIsVerticalAngleToTargetWithin(g_Vars.chrdata, g_Vars.chrdata->yvisang) == 0; +} + +bool aiIfChrCanSeeTarget(void) +{ + return chrCanSeeTargetWithExtraCheck(g_Vars.chrdata); +} + +bool aiIfChrHasChrflag(s32 chrref, u32 flag) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chr && (chr->chrflags & flag) == flag; +} + +bool aiIfChrHasFlag(s32 chrref, u32 flag, s32 bank) +{ + return chrHasFlagById(g_Vars.chrdata, chrref, flag, bank); +} + +bool aiIfChrHasGun(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chr && chr->model && chr->gunprop == NULL; +} + +bool aiIfChrHasHiddenFlag(s32 chrref, u32 flag) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chr && (chr->hidden & flag) == flag; +} + +bool aiIfChrHasObject(s32 chrref, s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + bool hasprop = false; + + if (obj && obj->prop && chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + s32 prevplayernum = g_Vars.currentplayernum; + setCurrentPlayerNum(playermgrGetPlayerNumByProp(chr->prop)); + hasprop = invHasProp(obj->prop); + setCurrentPlayerNum(prevplayernum); + } + + return hasprop; +} + +bool aiIfChrHasWeaponEquipped(s32 chrref, s32 weaponnum) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + bool passes = false; + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + + if (bgunGetWeaponNum(HAND_RIGHT) == weaponnum) { + passes = true; + } + + setCurrentPlayerNum(prevplayernum); + } + + return passes; +} + +bool aiIfChrInSquadronDoingAction(s32 action) +{ + s16 *chrnums = squadronGetChrIds(g_Vars.chrdata->squadron); + + if (chrnums) { + for (; *chrnums != -2; chrnums++) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->model && chrIsDead(chr) == false && + chr->actiontype != ACT_DEAD && + chrCompareTeams(g_Vars.chrdata, chr, COMPARE_FRIENDS) && + g_Vars.chrdata->chrnum != chr->chrnum && + chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500 && + chr->myaction == action) { + return true; + } + } + } + + return false; +} + +bool aiIfChrNotTalking(s32 chrref) +{ + struct chrdata *chr = chrFindByLiteralId(chrref); + + return chr && chr->propsoundcount == 0; +} + +bool aiIfChrTarget(s32 chr1ref, s32 chr2ref) +{ + struct chrdata *chr1 = chrFindById(g_Vars.chrdata, chr1ref); + struct chrdata *chr2 = chrFindById(g_Vars.chrdata, chr2ref); + + return chr2 && chr2->prop && chrGetTargetProp(chr1) == chr2->prop; +} + +bool aiIfChrYGreaterThan(s32 chrref, f32 limit) +{ + struct chrdata *chr = NULL; + + if (chrref == CHR_TARGET && g_Vars.hovercar) { + struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar); + + if (chopper) { + struct prop *target = chopperGetTargetProp(chopper); + + if (target && (target->type == PROPTYPE_CHR || target->type == PROPTYPE_PLAYER)) { + chr = target->chr; + } + } + } else { + chr = chrFindById(g_Vars.chrdata, chrref); + } + + return chr && chr->prop && chr->prop->pos.y > limit; +} + +bool aiIfChrYLessThan(s32 chrref, f32 limit) +{ + struct chrdata *chr = NULL; + + if (chrref == CHR_TARGET && g_Vars.hovercar) { + struct chopperobj *chopper = chopperFromHovercar(g_Vars.hovercar); + + if (chopper) { + struct prop *target = chopperGetTargetProp(chopper); + + if (target && (target->type == PROPTYPE_CHR || target->type == PROPTYPE_PLAYER)) { + chr = target->chr; + } + } + } else { + chr = chrFindById(g_Vars.chrdata, chrref); + } + + return chr && chr->prop && chr->prop->pos.y < limit; +} + +bool aiIfCoopMode(void) +{ + return !g_Vars.normmplayerisrunning && g_MissionConfig.iscoop; +} + +bool aiIfDangerousObjectNearby(u32 flags) +{ + return chrDetectDangerousObject(g_Vars.chrdata, flags); +} + +bool aiIfDistanceToGunLessThan(f32 distance) +{ + f32 xdiff = 0; + f32 ydiff = 0; + f32 zdiff = 0; + + if (g_Vars.chrdata->gunprop) { + xdiff = g_Vars.chrdata->prop->pos.x - g_Vars.chrdata->gunprop->pos.x; + ydiff = g_Vars.chrdata->prop->pos.y - g_Vars.chrdata->gunprop->pos.y; + zdiff = g_Vars.chrdata->prop->pos.z - g_Vars.chrdata->gunprop->pos.z; + } + + return ydiff < 200 && ydiff > -200 + && xdiff < distance && xdiff > -distance + && zdiff < distance && zdiff > -distance; +} + +bool aiIfDoorLocked(s32 tagnum, u32 flags) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { + struct doorobj *door = (struct doorobj *) obj; + + return (door->keyflags & flags) == flags; + } + + return false; +} + +bool aiIfDoorState(s32 tagnum, u32 state) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->type == OBJTYPE_DOOR) { + struct doorobj *door = (struct doorobj *) obj; + + if (door->mode == DOORMODE_IDLE) { + if (door->frac <= 0) { + return (state & DOORSTATE_CLOSED); + } else { + return (state & DOORSTATE_OPEN); + } + } else if (door->mode == DOORMODE_OPENING || door->mode == DOORMODE_WAITING) { + return (state & DOORSTATE_OPENING); + } else if (door->mode == DOORMODE_CLOSING) { + return (state & DOORSTATE_CLOSING); + } + } + + return false; +} + +bool aiIfGunLanded(void) +{ + struct weaponobj *weapon = g_Vars.chrdata->gunprop->weapon; + + if ((weapon->base.hidden & OBJHFLAG_PROJECTILE) == 0) { + return true; + } + + return false; +} + +bool aiIfGunUnclaimed(void) +{ + struct weaponobj *weapon = g_Vars.chrdata->gunprop->weapon; + + if (weapon && weapon->base.prop) { + weapon->base.flags |= OBJFLAG_00400000; + return true; + } + + return false; +} + +bool aiIfHasChrflag(u32 flag) +{ + return (g_Vars.chrdata->chrflags & flag) == flag; +} + +bool aiIfHasFlagBank0(u32 flag) +{ + return (g_Vars.chrdata->flags & flag) != 0; +} + +bool aiIfHasFlagBank1(u32 flag) +{ + return (g_Vars.chrdata->flags2 & flag) != 0; +} + +bool aiIfHasOrders(void) +{ + return g_Vars.chrdata->orders; +} + +bool aiIfHeardTargetRecently(void) +{ + return chrHeardTargetRecently(g_Vars.chrdata); +} + +bool aiIfHearsTarget(void) +{ + return chrIsHearingTarget(g_Vars.chrdata); +} + +bool aiIfIdle(void) +{ + return g_Vars.chrdata->actiontype == ACT_ANIM; +} + +bool aiIfInCutscene(void) +{ + return g_Vars.in_cutscene; +} + +bool aiIfInjured(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && (chr->chrflags & CHRCFLAG_JUST_INJURED)) { + chr->chrflags &= ~CHRCFLAG_JUST_INJURED; + return true; + } + + return false; +} + +bool aiIfLiftStationary(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->type == OBJTYPE_LIFT) { + struct liftobj *lift = (struct liftobj *)obj; + + if ((obj->flags & OBJFLAG_DEACTIVATED) || lift->dist == 0) { + return true; + } + } + + return false; +} + +bool aiIfMoraleLessThan(s32 value) +{ + return g_Vars.chrdata->morale < value; +} + +bool aiIfNaturalAnim(s32 naturalanim) +{ + return g_Vars.chrdata->naturalanim == naturalanim; +} + +bool aiIfNearMiss(void) +{ + return chrResetNearMiss(g_Vars.chrdata); +} + +bool aiIfNearlyInTargetsSight(u32 distance) +{ + return chrIsNearlyInTargetsSight(g_Vars.chrdata, distance); +} + +bool aiIfNeverBeenOnScreen(void) +{ + return (g_Vars.chrdata->chrflags & CHRCFLAG_EVERONSCREEN) == 0; +} + +bool aiIfObjectiveComplete(s32 index) +{ + return index < objectiveGetCount() + && objectiveCheck(index) == OBJECTIVE_COMPLETE + && objectiveGetDifficultyBits(index) & (1 << lvGetDifficulty()); +} + +bool aiIfObjectiveFailed(s32 index) +{ + return index < objectiveGetCount() + && objectiveCheck(index) == OBJECTIVE_FAILED + && objectiveGetDifficultyBits(index) & (1 << lvGetDifficulty()); +} + +bool aiIfObjectDistanceToPadLessThan(s32 tagnum, s32 padnum, f32 distance) +{ + f32 xdiff; + f32 ydiff; + f32 zdiff; + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + padnum = chrResolvePadId(g_Vars.chrdata, padnum); + + if (padnum >= 0) { + xdiff = obj->prop->pos.x - g_Pads[padnum].pos.x; + ydiff = obj->prop->pos.y - g_Pads[padnum].pos.y; + zdiff = obj->prop->pos.z - g_Pads[padnum].pos.z; + + if (ydiff < 200 && ydiff > -200 && + xdiff < distance && xdiff > -distance && + zdiff < distance && zdiff > -distance) { + return true; + } + } + } + + return false; +} + +bool aiIfObjectHealthy(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + return obj && obj->prop && objIsHealthy(obj); +} + +bool aiIfObjectInRoom(s32 tagnum, s32 padnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + s32 roomnum = chrGetPadRoom(g_Vars.chrdata, padnum); + + return roomnum >= 0 && obj && obj->prop && roomnum == obj->prop->rooms[0]; +} + +bool aiIfObjHasFlag2(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + return obj && obj->prop && (obj->flags2 & flag) == flag; +} + +bool aiIfOnScreen(void) +{ + return g_Vars.chrdata->prop->flags & (PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONANYSCREENPREVTICK); +} + +bool aiIfOrders(s32 orders) +{ + return g_Vars.chrdata->orders == orders; +} + +bool aiIfPatrolling(void) +{ + return g_Vars.chrdata->actiontype == ACT_PATROL + || (g_Vars.chrdata->actiontype == ACT_GOPOS && g_Vars.chrdata->act_gopos.flags & GOPOSFLAG_FORPATHSTART); +} + +bool aiIfPlayerLookingAtObject(s32 chrref, s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + bool pass = false; + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + + if (g_Vars.currentplayer->lookingatprop.prop == obj->prop) { + pass = true; + } + + setCurrentPlayerNum(prevplayernum); + } + + return pass; +} + +bool aiIfPlayerUsingCmpOrAr34(void) +{ + s32 weaponnum = bgunGetWeaponNum(HAND_RIGHT); + + return weaponnum == WEAPON_CMP150 || weaponnum == WEAPON_AR34; +} + +bool aiIfPlayerUsingDevice(s32 chrref, s32 device) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + struct prop *prop = chr ? chr->prop : NULL; + u8 active = false; + + if (prop && prop->type == PROPTYPE_PLAYER) { + u32 playernum = playermgrGetPlayerNumByProp(prop); + u32 prevplayernum = g_Vars.currentplayernum; + setCurrentPlayerNum(playernum); + + if (currentPlayerGetDeviceState(device) == DEVICESTATE_ACTIVE) { + active = true; + } + + setCurrentPlayerNum(prevplayernum); + } + + return active; +} + +bool aiIfPresetsTargetIsNotMyTarget(void) +{ + return g_Vars.chrdata->target != -1 + && (g_Vars.chrdata->chrpreset1 == -1 || g_Vars.chrdata->target != propGetIndexByChrId(g_Vars.chrdata, g_Vars.chrdata->chrpreset1)); +} + +bool aiIfSafety2LessThan(s32 limit) +{ + u8 score; + u8 numnearby; + s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team); + + score = 6; + numnearby = 0; + + if (chrGetNumArghs(g_Vars.chrdata) > 0) { + score -= 2; + } + + switch (bgunGetWeaponNum(HAND_RIGHT)) { + case WEAPON_FALCON2: + case WEAPON_FALCON2_SILENCER: + case WEAPON_FALCON2_SCOPE: + case WEAPON_MAGSEC4: + case WEAPON_MAULER: + case WEAPON_PHOENIX: + case WEAPON_DY357MAGNUM: + case WEAPON_DY357LX: + case WEAPON_CROSSBOW: + break; + case WEAPON_CMP150: + case WEAPON_CYCLONE: + case WEAPON_CALLISTO: + case WEAPON_RCP120: + case WEAPON_LAPTOPGUN: + case WEAPON_DRAGON: + case WEAPON_K7AVENGER: + case WEAPON_AR34: + case WEAPON_SUPERDRAGON: + case WEAPON_SHOTGUN: + case WEAPON_SNIPERRIFLE: + score--; + break; + case WEAPON_REAPER: + case WEAPON_FARSIGHT: + case WEAPON_DEVASTATOR: + case WEAPON_ROCKETLAUNCHER: + case WEAPON_SLAYER: + score -= 2; + break; + default: + score++; + break; + } + + while (*chrnums != -2) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->model + && !chrIsDead(chr) + && chr->actiontype != ACT_DEAD + && chr->alertness > 100 + && g_Vars.chrdata->squadron == chr->squadron + && g_Vars.chrdata->chrnum != chr->chrnum + && chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) { + numnearby++; + } + + chrnums++; + } + + if (numnearby == 0) { + score -= 2; + } else if (numnearby == 1) { + score--; + } + + if (score < 3 && numnearby != 0) { + score = 3; + } + + return score < limit; +} + +bool aiIfSawDeath(s32 chrref) +{ + return chrSawDeath(g_Vars.chrdata, chrref); +} + +bool aiIfSawInjury(s32 chrref) +{ + return chrSawInjury(g_Vars.chrdata, chrref); +} + +bool aiIfSeesSuspiciousItem(void) +{ + s16 *ptr; + struct prop *prop; + struct defaultobj *obj; + s16 propnums[256]; + struct prop *chrprop = g_Vars.chrdata->prop; + + roomGetProps(chrprop->rooms, &propnums[0], 256); + + ptr = &propnums[0]; + + while (*ptr >= 0) { + prop = &g_Vars.props[*ptr]; + obj = prop->obj; + + if (prop->type == PROPTYPE_WEAPON) { + if ((obj->hidden & OBJHFLAG_SUSPICIOUS) && chrCanSeeProp(g_Vars.chrdata, prop)) { + return true; + } + } else if (prop->type == PROPTYPE_OBJ) { + if (((obj->hidden & OBJHFLAG_SUSPICIOUS) || !objIsHealthy(obj)) + && chrCanSeeProp(g_Vars.chrdata, prop)) { + return true; + } + } else if (prop->type == PROPTYPE_EXPLOSION) { + if (chrCanSeeProp(g_Vars.chrdata, prop)) { + return true; + } + } + + ptr++; + } + + return false; +} + +bool aiIfSkedar(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + return chr && chr->prop && CHRRACE(chr) == RACE_SKEDAR; +} + +bool aiIfSquadronIsDead(s32 squadron) +{ + /** + * @bug: anyalive is initialised to true here, and reset to false in each + * loop iteration. This causes it to use the last chr's status only. + */ + bool anyalive = true; + s16 *chrnums = squadronGetChrIds(squadron); + + if (chrnums) { + while (*chrnums != -2) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->model) { + anyalive = false; + + if (!chrIsDead(chr) && chr->actiontype != ACT_DEAD) { + anyalive = true; + } + } + + chrnums++; + } + } + + return !anyalive; +} + +bool aiIfStopped(void) +{ + return chrIsStopped(g_Vars.chrdata); +} + +bool aiIfTargetInFov(s32 angle) +{ + return chrIsTargetInFov(g_Vars.chrdata, angle, 0); +} + +bool aiIfTargetInSight(void) +{ + return chrCheckTargetInSight(g_Vars.chrdata); +} + +bool aiIfTargetIsPlayer(void) +{ + struct prop *target = chrGetTargetProp(g_Vars.chrdata); + + return target->type == PROPTYPE_EYESPY || target->type == PROPTYPE_PLAYER; +} + +bool aiIfTargetMovingAway(void) +{ + return chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata) > 50; +} + +bool aiIfTargetMovingCloser(void) +{ + return chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata) < -50; +} + +bool aiIfTargetMovingSlowly(void) +{ + s32 delta = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata); + s32 absdelta = delta > 0 ? delta : -delta; + + return absdelta < 50; +} + +bool aiIfChrTeleportFullWhite(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + u32 prevplayernum = g_Vars.currentplayernum; + s32 mainpri; + f32 fvalue; + s32 audiopri; + struct sndstate *handle; + bool ready; + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + } + + if (g_Vars.currentplayer->teleportstate < TELEPORTSTATE_WHITE) { + ready = false; + } else { + fvalue = 0.4; + + mainpri = osGetThreadPri(0); + audiopri = osGetThreadPri(&g_AudioManager.thread); + osSetThreadPri(0, audiopri + 1); + + handle = sndStart(var80095200, SFX_FIRE_SHOTGUN, NULL, -1, -1, -1, -1, -1); + + if (handle) { + audioPostEvent(handle, 16, *(u32 *)&fvalue); + } + + osSetThreadPri(0, mainpri); + + g_Vars.currentplayer->teleportstate = TELEPORTSTATE_WHITE; + + ready = true; + } + + setCurrentPlayerNum(prevplayernum); + + return ready; +} + +bool aiIfTrainingPcHolographed(void) +{ + struct trainingdata *data = dtGetData(); + + return data->holographedpc; +} + +bool aiIfWeaponThrownOnObject(s32 weaponnum, s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + struct prop *prop = obj->prop->child; + + while (prop) { + if (prop->type == PROPTYPE_WEAPON) { + struct weaponobj *weapon = prop->weapon; + + if (weapon->weaponnum == weaponnum) { + return true; + } + } + + prop = prop->next; + } + } + + return false; +} + +void aiIncreaseSquadronAlertness(s32 amount) +{ + s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team); + + for (; *chrnums != -2; chrnums++) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && + chr->model && + !chrIsDead(chr) && + chr->actiontype != ACT_DEAD && + (g_Vars.chrdata->squadron == chr->squadron || g_Vars.chrdata->squadron == 255) && + g_Vars.chrdata->chrnum != chr->chrnum && + (chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 1000 || chrHasFlag(g_Vars.chrdata, CHRFLAG0_SQUADALERTANYDIST, BANK_0))) { + incrementByte(&chr->alertness, amount); + } + } +} + +void aiJogToPad(s32 padnum) +{ + chrGoToPad(g_Vars.chrdata, padnum, GOPOSFLAG_JOG); +} + +void aiKneel(void) +{ + chrTryKneel(g_Vars.chrdata); +} + +void aiLockDoor(s32 tagnum, u32 flags) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { + struct doorobj *door = (struct doorobj *) obj; + door->keyflags |= flags; + } +} + +bool aiMiniSkedarTryPounce(void) +{ + return chrTrySkJump(g_Vars.chrdata, g_Vars.chrdata->pouncebits, 4, 14, 0); +} + +void aiObjectDoAnimation(s32 anim_id, s32 tagnum, s32 arg2, s32 startframe) +{ + struct defaultobj *obj = NULL; + f32 thing; + f32 fstartframe; + + if (startframe == 0xffff) { + fstartframe = 0; + } else if (startframe == 0xfffe) { + fstartframe = animGetNumFrames(anim_id) - 2; + + if (fstartframe < 0) { + fstartframe = 0; + } + } else { + fstartframe = startframe; + } + + if (tagnum == 255) { + if (g_Vars.chrdata && g_Vars.chrdata->myspecial >= 0) { + obj = objFindByTagId(g_Vars.chrdata->myspecial); + } + } else { + obj = objFindByTagId(tagnum); + } + + if (obj && obj->prop) { + struct anim *anim = obj->model->anim; + + if (obj->model->anim == NULL) { + obj->model->anim = modelmgrInstantiateAnim(); + } + + if (obj->model->anim) { + thing = 1.0f / arg2; + + if (g_Vars.in_cutscene && startframe != 0xfffe) { + fstartframe += g_CutsceneFrameOverrun240 * thing * 0.25f; + } + + animInit(obj->model->anim); + modelSetAnimation(obj->model, anim_id, 0, fstartframe, thing, 0); + modelSetAnimScale(obj->model, func0f15c888() * obj->model->scale * 100.0f); + } + } +} + +void aiObjectMoveToPad(s32 tagnum, s32 padnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + Mtxf matrix; + struct pad *pad; + s16 rooms[2]; + + if (obj && obj->prop) { + pad = &g_Pads[padnum]; + + mtx00016d58(&matrix, 0, 0, 0, -pad->look.x, -pad->look.y, -pad->look.z, pad->up.x, pad->up.y, pad->up.z); + + if (obj->model) { + mtx00015f04(obj->model->scale, &matrix); + } + + rooms[0] = pad->room; + rooms[1] = -1; + + func0f06a730(obj, &pad->pos, &matrix, rooms, &pad->pos); + } +} + +void aiObjSetModelPartVisible(s32 tagnum, s32 partnum, bool visible) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + objSetModelPartVisible(obj, partnum, visible); + } +} + +void aiOpenDoor(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { + if (!doorCallLift(obj->prop, false)) { + struct doorobj *door = (struct doorobj *) obj; + doorsRequestMode(door, DOORMODE_OPENING); + } + } +} + +void aiPauseTimer(void) +{ + g_Vars.chrdata->hidden &= ~CHRHFLAG_TIMER_RUNNING; +} + +void aiPlaySoundFromChr(s32 channel, s32 chrref, u32 thing2, u32 thing3) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + audioPlayFromProp2(channel, -1, -1, chr->prop, 1, thing2, thing3, 0); + } +} + +void aiPlaySoundFromObj(s32 channel, s32 tagnum, u32 thing2, u32 thing3) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + audioPlayFromProp2(channel, -1, -1, obj->prop, 1, thing2, thing3, 0); + } +} + +void aiPlaySoundFromProp(s32 channel, s32 tagnum, s32 soundnum, s32 unk1, s32 unk2) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + audioPlayFromProp(channel, soundnum, 0xffff, obj->prop, unk1, unk2); +} + +void aiRecoverGun(void) +{ + struct prop *prop = g_Vars.chrdata->gunprop; + g_Vars.chrdata->gunprop = NULL; + + if (prop && prop->obj && prop->parent == NULL && prop->type == PROPTYPE_WEAPON) { + propDeregisterRooms(prop); + propDelist(prop); + propDisable(prop); + chrEquipWeapon(prop->weapon, g_Vars.chrdata); + } +} + +void aiRemoveChr(s32 chrref) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop) { + chr->hidden |= 0x20; + } +} + +void aiRemoveReferencesToChr(void) +{ + if (g_Vars.chrdata && g_Vars.chrdata->prop) { + chrClearReferences(g_Vars.chrdata->prop - g_Vars.props); + } +} + +void aiResetTimer(void) +{ + g_Vars.chrdata->timer60 = 0; +} + +void aiRestartTimer(void) +{ + if (g_Vars.chrdata) { + chrRestartTimer(g_Vars.chrdata); + } else if (g_Vars.hovercar) { + chopperRestartTimer(g_Vars.hovercar); + } +} + +void aiResumeTimer(void) +{ + g_Vars.chrdata->hidden |= CHRHFLAG_TIMER_RUNNING; +} + +u8 *aiReturn(void) +{ + u8 *ailist = NULL; + + if (g_Vars.chrdata) { + ailist = ailistFindById(g_Vars.chrdata->aireturnlist); + } else if (g_Vars.truck) { + ailist = ailistFindById(g_Vars.truck->aireturnlist); + } else if (g_Vars.heli) { + ailist = ailistFindById(g_Vars.heli->aireturnlist); + } else if (g_Vars.hovercar) { + ailist = ailistFindById(g_Vars.hovercar->aireturnlist); + } + + g_Vars.ailist = ailist; + g_Vars.aioffset = ailist; + + return ailist; +} + +void aiRetreatFromTarget(void) +{ + struct prop *target = chrGetTargetProp(g_Vars.chrdata); + chrRunFromPos(g_Vars.chrdata, GOPOSFLAG_RUN, 10000, &target->pos); +} + +void aiRetreatToCover(void) +{ + chrAssignCoverByCriteria(g_Vars.chrdata, COVERCRITERIA_FURTHEREST + | COVERCRITERIA_DISTTOTARGET + | COVERCRITERIA_ONLYNEIGHBOURINGROOMS + | COVERCRITERIA_ROOMSFROMME, 0); + chrGoToCover(g_Vars.chrdata, GOPOSFLAG_RUN); +} + +void aiRevokeControl(s32 chrref, u32 flags) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = playermgrGetPlayerNumByProp(chr->prop); + setCurrentPlayerNum(playernum); + bgunSetSightVisible(GUNSIGHTREASON_NOCONTROL, false); + bgunSetGunAmmoVisible(GUNAMMOREASON_NOCONTROL, false); + + if ((flags & 2) == 0) { + hudmsgsSetOff(HUDMSGREASON_NOCONTROL); + } + + if ((flags & 4) == 0) { + countdownTimerSetVisible(COUNTDOWNTIMERREASON_NOCONTROL, false); + } + + g_PlayersWithControl[g_Vars.currentplayernum] = false; + setCurrentPlayerNum(prevplayernum); + } +} + +void aiRunToPad(s32 padnum) +{ + chrGoToPad(g_Vars.chrdata, padnum, GOPOSFLAG_RUN); +} + +s16 g_CiMainQuips[][3] = { + { MP3_CARR_WHAT_IS_IT, MP3_CARR_A_LITTLE_BUSY, MP3_CARR_PROUD_OF_YOU }, + { MP3_CIFEM_FOSTER, MP3_CIFEM_COME_TO_SEE_ME, MP3_CIFEM_PRACTICE_MAKES_PERFECT }, + { MP3_GRIMSHAW_KNOW_YOUR_ENEMY, MP3_GRIMSHAW_ALL_EARS, MP3_GRIMSHAW_GAP_IN_RECORDS }, + { MP3_HOLO_LAST_MINUTE_TRAINING, MP3_HOLO_PRACTICE_MAKES_PERFECT, MP3_HOLO_HAVE_A_LIFE }, + { MP3_HANGERGUY_DONT_SCREW_UP, MP3_HANGERGUY_DONT_MAKE_A_MESS, MP3_HANGERGUY_HALF_HOUR_AGO }, + { MP3_FOSTER_WHAT_TO_SHOOT_AT, MP3_FOSTER_ZEROED_THE_SIGHTS, MP3_FOSTER_GOOD_SHOW }, +}; + +s16 g_CiGreetingQuips[][3] = { + { SFX_CARR_HELLO_JOANNA, SFX_CARR_HELLO_JOANNA, SFX_CARR_HELLO_JOANNA }, + { SFX_CIFEM_HI_THERE, SFX_CIFEM_HI_THERE, SFX_CIFEM_HI_THERE }, + { SFX_GRIMSHAW_WELCOME, SFX_GRIMSHAW_HI_THERE, SFX_GRIMSHAW_UMM_ERR_HI }, + { SFX_HOLO_HI, SFX_HOLO_HI, SFX_HOLO_HI }, + { SFX_HANGAR_WHAT_DO_YOU_WANT, SFX_HANGAR_WHAT_DO_YOU_WANT, SFX_HANGAR_WHAT_DO_YOU_WANT }, + { SFX_FOSTER_STAR_AGENT, SFX_FOSTER_STAR_AGENT, SFX_FOSTER_STAR_AGENT }, + { SFX_CIM_HEY_THERE, SFX_CIM_HEY_THERE, SFX_CIM_HI }, + { SFX_CIM_HI, SFX_CIM_HOWS_IT_GOING, SFX_CIM_HOWS_IT_GOING }, + { SFX_CIFEM_HELLO, SFX_CIFEM_HELLO, SFX_CIFEM_HI_JO }, + { SFX_CIFEM_HI_JO, SFX_CIFEM_HOWS_IT_GOING, SFX_CIFEM_HOWS_IT_GOING }, +}; + +s16 g_CiAnnoyedQuips[][3] = { + { MP3_CARR_WORRIES_ME, MP3_CARR_WORRIES_ME, MP3_CARR_WORRIES_ME }, + { MP3_CIFEM_PATIENCE, MP3_CIFEM_PATIENCE, MP3_CIFEM_PATIENCE }, + { MP3_GRIMSHAW_BUG_OFF, MP3_GRIMSHAW_CRIMINAL_RECORD, MP3_GRIMSHAW_LOSER }, + { MP3_HOLO_IRRITATING, MP3_HOLO_IRRITATING, MP3_HOLO_IRRITATING }, + { MP3_HANGAR_LIVED_THIS_LONG, MP3_HANGAR_LIVED_THIS_LONG, MP3_HANGAR_LIVED_THIS_LONG }, + { MP3_FOSTER_LEAVE_ME_ALONE, MP3_FOSTER_LEAVE_ME_ALONE, MP3_FOSTER_LEAVE_ME_ALONE }, + { MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE }, + { MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE, MP3_CIM_BE_SOMEWHERE }, + { MP3_CIFEM_BE_SOMEWHERE, MP3_CIFEM_BE_SOMEWHERE, MP3_CIFEM_BE_SOMEWHERE }, + { MP3_CIFEM_BOTHER_SOMEONE_ELSE, MP3_CIFEM_BOTHER_SOMEONE_ELSE, MP3_CIFEM_BOTHER_SOMEONE_ELSE }, +}; + +s16 g_CiThanksQuips[] = { + 0, + MP3_CIFEM_THANKS1, + MP3_GRIMSHAW_TOO_CLOSE, + MP3_CIFEM_THANKS2, + 0, + MP3_FOSTER_RELY_ON_YOU, + MP3_CIM_THANKS_JO, + MP3_CIM_THANKS_JO, + MP3_CIFEM_THANKS3, + MP3_CIFEM_THANKS3, +}; + +void aiSayCiStaffQuip(s32 ciquip, s32 channel) +{ + s32 quip; + + if (ciquip == CIQUIP_GREETING) { + quip = g_CiGreetingQuips[g_Vars.chrdata->morale][random() % 3]; + } else if (ciquip == CIQUIP_MAIN) { + quip = g_CiMainQuips[g_Vars.chrdata->morale][random() % 3]; + } else if (ciquip == CIQUIP_ANNOYED) { + quip = g_CiAnnoyedQuips[g_Vars.chrdata->morale][random() % 3]; + } else { + quip = g_CiThanksQuips[g_Vars.chrdata->morale]; + } + + audioPlayFromProp(channel, quip, 0, g_Vars.chrdata->prop, 9, 0); +} + +s16 g_GuardQuipBank[][4] = { + // Voicebox 0 + { QUIP_ATTACK1, SFX_M0_CLEAR_SHOT, SFX_M0_CLEAR_SHOT, SFX_M0_SHES_MINE }, + { QUIP_ATTACK2, SFX_M0_OPEN_FIRE, SFX_M0_WIPE_HER_OUT, SFX_M0_WASTE_HER }, + { QUIP_GOTOCOVER1, SFX_M0_COVER_ME, SFX_M0_WATCH_MY_BACK, SFX_M0_TAKE_COVER }, + { QUIP_GRENADE1, SFX_M0_M1_LOOK_OUT_LOOK_OUT, SFX_M0_M1_ITS_A_GRENADE, SFX_M0_M1_CLEAR_THE_AREA }, + { QUIP_RETREAT1, SFX_M0_GO_TO_PLAN_B, SFX_M0_GET_THE_HELL_OUT_OF_HERE, SFX_M0_RETREAT }, + { QUIP_GRENADE2, SFX_M0_CATCH, SFX_M0_EVERYBODY_DOWN, SFX_M0_GRENADE }, + { QUIP_RETREAT2, SFX_M0_FALL_BACK, SFX_M0_EVERYONE_BACK_OFF, SFX_M0_WITHDRAW }, + { QUIP_FLANK, SFX_M0_FLANK_THE_TARGET, SFX_M0_LETS_SPLIT_UP, SFX_M0_SURROUND_HER }, + { QUIP_SURRENDER, SFX_M0_DONT_SHOOT_ME, SFX_M0_I_GIVE_UP, SFX_M0_YOU_WIN_I_SURRENDER }, + { QUIP_HEARNOISE, SFX_M0_HEAR_THAT, SFX_M0_WHATS_THAT_NOISE, SFX_M0_HEARD_A_NOISE }, + { QUIP_10, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SEEPLAYER, SFX_M0_HEY_YOU, SFX_M0_INTRUDER_ALERT, SFX_M0_GOT_A_CONTACT }, +#if VERSION >= VERSION_NTSC_1_0 + { QUIP_SHOTUNALERT, SFX_M0_HOLY_SHH, SFX_M0_HOLY_SHH, SFX_M0_WHAT_THE_HELL }, +#else + { QUIP_SHOTUNALERT, SFX_80F6, SFX_80F6, SFX_M0_WHAT_THE_HELL }, +#endif + { QUIP_INJURED1, SFX_M0_MEDIC, SFX_M0_OW, SFX_M0_YOU_SHOT_ME }, + { QUIP_INJURED2, SFX_M0_IM_HIT, SFX_M0_IM_TAKING_FIRE, SFX_M0_TAKING_DAMAGE }, + { QUIP_KILLEDPLAYER1, SFX_M0_GRAB_A_BODY_BAG, SFX_M0_ONE_FOR_THE_MORGUE, SFX_M0_REST_IN_PEACE }, + { QUIP_WARNFRIENDS, SFX_M0_INTRUDER_ALERT2, SFX_M0_WEVE_GOT_TROUBLE, SFX_M0_WEVE_GOT_PROBLEMS }, + { QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SURPRISED, SFX_M0_WHAT_THE, SFX_M0_WHO_THE, SFX_M0_WHO_THE }, + { QUIP_INSPECTBODY, SFX_M0_ARE_YOU_OKAY, SFX_M0_GOT_A_MAN_DOWN, SFX_M0_HES_BOUGHT_IT }, + { QUIP_20, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_HITPLAYER, SFX_M0_GIVE_IT_UP, SFX_M0_SURRENDER_NOW, SFX_M0_TAKE_THAT }, + { QUIP_MISSEDPLAYER1, SFX_M0_DAMN_IT_MISSED, SFX_M0_DAMN_IT_MISSED, SFX_M0_HOW_DID_I_MISS }, + { QUIP_MISSEDPLAYER2, SFX_M0_GODS_SAKE_SOMEONE_HIT_HER, SFX_M0_GODS_SAKE_SOMEONE_HIT_HER, SFX_M0_SHES_A_TRICKY_ONE }, + { QUIP_GOTOCOVER2, SFX_M0_TAKE_COVER_028D, SFX_M0_ILL_COVER_YOU, SFX_M0_GET_DOWN }, + { QUIP_DIE, SFX_M0_YOU_BITCH, SFX_M0_OH_MY_GOD, SFX_M0_SHE_GOT_ME }, + { QUIP_26, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SEARCHSUCCESS, SFX_M0_I_SEE_HER, SFX_M0_THERE_SHE_IS, SFX_M0_THERE_MOVEMENT }, + { QUIP_SEEEYESPY, SFX_M0_WHAT_THE_HELL_8167, SFX_M0_HELLO_THERE, SFX_M0_WHATS_THIS }, + { QUIP_GREETING, SFX_M0_HOWS_THINGS, SFX_M0_HEY_THERE, SFX_M0_HI_HOW_ARE_YOU }, + { QUIP_ASKWEAPON1, MP3_M0_WHERE_DID_YOU_GET_THAT, MP3_M0_SHOULD_YOU_HAVE_THAT, MP3_M0_WHAT_ARE_YOU_DOING }, + { QUIP_ASKWEAPON2, SFX_0037, MP3_M0_DONT_POINT_THAT_AT_ME, MP3_M0_WATCH_WHERE_YOURE_POINTING }, + { QUIP_UNCOVERDISGUISE1, MP3_M0_IMPOSTER, MP3_M0_IMPOSTER, MP3_M0_ITS_A_SPY }, + { QUIP_LOSTGUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN }, + { QUIP_GOFORALARM, SFX_M0_TRIGGER_THE_ALARM, SFX_M0_TRIGGER_THE_ALARM, SFX_M0_TRIGGER_THE_ALARM }, + { QUIP_SEARCHFAIL, SFX_M0_IM_SURE_I_HEARD_A_NOISE, SFX_M0_IM_SURE_I_HEARD_A_NOISE, SFX_M0_HEARING_THINGS }, + { QUIP_ATTACK3, SFX_M0_CLEAR_SHOT, SFX_M0_CLEAR_SHOT, SFX_M0_OPEN_FIRE }, + { QUIP_ATTACK4, SFX_M0_CLEAR_SHOT, SFX_M0_OPEN_FIRE, SFX_M0_OPEN_FIRE }, + { QUIP_KILLEDPLAYER2, SFX_M0_GRAB_A_BODY_BAG, SFX_M0_ONE_FOR_THE_MORGUE, SFX_M0_REST_IN_PEACE }, + { QUIP_GUNJAMMED, SFX_M0_MY_GUN, SFX_M0_MY_GUN, SFX_M0_MY_GUN }, + { QUIP_UNCOVEREDDISGUISE2, MP3_M0_ITS_A_SPY, MP3_M0_ITS_A_SPY, MP3_M0_ITS_A_SPY }, + // Voicebox 1 + { QUIP_ATTACK1, SFX_M1_LAST_MISTAKE, SFX_M1_WHAT_ARE_YOU_WAITING_FOR, SFX_M1_BRING_IT_ON }, + { QUIP_ATTACK2, SFX_M1_TAKE_HER_DOWN, SFX_M1_EVERYBODY_GET_HER, SFX_M1_ATTACK }, + { QUIP_GOTOCOVER1, SFX_M1_COVER_MY_ASS, SFX_M1_COVER_ME_NOW, SFX_M1_IM_GOING_FOR_COVER }, + { QUIP_GRENADE1, SFX_M0_M1_LOOK_OUT_LOOK_OUT, SFX_M0_M1_ITS_A_GRENADE, SFX_M0_M1_CLEAR_THE_AREA }, + { QUIP_RETREAT1, SFX_M1_SHES_TOO_GOOD_RUN, SFX_M1_GET_SOME_BACKUP, SFX_M1_EVACUATE_THE_AREA }, + { QUIP_GRENADE2, SFX_M1_CATCH_THIS, SFX_M1_HERE_KEEP_IT, SFX_M1_GRENADE }, + { QUIP_RETREAT2, SFX_M1_WITHDRAW, SFX_M1_FALL_BACK, SFX_M1_EVERYONE_GET_BACK }, + { QUIP_FLANK, SFX_M1_SURROUND_HER, SFX_M1_SPREAD_OUT, SFX_M1_SPLIT_UP }, + { QUIP_SURRENDER, SFX_M1_PLEASE_DONT, SFX_M1_DONT_SHOOT, SFX_M1_IM_ONLY_DOING_MY_JOB }, + { QUIP_HEARNOISE, SFX_M1_THAT_SOUNDED_LIKE, SFX_M1_GUNFIRE, SFX_M1_SOMEONES_SHOOTING }, + { QUIP_10, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SEEPLAYER, SFX_M1_COME_HERE, SFX_M1_THERES_SOMEONE_HERE, SFX_M1_GET_HER }, + { QUIP_SHOTUNALERT, SFX_M1_WHOA, SFX_M1_MY_GOD, SFX_M1_IS_THAT_A_BULLET }, + { QUIP_INJURED1, SFX_M1_OH_MY_GOD, SFX_M1_IM_HIT_IM_HIT, SFX_M1_IM_BLEEDING }, + { QUIP_INJURED2, SFX_M1_OH_GOD_IM_HIT, SFX_M1_HELP_ME_OUT, SFX_M1_IM_IN_TROUBLE }, + { QUIP_KILLEDPLAYER1, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_WARNFRIENDS, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT }, + { QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SURPRISED, SFX_M1_HOLY, SFX_M1_WHAT_THE_HELL, SFX_M1_WHA }, +#if VERSION >= VERSION_NTSC_1_0 + { QUIP_INSPECTBODY, SFX_M1_NOOO, SFX_M1_OH_GOD_HES_DEAD, SFX_M1_HES_GONE }, +#else + { QUIP_INSPECTBODY, SFX_0313, SFX_M1_NOOO, SFX_M1_HES_GONE }, +#endif + { QUIP_20, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT }, + { QUIP_HITPLAYER, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEAH_BABY, SFX_M1_YEAH_BABY }, + { QUIP_MISSEDPLAYER1, SFX_M1_BLOODY_STUPID_GUN, SFX_M1_MY_GUN_ITS_USELESS, SFX_M1_DAMN_IT }, + { QUIP_MISSEDPLAYER2, SFX_M1_STOP_DODGING, SFX_M1_SOMEONE_HIT_HER, SFX_M1_DAMN_SHES_GOOD }, + { QUIP_GOTOCOVER2, SFX_M1_GO_FOR_IT, SFX_M1_GO_GO_GO, SFX_M1_RUN }, +#if VERSION >= VERSION_NTSC_1_0 + { QUIP_DIE, SFX_M1_SCREAM, SFX_M1_WHY_ME, SFX_M1_CHOKING }, +#else + { QUIP_DIE, SFX_034C, SFX_M1_WHY_ME, SFX_M1_CHOKING }, +#endif + { QUIP_26, SFX_M1_OUTSTANDING, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEEHAH_GOT_ONE }, + { QUIP_SEARCHSUCCESS, SFX_M1_OVER_THERE, SFX_M1_HALT, SFX_M1_FREEZE }, + { QUIP_SEEEYESPY, SFX_M1_WHAT_IS_IT, SFX_M1_HOW_DID_THAT_GET_HERE, SFX_M1_DONT_TOUCH_IT }, + { QUIP_GREETING, SFX_M1_HI_THERE, SFX_M1_HI_THERE, SFX_M1_HOWS_THINGS }, + { QUIP_ASKWEAPON1, MP3_M1_WHERE_ARE_YOU_TAKING, MP3_M1_WHERE_ARE_YOU_TAKING, MP3_M1_GET_THAT_FIREARM_APPROVED }, + { QUIP_ASKWEAPON2, MP3_M1_WATCH_WHAT_YOURE_DOING, MP3_M1_WATCH_WHAT_YOURE_DOING, MP3_M1_BE_CAREFUL }, + { QUIP_UNCOVERDISGUISE1, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE, MP3_M1_DROP_THE_GUN }, + { QUIP_LOSTGUN, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ }, + { QUIP_GOFORALARM, SFX_M1_WARN_THE_OTHERS, SFX_M1_WARN_THE_OTHERS, SFX_M1_WARN_THE_OTHERS }, + { QUIP_SEARCHFAIL, SFX_M1_I_CANT_SEE_ANYBODY, SFX_M1_THERES_NO_ONE_HERE, SFX_M1_THERES_NO_ONE_HERE }, + { QUIP_ATTACK3, SFX_M1_LAST_MISTAKE, SFX_M1_WHAT_ARE_YOU_WAITING_FOR, SFX_M1_BRING_IT_ON }, + { QUIP_ATTACK4, SFX_M1_BRING_IT_ON, SFX_M1_ATTACK, SFX_M1_ATTACK }, + { QUIP_KILLEDPLAYER2, SFX_M1_IM_JUST_TOO_GOOD, SFX_M1_YEEHAH_GOT_ONE, SFX_M1_ANOTHER_ONE_BITES_THE_DUST }, + { QUIP_GUNJAMMED, SFX_M1_BLOODY_STUPID_GUN, SFX_M1_MY_GUN_ITS_USELESS, SFX_M1_DAMN_IT }, + { QUIP_UNCOVEREDDISGUISE2, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE, MP3_M1_STOP_RIGHT_THERE }, + // Voicebox 2 + { QUIP_ATTACK1, SFX_M2_COME_ON_MAN2, SFX_M2_DIE, SFX_M2_TAKE_THIS }, + { QUIP_ATTACK2, SFX_M2_MOVE_IN, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE, SFX_M2_LET_HER_HAVE_IT }, + { QUIP_GOTOCOVER1, SFX_M2_HELP_ME_OUT_HERE, SFX_M2_HEY_DISTRACT_HER, SFX_M2_KEEP_HER_OCCUPIED }, + { QUIP_GRENADE1, SFX_M2_GET_BACK_QUICK, SFX_M2_WERE_GONNA_DIE, SFX_M2_GOD_RUN }, + { QUIP_RETREAT1, SFX_M2_RETREAT, SFX_M2_LETS_GET_THE_HELL_OUT_OF_HERE, SFX_M2_GET_BACK_GET_BACK }, + { QUIP_GRENADE2, SFX_M2_FIRE_IN_THE_HOLE, SFX_M2_HERES_A_LITTLE_PRESENT_FOR_YA, SFX_M2_TRY_THIS_FOR_SIZE }, + { QUIP_RETREAT2, SFX_M2_GET_OUT_OF_THE_WAY, SFX_M2_FALL_BACK, SFX_M2_MOVE_OUT }, + { QUIP_FLANK, SFX_M2_TEAM_UP_GUYS, SFX_M2_COME_ON_AROUND_THE_SIDE, SFX_M2_SCATTER }, + { QUIP_SURRENDER, SFX_M2_I_DONT_LIKE_THIS_ANY_MORE, SFX_M2_DONT_HURT_ME, SFX_M2_YOU_WIN_I_GIVE_UP }, + { QUIP_HEARNOISE, SFX_M2_LISTEN_GUNSHOTS, SFX_M2_LISTEN_GUNSHOTS, SFX_M2_SOMEONES_NEARBY }, + { QUIP_10, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SEEPLAYER, SFX_M2_TARGET_SIGHTED, SFX_M2_COME_ON_MAN, SFX_M2_GOD_DAMN_IT }, + { QUIP_SHOTUNALERT, SFX_M2_THAT_WAS_CLOSE, SFX_M2_HOLY_MOLY, SFX_M2_AY_CARAMBA }, + { QUIP_INJURED1, SFX_M2_GEEZ_THAT_HURT, SFX_M2_WHY_YOU, SFX_M2_WHY_YOU }, + { QUIP_INJURED2, SFX_M2_IM_INJURED, SFX_M2_IM_HIT_IM_HIT, SFX_M2_DAMN_IT_IM_TAKING_FIRE }, + { QUIP_KILLEDPLAYER1, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_WARNFRIENDS, SFX_M2_WATCH_OUT, SFX_M2_HELP_ME_OUT, SFX_M2_WEVE_GOT_AN_INTRUDER }, + { QUIP_GOFORALARM, SFX_0037, SFX_0037, SFX_0037 }, + { QUIP_SURPRISED, SFX_M2_HOW_THE, SFX_M2_HEY, SFX_M2_STOP }, + { QUIP_INSPECTBODY, SFX_M2_BODY_COUNTS_TOO_HIGH, SFX_M2_I_NEVER_LIKED_HIM_ANYWAY, SFX_M2_THAT_WAS_MY_BEST_FRIEND }, + { QUIP_20, SFX_M1_M2_LOOK_OUT_SHES_COMING, SFX_M1_M2_TAKE_COVER, SFX_M1_M2_LOOK_OUT_LOOK_OUT }, + { QUIP_HITPLAYER, SFX_M2_SURRENDER_OR_DIE, SFX_M2_I_HAVE_YOU_NOW, SFX_M2_YOU_WANT_BEAT_ME }, + { QUIP_MISSEDPLAYER1, SFX_M2_DAMN_MISSED_AGAIN, SFX_M2_I_DONT_BELIEVE_IT, SFX_M2_DAMN_YOU }, + { QUIP_MISSEDPLAYER2, SFX_M2_HELL_SHES_GOOD, SFX_M2_STOP_MOVING, SFX_M2_NO_ESCAPE_FOR_YOU }, + { QUIP_GOTOCOVER2, SFX_M2_MOVE_IT_MOVE_IT, SFX_M2_GET_TO_COVER_NOW, SFX_M2_RUN_FOR_IT }, +#if VERSION >= VERSION_NTSC_1_0 + { QUIP_DIE, SFX_M2_NOOO, SFX_M2_OH_GOD_IM_DYING, SFX_M2_I_DONT_WANT_TO_DIE }, +#else + { QUIP_DIE, SFX_0411, SFX_M2_OH_GOD_IM_DYING, SFX_M2_I_DONT_WANT_TO_DIE }, +#endif + { QUIP_26, SFX_M2_IM_THE_MAN, SFX_M2_BOY_THAT_WAS_CLOSE, SFX_M2_DID_YOU_SEE_THAT }, + { QUIP_SEARCHSUCCESS, SFX_M2_GET_HER, SFX_M2_THERE_ATTACK, SFX_M2_HEY_YOU_STOP }, + { QUIP_SEEEYESPY, SFX_M2_IS_IT_DANGEROUS, SFX_M2_DONT_MOVE, SFX_M2_STAY_BACK }, + { QUIP_GREETING, SFX_M2_HELLO, SFX_M2_HELLO, SFX_M2_HEY_WHATS_UP }, + { QUIP_ASKWEAPON1, MP3_M2_DO_YOU_HAVE_PERMISSION_FOR_THAT, MP3_M2_DO_YOU_HAVE_PERMISSION_FOR_THAT, MP3_M2_WHAT_ARE_YOU_DOING }, + { QUIP_ASKWEAPON2, MP3_M2_HEY_THATS_DANGEROUS, MP3_M2_HEY_THATS_DANGEROUS, MP3_M2_WATCH_IT_THAT_THING_COULD_GO_OFF }, + { QUIP_UNCOVERDISGUISE1, MP3_M2_PUT_YOUR_HANDS_UP, MP3_M2_PUT_YOUR_HANDS_UP, MP3_M2_ITS_A_TERRORIST }, + { QUIP_LOSTGUN, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ, SFX_M1_M2_GEEZ }, + { QUIP_GOFORALARM, SFX_M2_ACTIVATE_THE_ALARM, SFX_M2_ACTIVATE_THE_ALARM, SFX_M2_ACTIVATE_THE_ALARM }, + { QUIP_SEARCHFAIL, SFX_M2_I_BET_THIS_IS_ANOTHER_DRILL, SFX_M2_I_BET_THIS_IS_ANOTHER_DRILL, SFX_M2_ANOTHER_FALSE_ALARM }, + { QUIP_ATTACK3, SFX_M2_COME_ON_MAN2, SFX_M2_DIE, SFX_M2_TAKE_THIS }, + { QUIP_ATTACK4, SFX_M2_DIE, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE, SFX_M2_YOURE_OUT_OF_YOUR_LEAGUE }, + { QUIP_KILLEDPLAYER2, SFX_M2_IM_THE_MAN, SFX_M2_ITS_ALL_OVER_FOR_THIS_ONE, SFX_M2_DID_YOU_SEE_THAT }, + { QUIP_GUNJAMMED, SFX_M2_GOD_DAMN_IT, SFX_M2_I_DONT_BELIEVE_IT, SFX_M2_GOD_DAMN_IT }, + { QUIP_UNCOVEREDDISGUISE2, MP3_M2_ITS_A_TERRORIST, MP3_M2_ITS_A_TERRORIST, MP3_M2_ITS_A_TERRORIST }, + // Voicebox 3 (female) + { QUIP_ATTACK1, SFX_F_COME_ON, SFX_F_COME_ON, SFX_F_COME_ON }, + { QUIP_ATTACK2, SFX_0037, SFX_F_EVERYONE_GET_HER, SFX_F_ATTACK }, + { QUIP_GOTOCOVER1, SFX_F_COVER_ME, SFX_0037, SFX_F_TAKE_COVER }, + { QUIP_GRENADE1, SFX_F_LOOK_OUT, SFX_F_ITS_A_GRENADE, SFX_F_ITS_A_GRENADE }, + { QUIP_RETREAT1, SFX_F_GET_REINFORCEMENTS, SFX_F_EVACUATE_THE_AREA, SFX_F_RETREAT }, + { QUIP_GRENADE2, SFX_F_CATCH_THIS, SFX_F_TIME_TO_DIE, SFX_0037 }, + { QUIP_RETREAT2, SFX_F_WITHDRAW, SFX_F_WITHDRAW, SFX_F_FALL_BACK }, + { QUIP_FLANK, SFX_0037, SFX_F_SPREAD_OUT, SFX_F_SPLIT_UP }, + { QUIP_SURRENDER, SFX_F_PLEASE_DONT, SFX_F_PLEASE_DONT, SFX_F_DONT_SHOOT }, + { QUIP_HEARNOISE, SFX_0037, SFX_F_0389, SFX_F_SOMEONES_SHOOTING }, + { QUIP_10, 0, 0, 0 }, + { QUIP_SEEPLAYER, SFX_F_GET_HER, SFX_F_HEY_YOU_COME_HERE, SFX_0037 }, + { QUIP_SHOTUNALERT, SFX_F_UNDER_FIRE, SFX_0037, SFX_F_WERE_UNDER_FIRE }, + { QUIP_INJURED1, SFX_0037, SFX_F_IM_WOUNDED, SFX_F_HELP_ME_OUT }, + { QUIP_INJURED2, SFX_F_IM_WOUNDED, SFX_F_HELP_ME_OUT, SFX_F_IM_IN_TROUBLE }, + { QUIP_KILLEDPLAYER1, 0, 0, 0 }, + { QUIP_WARNFRIENDS, SFX_F_TARGET_ATTACKING, SFX_F_UNDER_FIRE, SFX_0037 }, + { QUIP_GOFORALARM, SFX_F_GET_REINFORCEMENTS, SFX_F_EVACUATE_THE_AREA, SFX_F_RETREAT }, + { QUIP_SURPRISED, SFX_0037, SFX_F_HEY, SFX_F_HUH }, + { QUIP_INSPECTBODY, SFX_F_UNIT_DOWN, SFX_F_UNIT_DOWN, SFX_F_UNIT_DOWN }, + { QUIP_20, SFX_F_TARGET_ATTACKING, SFX_F_UNDER_FIRE, SFX_F_WERE_UNDER_FIRE }, + { QUIP_HITPLAYER, SFX_F_DID_THAT_HURT, SFX_F_YOU_WANT_SOME_MORE, SFX_0037 }, + { QUIP_MISSEDPLAYER1, SFX_F_THIS_GUNS_USELESS, SFX_0037, SFX_F_STAND_STILL }, +#if VERSION >= VERSION_NTSC_1_0 + { QUIP_MISSEDPLAYER2, SFX_F_STAND_STILL, SFX_F_SOMEONE_HIT_HER, SFX_F_DAMN_SHES_GOOD }, +#else + { QUIP_MISSEDPLAYER2, SFX_F_STAND_STILL, SFX_F_SOMEONE_HIT_HER, SFX_M1_SCREAM }, +#endif + { QUIP_GOTOCOVER2, SFX_F_GO_FOR_IT, SFX_0037, SFX_F_RUN }, + { QUIP_DIE, SFX_F_WHY_ME, SFX_F_NOO, SFX_F_MY_GOD }, + { QUIP_26, SFX_F_IM_JUST_TOO_GOOD, SFX_0037, SFX_F_SUCH_A_WASTE }, + { QUIP_SEARCHSUCCESS, SFX_F_GET_HER, SFX_F_HEY_YOU_COME_HERE, SFX_0037 }, + { QUIP_SEEEYESPY, 0, 0, 0 }, + { QUIP_GREETING, SFX_0037, SFX_F_COME_ON, SFX_0037 }, + { QUIP_ASKWEAPON1, SFX_0037, SFX_F_COME_ON, SFX_0037 }, + { QUIP_ASKWEAPON2, SFX_0037, SFX_F_COME_ON, SFX_0037 }, + { QUIP_UNCOVERDISGUISE1, SFX_0037, SFX_F_COME_ON, SFX_0037 }, + { QUIP_LOSTGUN, SFX_F_HEY, SFX_F_HUH, SFX_F_HEY }, + { QUIP_GOFORALARM, SFX_F_GET_REINFORCEMENTS, SFX_F_FALL_BACK, SFX_F_EVACUATE_THE_AREA }, + { QUIP_SEARCHFAIL, 0, 0, 0 }, + { QUIP_ATTACK3, SFX_F_COME_ON, SFX_F_COME_ON, SFX_F_ATTACK }, + { QUIP_ATTACK4, SFX_F_ATTACK, SFX_F_ATTACK, SFX_F_COME_ON }, + { QUIP_KILLEDPLAYER2, SFX_F_GET_A_CLEANER, SFX_F_IM_JUST_TOO_GOOD, SFX_F_SUCH_A_WASTE }, + { QUIP_GUNJAMMED, SFX_F_THIS_GUNS_USELESS, SFX_F_THIS_GUNS_USELESS, SFX_F_THIS_GUNS_USELESS }, + { QUIP_UNCOVEREDDISGUISE2, 0, 0, 0 }, +}; + +s16 g_SpecialQuipBank[][4] = { +#if VERSION >= VERSION_NTSC_1_0 + { 0, MP3_CASS_HOW_DARE_YOU_DISTURB_ME, MP3_CASS_YOU_WILL_REGRET, MP3_CASS_LEAVE_NOW }, +#else + { 0, 0x12f2, 0x12f3, 0x12f8 }, +#endif + { 1, MP3_SEC_PLEASE_DONT_KILL_ME, MP3_SEC_DONT_SHOOT, MP3_SEC_PLEASE_DONT_KILL_ME }, + { 2, SFX_DRCAROLL_COME_ON, SFX_DRCAROLL_TAKING_YOUR_TIME, SFX_DRCAROLL_GET_OUT_OF_HERE }, + { 3, SFX_DRCAROLL_KNOW_WHAT_YOURE_DOING, SFX_DRCAROLL_0249, SFX_DRCAROLL_GOING_TO_THE_HELIPAD }, + { 4, SFX_DRCAROLL_STOP_THAT, SFX_DRCAROLL_WHAT, SFX_ARGH_DRCAROLL_0240 }, + { 5, SFX_ARGH_DRCAROLL_024C, SFX_DRCAROLL_QUITE_ENOUGH, SFX_ARGH_DRCAROLL_0251 }, + { 6, SFX_DRCAROLL_I_CANT_MAKE_IT, SFX_DRCAROLL_YOU_WERE_SUPPOSED, SFX_DRCAROLL_SYSTEMS_FAILURE }, + { 7, SFX_DRCAROLL_OH_CRIKEY, SFX_DRCAROLL_GOODNESS_GRACIOUS, SFX_DRCAROLL_DONT_THEY_KNOW }, + { 8, MP3_K7_IM_NOT_SURE, MP3_K7_ONE_MORE_TIME, MP3_K7_I_DUNNO }, + { 9, MP3_SCI_AND_AGAIN, MP3_SCI_TRY_IT_NOW, MP3_SCI_AND_AGAIN }, + { 10, MP3_SCI_WHAT_ARE_YOU_DOING, MP3_SCI_HAVENT_SEEN_YOU, SFX_SCI_WHO_THE_HELL_ARE_YOU }, + { 11, MP3_JO_SHUT_DOWN_EXPERIMENTS, MP3_JO_PULL_THE_PLUG, MP3_JO_SWITCH_THIS_THING_OFF }, + { 12, MP3_SCI_ILL_SHUT_IT_DOWN, MP3_SCI_PLEASE_DONT_HURT_ME, MP3_SCI_ALLOW_ME_TO_ASSIST_YOU }, + { 13, MP3_SCI_MY_EXPERIMENTS, MP3_SCI_EXPERIMENT_IS_DOWN, MP3_SCI_LEAVE_THIS_AREA }, + { 14, MP3_SCI_SECURITY, MP3_SCI_IM_CALLING_SECURITY, MP3_SCI_ACCIDENTS_WILL_HAPPEN }, + { 15, MP3_SCI_HOW_DID_THAT_HAPPEN, MP3_SCI_OFF_ALREADY, MP3_SCI_HAVE_YOU_BEEN_TAMPERING }, + { 16, MP3_SCI_SOMEONES_BROKEN_MY_EQUIPMENT, MP3_SCI_WHATS_HAPPENED_TO_THE_TERMINAL, MP3_SCI_YOU_VANDAL }, + { 17, SFX_ARGH_FEMALE_000D, SFX_ARGH_FEMALE_000D, SFX_ARGH_FEMALE_000D }, + { 18, SFX_M0_HOWS_THINGS, SFX_M0_HEY_THERE, SFX_M0_HI_HOW_ARE_YOU }, + { 19, MP3_M0_WHERE_DID_YOU_GET_THAT, MP3_M0_SHOULD_YOU_HAVE_THAT, MP3_M0_WHAT_ARE_YOU_DOING }, + { 20, SFX_0037, MP3_M0_DONT_POINT_THAT_AT_ME, MP3_M0_WATCH_WHERE_YOURE_POINTING }, + { 21, MP3_M0_IMPOSTER, MP3_M0_IMPOSTER, MP3_M0_ITS_A_SPY }, + { 22, SFX_CIV_GREETINGS_CITIZEN, SFX_CIV_HEY_SUGAR_WANNA_PARTY, SFX_CIV_HEY_BABY }, + { 23, SFX_CIV_HOWS_IT_GOING, SFX_CIV_TAKE_IT_EASY, SFX_CIV_WHISTLE }, + { 24, SFX_CIV_OH_MY_GOD, SFX_CIV_I_DONT_WANT_ANY_TROUBLE, SFX_CIV_TAKE_THE_WALLET }, + { 25, SFX_CIV_THERES_A_MANIAC, SFX_CIV_QUICK_DOWN_THERE, SFX_CIV_GET_ME_OUT_OF_HERE }, + { 26, SFX_CIV_GUNS_DONT_SCARE_ME, SFX_CIV_KEEP_AWAY_FROM_THIS_CAR, SFX_CIV_KEEP_AWAY_FROM_THIS_CAR }, + { 27, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY }, + { 28, SFX_SHOULD_HAVE_COME_HERE_GIRL, SFX_SECURE_THE_PERIMETER, SFX_WERE_TAKING_OVER }, + { 29, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY }, + { 30, SFX_FBI_WE_HAVE_AN_INTRUDER, SFX_FBI_CODE_2_SITUATION, SFX_FBI_REQUEST_BACKUP_IMMEDIATELY }, + { 31, MP3_ROBOT_STOP_WHERE_YOU_ARE, MP3_ROBOT_STOP_WHERE_YOU_ARE, MP3_ROBOT_STOP_WHERE_YOU_ARE }, + { 32, MP3_COME_BACK_LATER_IM_BUSY, MP3_GO_AWAY, MP3_LOOK_I_CANT_HELP_YOU }, + { 33, MP3_PRES_STOP_SHOOTING, MP3_PRES_YOU_SURE_THIS_IS_THE_WAY, MP3_PRES_WHY_ARE_THEY_SHOOTING }, + { 34, SFX_CIV_GREETINGS_CITIZEN, SFX_CIV_HEY_SUGAR_WANNA_PARTY, 0 }, + { 35, SFX_CIV_HOWS_IT_GOING, SFX_CIV_TAKE_IT_EASY, 0 }, + { 36, SFX_CIV_OH_MY_GOD, SFX_CIV_I_DONT_WANT_ANY_TROUBLE, MP3_SEC_PLEASE_DONT_KILL_ME }, + { 37, SFX_CIV_THERES_A_MANIAC, SFX_CIV_QUICK_DOWN_THERE, 0 }, + { 38, SFX_ELVIS_INTERGALACTIC_PEACE, SFX_ELVIS_EAT_HOT_LEAD_WEIRDOS, SFX_ELVIS_KISS_MY_ALIEN_BUTT }, + { 39, SFX_ELVIS_ILL_KICK_YOUR_ASS, SFX_ELVIS_FOR_YOUR_OWN_GOOD, SFX_ELVIS_YOU_DARE_SHOOT_AT_ME }, + { 40, SFX_ELVIS_DONT_MESS_WITH_THE_MAIAN, SFX_ELVIS_IM_BAD, SFX_ELVIS_HEHE }, + { 41, SFX_ELVIS_ALL_GOING_WRONG, SFX_ELVIS_ALL_GOING_WRONG, SFX_ELVIS_WATCH_THE_SUIT }, + { 42, MP3_M2_ITS_A_TERRORIST, MP3_M0_ITS_A_SPY, MP3_M1_STOP_RIGHT_THERE }, +#if VERSION >= VERSION_NTSC_1_0 + { 43, MP3_CASS_HOW_DARE_YOU_DISTURB_ME, MP3_CASS_LEAVE_NOW, MP3_CASS_LEAVE_NOW }, +#else + { 43, 0x12f2, 0x12f8, 0x12f8, }, +#endif + { 44, SFX_ELVIS_HEHE, SFX_ELVIS_HEHE, SFX_ELVIS_HEHE }, + { 45, MP3_ROBOT_ALERT_UNDER_ATTACK, MP3_ROBOT_ALERT_UNDER_ATTACK, MP3_ROBOT_ALERT_UNDER_ATTACK }, +}; + +s16 g_QuipTexts[][4] = { + { 1, L_AME_083, L_AME_084, L_AME_085 }, // "How dare you disturb me!", "You will regret this intrusion, girl!", "If I were you, I'd leave...NOW!" + { 2, L_AME_086, L_AME_087, L_AME_086 }, // "Please don't kill me!", "Don't shoot!" + { 3, L_EAR_064, L_EAR_065, L_EAR_066 }, // "What are you doing in my lab?", "I haven't seen you before...", "Who the hell are you?" + { 4, L_EAR_067, L_EAR_068, L_EAR_069 }, // "Shut down the experiment.", "Pull the plug on that, NOW.", "Switch this thing off." + { 5, L_EAR_070, L_EAR_071, L_EAR_072 }, // "I'll shut it down.", "Please don't hurt me.", "Allow me to assist you." + { 6, L_EAR_073, L_EAR_074, L_EAR_075 }, // "My experiments!", "There the experiment is down.", "Leave this area NOW!" + { 7, L_EAR_076, L_EAR_077, L_EAR_078 }, // "Security!", "I'm calling security.", "Accidents will happen." + { 8, L_EAR_079, L_EAR_080, L_EAR_081 }, // "How did that happen?", "Looks like it's off already.", "Have you been tampering with this?" + { 9, L_EAR_082, L_EAR_083, L_EAR_084 }, // "Someone's broken my equipment.", "What's happened to the terminal?", "You vandal - you've broken it." + { 10, L_WAX_010, L_WAX_012, L_WAX_012 }, // "How dare you disturb me!", "If I were you, I'd leave... NOW!" +}; + +s16 g_SkedarQuipBank[][4] = { + { 1, SFX_SKEDAR_ROAR_0529, SFX_SKEDAR_ROAR_052A, SFX_SKEDAR_ROAR_052B }, + { 2, SFX_SKEDAR_ROAR_052D, SFX_SKEDAR_ROAR_052E, SFX_SKEDAR_ROAR_052F }, + { 3, SFX_SKEDAR_ROAR_0530, SFX_SKEDAR_ROAR_0530, SFX_SKEDAR_ROAR_0531 }, + { 1, SFX_SKEDAR_ROAR_0532, SFX_SKEDAR_ROAR_0533, SFX_SKEDAR_ROAR_0534 }, + { 2, SFX_SKEDAR_ROAR_0536, SFX_SKEDAR_ROAR_0537, SFX_SKEDAR_ROAR_0538 }, + { 3, SFX_SKEDAR_ROAR_0539, SFX_SKEDAR_ROAR_0539, SFX_SKEDAR_ROAR_053A }, + { 0 }, +}; + +s16 g_MaianQuipBank[][4] = { + { 1, SFX_MAIAN_05E2, SFX_MAIAN_05E3, SFX_MAIAN_05E4 }, + { 2, SFX_MAIAN_05E5, SFX_MAIAN_05E6, SFX_MAIAN_05E7 }, + { 3, SFX_ARGH_MAIAN_05DF, SFX_ARGH_MAIAN_05E0, SFX_ARGH_MAIAN_05E1 }, + { 0 }, +}; + +void aiSayQuip(s32 chrref, s32 row, s32 probability, s32 soundgap, s32 conditions, s32 special, s32 textrow, u32 colour) +{ + u8 column; // 167 + s16 audioid; // 164 + u8 i; // 163 + s32 numnearbychrs; // 152 + bool issomeonetalking; // 148 + u32 stack; // 140 - not referenced + s16 *chrnums; // 136 + s16 (*bank)[4]; // 132 + char *text; // 128 + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); // 124 + u32 prevplayernum = g_Vars.currentplayernum; // 120 + s32 distance; // 116 - not referenced + u32 playernum; // 108 - not referenced + u8 headshotted = (g_Vars.chrdata->hidden2 & CHRH2FLAG_HEADSHOTTED) & 0xff; // 107 + struct chrdata *loopchr; // 100 + + // Choose bank + // 2c0 + if (CHRRACE(g_Vars.chrdata) == RACE_SKEDAR) { + bank = g_SkedarQuipBank; + + if (row > 5) { + row = 0; + } + // 2e0 + } else if (g_Vars.chrdata->headnum == HEAD_MAIAN_S) { + bank = g_MaianQuipBank; + + if (row > 2) { + row = random() & 1; + } + // 324 + } else if (special == 0) { + if (g_Vars.chrdata->voicebox > 3) { + g_Vars.chrdata->voicebox = 3; + } + + bank = &g_GuardQuipBank[g_Vars.chrdata->voicebox * 41]; + } else { + // 37c + bank = g_SpecialQuipBank; + } + + // 37c + if (!row && probability && conditions) { + g_Vars.chrdata->soundtimer = 0; + return; + } + + // 3bc + chrnums = teamGetChrIds(g_Vars.chrdata->team); + numnearbychrs = 0; + issomeonetalking = false; + + // Make it impossible for Elvis and Jon to use anything but special phrases + // 3f0 + if ((g_Vars.chrdata->headnum == HEAD_ELVIS + || g_Vars.chrdata->headnum == HEAD_THEKING + || g_Vars.chrdata->headnum == HEAD_ELVIS_GOGS + || g_Vars.chrdata->headnum == HEAD_JONATHAN) && + bank != g_SpecialQuipBank) { + probability = 0; + } + + // If the person talking is a player, and they've just died, + // try using the other coop player. + // 420 + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + // 444 + playernum = playermgrGetPlayerNumByProp(chr->prop); + + if (g_Vars.coopplayernum >= 0 && g_Vars.players[playernum]->isdead) { + // 470 + if (playernum == g_Vars.bondplayernum) { + playernum = g_Vars.coopplayernum; + } else { + playernum = g_Vars.bondplayernum; + } + } + + setCurrentPlayerNum(playernum); + } + + // If soundgap permits talking at this time and probability passes + // 494 + if ((g_Vars.chrdata->soundgap == 0 || g_Vars.chrdata->soundgap * 60 < g_Vars.chrdata->soundtimer) + && probability > (u8)random()) { + // Try and find a chr in the same squadron who is currently talking + // 4dc + while (*chrnums != -2) { + loopchr = chrFindByLiteralId(*chrnums); + + if (loopchr && loopchr->model + && !chrIsDead(loopchr) + && loopchr->actiontype != ACT_DEAD + && g_Vars.chrdata->squadron == loopchr->squadron + && loopchr->alertness >= 100 + && g_Vars.chrdata->chrnum != loopchr->chrnum + && chrGetDistanceToChr(g_Vars.chrdata, loopchr->chrnum) < 7000) { + // 584 + numnearbychrs++; + + // 594 + if (loopchr->soundtimer < 60 && conditions != 0 && conditions != 255) { + issomeonetalking = true; + } + } + + chrnums++; + } + + // 5dc + if (!issomeonetalking && + ((numnearbychrs == 0 && (conditions == 0 || conditions == 255)) || + (numnearbychrs > 0 && conditions > 0))) { + column = random() % 3; + + // 64c + if ((special & 0x80) == 0) { + audioid = bank[row][1 + column]; + } else { + audioid = bank[row][1 + g_Vars.chrdata->tude]; + } + + // 6a0 + if (audioWasNotPlayedRecently(audioid) || CHRRACE(g_Vars.chrdata) == RACE_SKEDAR) { + // 6d4 + audioMarkAsRecentlyPlayed(audioid); + + // 6e8 + // Replace gurgle with "why me" + if (audioid == 0x34e && !headshotted) { + audioid = 0x34d; + } + + // 700 + g_Vars.chrdata->soundtimer = 0; + g_Vars.chrdata->soundgap = soundgap; + g_Vars.chrdata->propsoundcount++; + + // 72c + if (audioid != 0x3f7 && audioid != 0x331 && audioid != 0x3a1) { + func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); + // 7a8 + propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, + -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); + } else { + // Audio is "Stop moving", "Stop dodging" or "Stand still" + distance = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata); + + if (ABS(distance) > 50) { + func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); + // 840 + propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, + -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); + } + } + + // Consider putting text on screen + if (textrow && (special & 0x80) == 0) { + if (column > 2) { + column = 2; + } + + text = langGet(g_QuipTexts[textrow - 1][1 + column]); + + if (!sndIsFiltered(audioid)) { + // 8ac + hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, colour); + } + } else if (textrow) { + text = langGet(g_QuipTexts[textrow - 1][1 + g_Vars.chrdata->tude]); + + if (!sndIsFiltered(audioid)) { + // 904 + hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, colour); + } + } + } else { + // Audio was played recently - try and find a different one + audioid = 0; + + // 92c + for (i = 1; i < 4; i++) { + if (audioWasNotPlayedRecently(g_GuardQuipBank[row][i]) + && audioWasNotPlayedRecently(bank[row][i])) { + audioid = bank[row][i]; + break; + } + } + + // 99c + if (audioid) { + audioMarkAsRecentlyPlayed(audioid); + + // Replace gurgle with "why me" + if (audioid == 0x34e && !headshotted) { + audioid = 0x34d; + } + + g_Vars.chrdata->soundtimer = 0; + g_Vars.chrdata->soundgap = soundgap; + g_Vars.chrdata->propsoundcount++; + + // 9fc + if (audioid != 0x3f7 && audioid != 0x331 && audioid != 0x3a1) { + func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); + // a80 + propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, + -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); + } else { + // Audio is "Stop moving", "Stop dodging" or "Stand still" + // a90 + distance = chrGetDistanceLostToTargetInLastSecond(g_Vars.chrdata); + + if (ABS(distance) > 50) { + func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); + // b28 + propsnd0f0939f8(0, g_Vars.chrdata->prop, audioid, -1, + -1, 8, 0, 9, 0, -1, 0, -1, -1, -1, -1); + } + } + + // b44 + if (textrow) { + text = langGet(g_QuipTexts[textrow - 1][i]); + + if (!sndIsFiltered(audioid)) { + // b78 + hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, colour); + } + } + } else { + g_Vars.chrdata->soundtimer = 0; + g_Vars.chrdata->soundgap = soundgap; + chrUnsetFlags(g_Vars.chrdata, CHRFLAG1_TALKINGTODISGUISE, BANK_1); + } + } + } + } + + setCurrentPlayerNum(prevplayernum); +} + +void aiSetAccuracy(s32 accuracy) +{ + g_Vars.chrdata->accuracyrating = accuracy; +} + +void aiSetAction(s32 action, bool keeporders) +{ + g_Vars.chrdata->myaction = action; + + if (!keeporders) { + g_Vars.chrdata->orders = 0; + } +} + +void aiSetAlertness(s32 alertness) +{ + g_Vars.chrdata->alertness = alertness; +} + +void aiSetAllRoomsAmbient(void) +{ + s32 i; + + for (i = 1; i < g_Vars.roomcount; i++) { + g_Rooms[i].flags |= ROOMFLAG_PLAYAMBIENTTRACK; + } +} + +void aiSetAutogunTargetTeam(s32 tagnum, s32 team) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->type == OBJTYPE_AUTOGUN) { + struct autogunobj *autogun = (struct autogunobj *)obj; + autogun->targetteam = team; + autogun->target = NULL; + } +} + +bool aiSetCameraAnimation(s32 animnum) +{ + playerStartCutscene(animnum); + + return !g_Vars.currentplayer->haschrbody; +} + +void aiSetChrflag(u32 flag) +{ + g_Vars.chrdata->chrflags |= flag; +} + +void aiSetChrHudpieceVisible(s32 chrref, bool visible) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && chr->model) { + chrSetHudpieceVisible(chr, visible); + } +} + +void aiSetChrList(s32 chrref, s32 ailistid) +{ + u8 *ailist = ailistFindById(ailistid); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->ailist = ailist; + chr->aioffset = ailist; + chr->sleep = 0; + } +} + +void aiSetChrnum(s32 newnum) +{ + chrSetChrnum(g_Vars.chrdata, newnum); + g_Vars.chrdata->chrnum = newnum; +} + +void aiSetChrPreset(s32 chr) +{ + chrSetChrPreset(g_Vars.chrdata, chr); +} + +bool aiSetChrPresetToUnalertedTeammate(void) +{ + f32 closest_distance = 30999.9; + s16 candidate_chrnum = -1; + s16 *chrnums = teamGetChrIds(g_Vars.chrdata->team); + + if (g_Vars.chrdata->talktimer > TICKS(480) && g_Vars.chrdata->listening) { + g_Vars.chrdata->listening = 0; + } + + for (; *chrnums != -2; chrnums++) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->model + && !chrIsDead(chr) + && chr->actiontype != ACT_DEAD + && chr->actiontype != ACT_DIE + && chr->actiontype != ACT_DRUGGEDKO + && chr->actiontype != ACT_DRUGGEDDROP + && chr->actiontype != ACT_DRUGGEDCOMINGUP + && chr->alertness < 100 + && (g_Vars.chrdata->squadron == chr->squadron || g_Vars.chrdata->squadron == 0xff) + && g_Vars.chrdata->chrnum != chr->chrnum) { + f32 distance = chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum); + + if (distance < closest_distance) { + closest_distance = distance; + candidate_chrnum = chr->chrnum; + } + } + } + + if (candidate_chrnum != -1) { + chrSetChrPreset(g_Vars.chrdata, candidate_chrnum); + return true; + } + + return false; +} + +void aiSetChrSpecialDeathAnimation(s32 chrref, s32 specialdie) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->specialdie = specialdie; + } +} + +void aiSetChrTarget(s32 chrref, s32 chrpreset) +{ + chrSetChrPresetByChrnum(g_Vars.chrdata, chrref, chrpreset); +} + +void aiSetCoverUnused(void) +{ + if (g_Vars.chrdata->cover >= 0) { + coverSetInUse(g_Vars.chrdata->cover, false); + } +} + +void aiSetDarkRoomList(s32 ailistid) +{ + if (g_Vars.chrdata) { + g_Vars.chrdata->aidarkroomlist = ailistid; + } +} + +void aiSetDodgeRatingOnly(s32 rating) +{ + g_Vars.chrdata->dodgerating = rating; +} + +void aiSetDodgeRatingMax(s32 rating) +{ + g_Vars.chrdata->maxdodgerating = rating; +} + +void aiSetDodgeRatingBoth(s32 rating) +{ + g_Vars.chrdata->dodgerating = rating; + g_Vars.chrdata->maxdodgerating = rating; +} + +void aiSetDoorOpen(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + struct doorobj *door = (struct doorobj *) obj; + door->frac = door->maxfrac; + door->fracspeed = 0; + door->lastopen60 = g_Vars.lvframe60; + door->mode = 0; + doorUpdateTiles(door); + doorActivatePortal(door); + func0f0926bc(door->base.prop, 1, 0xffff); + } +} + +void aiSetDrCarollImages(s32 chrref, s32 image1, s32 image2) +{ + struct chrdata *drcaroll = chrFindById(g_Vars.chrdata, chrref); + + if (drcaroll) { + if (image2 == 7) { + if ((g_Vars.lvframenum % 4) == 2) { + drcaroll->drcarollimage_left = random() % 6; + } + } else if (image2 == 8) { + drcaroll->drcarollimage_left = random() % 6; + } else { + drcaroll->drcarollimage_left = image2; + } + + if (image1 == 7) { + if ((g_Vars.lvframenum % 4) == 2) { + drcaroll->drcarollimage_right = random() % 6; + } + } else if (image1 == 8) { + drcaroll->drcarollimage_right = random() % 6; + } else { + drcaroll->drcarollimage_right = image1; + } + } +} + +void aiSetFlagBank0(u32 flag) +{ + g_Vars.chrdata->flags |= flag; +} + +void aiSetFlagBank1(u32 flag) +{ + g_Vars.chrdata->flags2 |= flag; +} + +void aiSetGrenadeProbability(s32 prob) +{ + g_Vars.chrdata->grenadeprob = prob; +} + +void aiSetHearDistance(f32 distance) +{ + g_Vars.chrdata->hearingscale = distance; +} + +void aiSetLights(s32 padnum, s32 operation, s32 arg2, s32 arg3, s32 arg4) +{ + s32 roomnum = chrGetPadRoom(g_Vars.chrdata, padnum); + + if (roomnum >= 0) { + switch (operation) { + case LIGHTOP_TURNOFF: + roomSetLightsOn(roomnum, false); + break; + case LIGHTOP_TURNON: + roomSetLightsOn(roomnum, true); + break; + default: + roomSetLighting(roomnum, operation, arg2, arg3, arg4); + break; + } + } +} + +void aiSetMaxDamage(s32 chrref, f32 maxdamage) +{ + if (g_Vars.hovercar) { + chopperSetMaxDamage(g_Vars.hovercar, maxdamage); + } else { + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr && chr->prop && !chrIsDead(chr) + && chr->actiontype != ACT_DEAD + && chr->actiontype != ACT_DIE + && chr->actiontype != ACT_DRUGGEDKO + && chr->actiontype != ACT_DRUGGEDDROP + && chr->actiontype != ACT_DRUGGEDCOMINGUP) { + chrSetMaxDamage(chr, maxdamage); + } + } +} + +void aiSetMorale(s32 morale) +{ + g_Vars.chrdata->morale = morale; +} + +u8 *aiSetMyList(s32 ailistid) +{ + g_Vars.ailist = ailistFindById(ailistid); + + return g_Vars.ailist; +} + +void aiSetObjFlag(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->flags |= flag; + } +} + +void aiSetObjFlag2(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->flags2 |= flag; + } +} + +void aiSetObjFlag3(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->flags3 |= flag; + } +} + +void aiSetObjDamage(s32 tagnum, s32 damage) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->damage = damage; + } +} + +void aiSetObjImage(s32 tagnum, s32 slot, s32 image) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + if (obj->type == OBJTYPE_SINGLEMONITOR) { + struct singlemonitorobj *sm = (struct singlemonitorobj *) obj; + tvscreenSetImageByNum(&sm->screen, image); + } else if (obj->type == OBJTYPE_MULTIMONITOR) { + struct multimonitorobj *mm = (struct multimonitorobj *) obj; + tvscreenSetImageByNum(&mm->screens[slot], image); + } + } +} + +void aiSetPadPreset(s32 padnum) +{ + if (g_Vars.chrdata) { + chrSetPadPreset(g_Vars.chrdata, padnum); + } else if (g_Vars.heli) { + g_Vars.heli->base.pad = padnum; + } +} + +u16 g_InvestigationPadMap[] = { + 0x0246, 0x007b, + 0x0247, 0x007d, + 0x0248, 0x007e, + 0x0249, 0x007c, + 0x024a, 0x0093, + 0x024b, 0x0091, + 0x024c, 0x0092, + 0x024d, 0x0093, + 0x024e, 0x00ae, + 0x024f, 0x00ac, + 0x0250, 0x00ab, + 0x0251, 0x00ad, + 0x0252, 0x00a1, + 0x0253, 0x009f, + 0x0254, 0x00a0, + 0x0255, 0x009e, + 0x0256, 0x00bb, + 0x0257, 0x00b8, + 0x0258, 0x00b9, + 0x0259, 0x00ba, +}; + +void aiSetPadPresetToInvestigationTerminal(s32 tagnum) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + s32 i; + + if (obj) { + for (i = 0; i < sizeof(g_InvestigationPadMap) / sizeof(g_InvestigationPadMap[0]); i += 2) { + if (obj->pad == g_InvestigationPadMap[i]) { + chrSetPadPreset(g_Vars.chrdata, g_InvestigationPadMap[i + 1]); + break; + } + } + } +} + +bool aiSetPadPresetToTargetQuadrant(s32 quadrant) +{ + return chrSetPadPresetToWaypointWithinTargetQuadrant(g_Vars.chrdata, quadrant); +} + +void aiSetPath(s32 pathid) +{ + chrSetPath(g_Vars.chrdata, pathid); +} + +void aiSetPortalFlag(s32 portalnum, u32 flag) +{ + g_BgPortals[portalnum].flags |= flag; +} + +void aiSetReactionSpeed(s32 speed) +{ + g_Vars.chrdata->speedrating = speed; +} + +void aiSetRecoverySpeed(s32 speed) +{ + g_Vars.chrdata->arghrating = speed; +} + +void aiSetReturnList(s32 chrref, s32 ailistid) +{ + if (g_Vars.chrdata) { + if (chrref == CHR_SELF) { + g_Vars.chrdata->aireturnlist = ailistid; + } else { + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + if (chr) { + chr->aireturnlist = ailistid; + } + } + } else if (g_Vars.truck) { + g_Vars.truck->aireturnlist = ailistid; + } else if (g_Vars.heli) { + g_Vars.heli->aireturnlist = ailistid; + } else if (g_Vars.hovercar) { + g_Vars.hovercar->aireturnlist = ailistid; + } +} + +void aiSetRoomFlag(s32 roomnum, u32 flag) +{ + g_Rooms[roomnum].flags |= flag; +} + +void aiSetRoomToSearch(void) +{ + struct chrdata *target = chrFindById(g_Vars.chrdata, CHR_TARGET); + + if (target && target->prop) { + g_Vars.chrdata->roomtosearch = target->prop->rooms[0]; + } +} + +void aiSetShield(f32 amount) +{ + if (cheatIsActive(CHEAT_ENEMYSHIELDS) && amount < 8) { + amount = 8; + } + + chrSetShield(g_Vars.chrdata, amount); +} + +void aiSetShootingAtMeList(s32 ailistid) +{ + if (g_Vars.chrdata) { + g_Vars.chrdata->aishootingatmelist = ailistid; + } +} + +void aiSetShotList(s32 ailistid) +{ + if (g_Vars.chrdata) { + g_Vars.chrdata->aishotlist = ailistid; + } +} + +void aiSetSquadron(s32 squadron) +{ + g_Vars.chrdata->squadron = squadron; +} + +void aiSetTargetChr(s32 chrref) +{ + if (g_Vars.chrdata) { + s16 prop_id = propGetIndexByChrId(g_Vars.chrdata, chrref); + + if (prop_id != g_Vars.chrdata->target) { + g_Vars.chrdata->lastvisibletarget60 = 0; + g_Vars.chrdata->lastseetarget60 = 0; + g_Vars.chrdata->lastheartarget60 = 0; + g_Vars.chrdata->hidden &= ~CHRHFLAG_IS_HEARING_TARGET; + g_Vars.chrdata->chrflags &= ~CHRCFLAG_NEAR_MISS; + g_Vars.chrdata->target = prop_id; + } + } else if (g_Vars.hovercar) { + chopperSetTarget(g_Vars.hovercar, chrref); + } +} + +bool aiSetTargetToEyespyIfInSight(void) +{ + s16 prevtarget = g_Vars.chrdata->target; + struct eyespy *eyespy = g_Vars.players[g_Vars.chrdata->p1p2]->eyespy; + + if (eyespy) { + struct chrdata *chr = eyespy->prop->chr; + g_Vars.chrdata->target = propGetIndexByChrId(g_Vars.chrdata, chr->chrnum); + + if (chrCheckTargetInSight(g_Vars.chrdata)) { + return true; + } + + g_Vars.chrdata->target = prevtarget; + } + + return false; +} + +bool aiSetTeamOrders(void) +{ + struct chrnumaction *chraction; + s32 chrcount = 1; + s16 *chrnums; + struct chrnumaction chractions[50]; + s32 num; + + // Get list of chrs in the current chr's squadron + chrnums = squadronGetChrIds(g_Vars.chrdata->squadron); + + // Iterate chrs in squadron and build list of their actions. + // Put the current chr's action first. + chraction = chractions; + chraction->chrnum = g_Vars.chrdata->chrnum; + chraction->myaction = g_Vars.chrdata->myaction; + chraction++; + + if (chrnums) { + while (*chrnums != -2) { + struct chrdata *chr = chrFindByLiteralId(*chrnums); + + if (chr && chr->model + && !chrIsDead(chr) + && chr->actiontype != ACT_DEAD + && chrCompareTeams(g_Vars.chrdata, chr, COMPARE_FRIENDS) + && g_Vars.chrdata->chrnum != chr->chrnum) { + if (chr->myaction == MA_COVERWAIT + || chr->myaction == MA_NORMAL + || chr->myaction == MA_WAITING + || chr->myaction == MA_SHOOTING) { + if (chrGetDistanceToChr(g_Vars.chrdata, chr->chrnum) < 3500) { + chrcount++; + chraction->chrnum = chr->chrnum; + chraction->myaction = chr->myaction; + chraction++; + } + } + } + + chrnums++; + } + } + + chraction->myaction = MA_END; + + // Iterate the list of chrs and decide how to reassign orders to them + // based on the current chr's action + if (chrcount != 1) { + chraction = &chractions[1]; + num = 1; + + while (chraction->myaction != MA_END) { + struct chrdata *chr = chrFindByLiteralId(chraction->chrnum); + + switch (chractions[0].myaction) { + case MA_COVERGOTO: + if (!chrIsInTargetsFovX(chr, 45)) { + chr->orders = MA_SHOOTING; + } + break; + case MA_COVERBREAK: + if (!chrIsInTargetsFovX(chr, 30)) { + chr->orders = MA_SHOOTING; + } + num++; + break; + case MA_COVERSEEN: + if (!chrIsInTargetsFovX(chr, 30)) { + chr->orders = MA_SHOOTING; + g_Vars.chrdata->orders = MA_COVERGOTO; + } + num++; + break; + case MA_FLANKLEFT: + if (chrIsInTargetsFovX(chr, 50)) { + chr->orders = MA_FLANKRIGHT; + } else { + chr->orders = MA_SHOOTING; + } + num++; + g_Vars.chrdata->orders = MA_FLANKLEFT; + break; + case MA_FLANKRIGHT: + if (chrIsInTargetsFovX(chr, 50)) { + chr->orders = MA_FLANKLEFT; + } else { + chr->orders = MA_SHOOTING; + } + num++; + g_Vars.chrdata->orders = MA_FLANKRIGHT; + break; + case MA_DODGE: + if (!chrIsInTargetsFovX(chr, 30) && + chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { + chr->orders = MA_WITHDRAW; + } else { + chr->orders = MA_SHOOTING; + } + num++; + break; + case MA_GRENADE: + if (num < 2) { + chr->orders = MA_WAITING; + } else if (chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { + chr->orders = MA_WITHDRAW; + } + num++; + break; + case MA_WAITSEEN: + if (chrIsInTargetsFovX(chr, 30) && + chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { + chr->orders = MA_WITHDRAW; + } else { + chr->orders = MA_SHOOTING; + } + num++; + break; + case MA_WITHDRAW: + if (chrHasFlagById(chr, CHR_SELF, CHRFLAG0_CAN_BACKOFF, BANK_0)) { + chr->orders = MA_WITHDRAW; + } + break; + } + + chraction++; + } + + return num != 1; + } + + return false; +} + +void aiSetUnarmedDodgeRating(s32 rating) +{ + g_Vars.chrdata->unarmeddodgerating = rating; +} + +void aiSetVehicleSpeed(f32 speedaim, f32 speedtime) +{ + if (g_Vars.hovercar) { + g_Vars.hovercar->speedaim = speedaim; + g_Vars.hovercar->speedtime60 = speedtime; + } +} + +void aiSetViewDistance(s32 value) +{ + if (!cheatIsActive(CHEAT_PERFECTDARKNESS)) { + g_Vars.chrdata->visionrange = value; + } +} + +void aiShowCutsceneChrs(void) +{ + s32 i; + + for (i = chrsGetNumSlots() - 1; i >= 0; i--) { + if (g_ChrSlots[i].chrnum >= 0 && g_ChrSlots[i].prop && (g_ChrSlots[i].hidden2 & CHRH2FLAG_HIDDENFORCUTSCENE)) { + g_ChrSlots[i].hidden2 &= ~CHRH2FLAG_HIDDENFORCUTSCENE; + g_ChrSlots[i].chrflags &= ~CHRCFLAG_HIDDEN; + } + } +} + +void aiShowHudmsg(s32 chrref, s32 textid) +{ + char *text = langGet(textid); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = g_Vars.currentplayernum; + + if (chr && chr->prop && (chr->prop->type & 0xff) == PROPTYPE_PLAYER) { + playernum = playermgrGetPlayerNumByProp(chr->prop); + } + + setCurrentPlayerNum(playernum); + hudmsgCreate(text, HUDMSGTYPE_DEFAULT); + setCurrentPlayerNum(prevplayernum); +} + +void aiShowHudmsgTopMiddle(s32 chrref, s32 textid, s32 colour) +{ + char *text = langGet(textid); + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + + u32 prevplayernum = g_Vars.currentplayernum; + u32 playernum = g_Vars.currentplayernum; + + if (chr && chr->prop && (chr->prop->type & 0xff) == PROPTYPE_PLAYER) { + playernum = playermgrGetPlayerNumByProp(chr->prop); + } + + setCurrentPlayerNum(playernum); + hudmsgCreateWithColour(text, HUDMSGTYPE_INGAMESUBTITLE, colour); + setCurrentPlayerNum(prevplayernum); +} + +void aiShuffleInvestigationTerminals(s32 goodtagnum, s32 badtagnum, s32 pc1, s32 pc2, s32 pc3) +{ + u8 rand1; + u8 rand2; + struct tag *goodtag = tagFindById(goodtagnum); + struct tag *badtag = tagFindById(badtagnum); + struct tag *pc; + + rand1 = random() % 3; + rand2 = random() % 3; + + // Place the good terminal + if (rand1 == 0) { + pc = tagFindById(pc1); + goodtag->cmdoffset = pc->cmdoffset; + goodtag->obj = pc->obj; + } else if (rand1 == 1) { + pc = tagFindById(pc2); + goodtag->cmdoffset = pc->cmdoffset; + goodtag->obj = pc->obj; + } else { + pc = tagFindById(pc3); + goodtag->cmdoffset = pc->cmdoffset; + goodtag->obj = pc->obj; + } + + // Handle both good and alarm terminals having the same destination + if (rand2 == rand1 && rand2 > 0) { + rand2--; + } else if (rand2 == rand1 && rand2 < 3) { + rand2++; + } + + // Place the alarm terminal + if (rand2 == 0) { + pc = tagFindById(pc1); + badtag->cmdoffset = pc->cmdoffset; + badtag->obj = pc->obj; + } else if (rand2 == 1) { + pc = tagFindById(pc2); + badtag->cmdoffset = pc->cmdoffset; + badtag->obj = pc->obj; + } else { + pc = tagFindById(pc3); + badtag->cmdoffset = pc->cmdoffset; + badtag->obj = pc->obj; + } +} + +void aiShufflePelagicSwitches(void) +{ + u8 buttonsdone[] = {0, 0, 0, 0, 0, 0, 0, 0}; + u8 i; + u8 j; + struct tag *tag; + struct tag *button; + u8 index; + + for (i = 8; i < 16; i++) { + tag = tagFindById(i); + index = random() & 7; + + if (buttonsdone[index] == 0) { + // Switch has not yet been mapped + button = tagFindById(index); + tag->cmdoffset = button->cmdoffset; + tag->obj = button->obj; + buttonsdone[index] = 1; + } else { + // Switch is already mapped - find first unmapped switch + for (j = 0; buttonsdone[j]; j++); + + button = tagFindById(j); + tag->cmdoffset = button->cmdoffset; + tag->obj = button->obj; + buttonsdone[j] = 1; + } + } +} + +void aiShuffleRuinsPillars(void) +{ + struct tag *ptr1 = tagFindById(0x01); + struct tag *ptr2 = tagFindById(0x02); + struct tag *ptr3 = tagFindById(0x03); + struct tag *src; + u8 marked1index = random() % 5; + u8 marked2index = random() % 5; + u8 marked3index = random() % 5; + u8 pillars[5]; + u8 mines[5]; + pillars[0] = 0x2a; + pillars[1] = 0x2b; + pillars[2] = 0x2c; + pillars[3] = 0x2d; + pillars[4] = 0x2e; + mines[0] = 0x2f; + mines[1] = 0x30; + mines[2] = 0x31; + mines[3] = 0x32; + mines[4] = 0x33; + + while (marked2index == marked1index) { + marked2index = random() % 5; + } + + while (marked3index == marked2index || marked3index == marked1index) { + marked3index = random() % 5; + } + + // Pillar/mine 1 + src = tagFindById(pillars[marked1index]); + ptr1->cmdoffset = src->cmdoffset; + ptr1->obj = src->obj; + + ptr1 = tagFindById(0x27); + src = tagFindById(mines[marked1index]); + ptr1->cmdoffset = src->cmdoffset; + ptr1->obj = src->obj; + + // Pillar/mine 2 + src = tagFindById(pillars[marked2index]); + ptr2->cmdoffset = src->cmdoffset; + ptr2->obj = src->obj; + + ptr2 = tagFindById(0x28); + src = tagFindById(mines[marked2index]); + ptr2->cmdoffset = src->cmdoffset; + ptr2->obj = src->obj; + + // Pillar/mine 3 + src = tagFindById(pillars[marked3index]); + ptr3->cmdoffset = src->cmdoffset; + ptr3->obj = src->obj; + + ptr3 = tagFindById(0x29); + src = tagFindById(mines[marked3index]); + ptr3->cmdoffset = src->cmdoffset; + ptr3->obj = src->obj; +} + +void aiSpeak(s32 chrref, s32 text_id, s32 audio_id, s32 channel, s32 colour) +{ + struct chrdata *chr = chrFindById(g_Vars.chrdata, chrref); + s32 prevplayernum = g_Vars.currentplayernum; + s32 playernum = prevplayernum; + u32 channelnum; + char *text = text_id >= 0 ? langGet(text_id) : NULL; + + if (chr && chr->prop && chr->prop->type == PROPTYPE_PLAYER) { + playernum = playermgrGetPlayerNumByProp(chr->prop); + } + + setCurrentPlayerNum(playernum); + + if (text && chrref != CHR_P1P2) { + func0f0926bc(g_Vars.chrdata->prop, 9, 0xffff); + } + + if (chrref == CHR_P1P2) { + channelnum = audioPlayFromProp(channel, audio_id, 0, g_Vars.chrdata->prop, 0, 512); + } else { + channelnum = audioPlayFromProp(channel, audio_id, 0, g_Vars.chrdata->prop, 9, 512); + } + + if (text && !sndIsFiltered(audio_id)) { + hudmsgCreateAsSubtitle(text, HUDMSGTYPE_INGAMESUBTITLE, colour, channelnum); + } + + setCurrentPlayerNum(prevplayernum); +} + +void aiStartPatrol(void) +{ + chrTryStartPatrol(g_Vars.chrdata); +} + +void aiStop(void) +{ + if (g_Vars.chrdata) { + chrTryStop(g_Vars.chrdata); + } else if (g_Vars.hovercar) { + chopperStop(g_Vars.hovercar); + } +} + +void aiSubtractMorale(s32 amount) +{ + decrementByte(&g_Vars.chrdata->morale, amount); +} + +void aiSurrender(void) +{ + chrTrySurrender(g_Vars.chrdata); +} + +bool aiTryAttackKneel(u32 thingtype, u32 thingid) +{ + return chrTryAttackKneel(g_Vars.chrdata, thingtype, thingid); +} + +bool aiTryAttackLie(u32 thingtype, u32 thingid) +{ + return chrTryAttackLie(g_Vars.chrdata, thingtype, thingid); +} + +bool aiTryAttackRoll(void) +{ + return chrTryAttackRoll(g_Vars.chrdata); +} + +bool aiTryAttackStand(u32 thingtype, u32 thingid) +{ + return chrTryAttackStand(g_Vars.chrdata, thingtype, thingid); +} + +bool aiTryAttackWalk(void) +{ + return chrTryAttackWalk(g_Vars.chrdata); +} + +struct prop *aiTryEquipWeapon(s32 model, s32 weaponnum, u32 flags) +{ + struct prop *prop = NULL; + + if (g_Vars.chrdata && g_Vars.chrdata->prop && g_Vars.chrdata->model) { + if (cheatIsActive(CHEAT_MARQUIS)) { + flags &= ~OBJFLAG_WEAPON_LEFTHANDED; + flags |= OBJFLAG_WEAPON_AICANNOTUSE; + + prop = chrGiveWeapon(g_Vars.chrdata, model, weaponnum, flags); + } else if (cheatIsActive(CHEAT_ENEMYROCKETS)) { + switch (weaponnum) { + case WEAPON_FALCON2: + case WEAPON_FALCON2_SILENCER: + case WEAPON_FALCON2_SCOPE: + case WEAPON_MAGSEC4: + case WEAPON_MAULER: + case WEAPON_PHOENIX: + case WEAPON_DY357MAGNUM: + case WEAPON_DY357LX: + case WEAPON_CMP150: + case WEAPON_CYCLONE: + case WEAPON_CALLISTO: + case WEAPON_RCP120: + case WEAPON_LAPTOPGUN: + case WEAPON_DRAGON: + case WEAPON_AR34: + case WEAPON_SUPERDRAGON: + case WEAPON_SHOTGUN: + case WEAPON_REAPER: + case WEAPON_SNIPERRIFLE: + case WEAPON_FARSIGHT: + case WEAPON_DEVASTATOR: + case WEAPON_ROCKETLAUNCHER: + case WEAPON_SLAYER: + case WEAPON_COMBATKNIFE: + case WEAPON_CROSSBOW: + case WEAPON_TRANQUILIZER: + case WEAPON_GRENADE: + case WEAPON_NBOMB: + case WEAPON_TIMEDMINE: + case WEAPON_PROXIMITYMINE: + case WEAPON_REMOTEMINE: + prop = chrGiveWeapon(g_Vars.chrdata, MODEL_CHRDYROCKET, WEAPON_ROCKETLAUNCHER, flags); + break; + case WEAPON_K7AVENGER: + if (g_Vars.stagenum == STAGE_INVESTIGATION && lvGetDifficulty() == DIFF_PA) { + prop = chrGiveWeapon(g_Vars.chrdata, model, weaponnum, flags); + } else { + prop = chrGiveWeapon(g_Vars.chrdata, MODEL_CHRDYROCKET, WEAPON_ROCKETLAUNCHER, flags); + } + break; + default: + prop = chrGiveWeapon(g_Vars.chrdata, model, weaponnum, flags); + break; + } + } else { + prop = chrGiveWeapon(g_Vars.chrdata, model, weaponnum, flags); + } + } + + return prop; +} + +bool aiTryFaceEntity(u32 entitytype, u32 entityid) +{ + return chrFaceEntity(g_Vars.chrdata, entitytype, entityid); +} + +bool aiTryJogToChr(s32 chrref) +{ + return chrGoToChr(g_Vars.chrdata, chrref, GOPOSFLAG_JOG); +} + +bool aiTryJogToTarget(void) +{ + return chrGoToTarget(g_Vars.chrdata, GOPOSFLAG_JOG); +} + +bool aiTryJumpOut(void) +{ + return chrTryJumpOut(g_Vars.chrdata); +} + +bool aiTryMelee(void) +{ + return g_Vars.chrdata && chrTryPunch(g_Vars.chrdata, 0); +} + +bool aiTryModifyAttack(u32 thingtype, u32 thingid) +{ + return (g_Vars.chrdata && chrTryModifyAttack(g_Vars.chrdata, thingtype, thingid)) + || (g_Vars.hovercar && chopperAttack(g_Vars.hovercar)); +} + +bool aiTryRunSideways(void) +{ + return chrTryRunSideways(g_Vars.chrdata); +} + +bool aiTryRunToChr(s32 chrref) +{ + return chrGoToChr(g_Vars.chrdata, chrref, GOPOSFLAG_RUN); +} + +bool aiTryRunToTarget(void) +{ + return chrGoToTarget(g_Vars.chrdata, GOPOSFLAG_RUN); +} + +bool aiTrySidestep(void) +{ + return chrTrySidestep(g_Vars.chrdata); +} + +struct prop *aiSpawnChrAtChr(s32 bodynum, s32 headnum, s32 chrref, s32 ailistid, u32 spawnflags) +{ + u8 *ailist = ailistFindById(ailistid); + + return chrSpawnAtChr(g_Vars.chrdata, bodynum, headnum, chrref, ailist, spawnflags); +} + +struct prop *aiSpawnChrAtPad(s32 bodynum, s32 headnum, s32 padnum, s32 ailistid, u32 spawnflags) +{ + u8 *ailist = ailistFindById(ailistid); + + return chrSpawnAtPad(g_Vars.chrdata, bodynum, headnum, padnum, ailist, spawnflags); +} + +bool aiTryWalkToTarget(void) +{ + return chrGoToTarget(g_Vars.chrdata, GOPOSFLAG_WALK); +} + +void aiUnlockDoor(s32 tagnum, u32 flags) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop && obj->prop->type == PROPTYPE_DOOR) { + struct doorobj *door = (struct doorobj *) obj; + door->keyflags &= ~flags; + } +} + +void aiUnsetAllRoomsAmbient(void) +{ + s32 i; + + for (i = 1; i < g_Vars.roomcount; i++) { + g_Rooms[i].flags &= ~ROOMFLAG_PLAYAMBIENTTRACK; + } +} + +void aiUnsetChrflag(u32 flag) +{ + g_Vars.chrdata->chrflags &= ~flag; +} + +void aiUnsetFlagBank0(u32 flag) +{ + g_Vars.chrdata->flags &= ~flag; +} + +void aiUnsetFlagBank1(u32 flag) +{ + g_Vars.chrdata->flags2 &= ~flag; +} + +void aiUnsetObjFlag(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->flags &= ~flag; + } +} + +void aiUnsetObjFlag2(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->flags2 &= ~flag; + } +} + +void aiUnsetObjFlag3(s32 tagnum, u32 flag) +{ + struct defaultobj *obj = objFindByTagId(tagnum); + + if (obj && obj->prop) { + obj->flags3 &= ~flag; + } +} + +void aiUnsetRoomFlag(s32 roomnum, u32 flag) +{ + g_Rooms[roomnum].flags &= ~flag; +} + +void aiWalkToPad(s32 padnum) +{ + chrGoToPad(g_Vars.chrdata, padnum, GOPOSFLAG_WALK); +} + +void propDecrementSoundCount(struct prop *prop) +{ + if (prop && prop->chr && prop->chr->model && prop->chr->propsoundcount > 0) { + prop->chr->propsoundcount--; + } +} diff --git a/src/game/mplayer/mpaicommands.c b/src/game/mplayer/mpaicommands.c index a05ca669d..7ed7f41e9 100644 --- a/src/game/mplayer/mpaicommands.c +++ b/src/game/mplayer/mpaicommands.c @@ -1,8 +1 @@ #include -#include "constants.h" -#include "game/chrai.h" -#include "game/bot.h" -#include "bss.h" -#include "data.h" -#include "types.h" - diff --git a/src/game/setup.c b/src/game/setup.c index 29e7f48d4..355b1d051 100644 --- a/src/game/setup.c +++ b/src/game/setup.c @@ -26,6 +26,7 @@ #include "game/propobj.h" #include "bss.h" #include "lib/args.h" +#include "lib/dma.h" #include "lib/memp.h" #include "lib/model.h" #include "lib/path.h" @@ -1277,6 +1278,27 @@ void setupLoadBriefing(s32 stagenum, u8 *buffer, s32 bufferlen, struct briefing } } +extern u8 _setupdishasmSegmentStart; + +struct ailist *getStageAilists(void) +{ + if (g_StageIndex >= 0 && g_StageIndex < ARRAYCOUNT(g_Stages)) { + if (g_Stages[g_StageIndex].ailistsromstart) { + u8 *dst = &_setupdishasmSegmentStart; + u32 len = g_Stages[g_StageIndex].ailistsromend - g_Stages[g_StageIndex].ailistsromstart; + + dmaExec(dst, (u32) g_Stages[g_StageIndex].ailistsromstart, len); + + osInvalICache(0, ICACHE_SIZE); + osInvalDCache(0, DCACHE_SIZE); + + return g_Stages[g_StageIndex].ailists; + } + } + + return NULL; +} + void setupLoadFiles(s32 stagenum) { s32 i; @@ -1314,7 +1336,7 @@ void setupLoadFiles(s32 stagenum) g_StageSetup.intro = (s32 *)((u32)setup + (u32)setup->intro); g_StageSetup.props = (u32 *)((u32)setup + (u32)setup->props); g_StageSetup.paths = (struct path *)((u32)setup + (u32)setup->paths); - g_StageSetup.ailists = (struct ailist *)((u32)setup + (u32)setup->ailists); + g_StageSetup.ailists = getStageAilists(); g_LoadType = LOADTYPE_PADS; @@ -1324,13 +1346,6 @@ void setupLoadFiles(s32 stagenum) g_StageSetup.waygroups = NULL; g_StageSetup.cover = NULL; - // Convert ailist pointers from file-local to proper pointers - if (g_StageSetup.ailists) { - for (i = 0; g_StageSetup.ailists[i].list != NULL; i++) { - g_StageSetup.ailists[i].list = (u8 *)((u32)setup + (u32)g_StageSetup.ailists[i].list); - } - } - // Sort the global AI lists by ID asc do { modified = false; @@ -1367,8 +1382,6 @@ void setupLoadFiles(s32 stagenum) for (g_NumGlobalAilists = 0; g_GlobalAilists[g_NumGlobalAilists].list != NULL; g_NumGlobalAilists++); for (g_NumLvAilists = 0; g_StageSetup.ailists[g_NumLvAilists].list != NULL; g_NumLvAilists++); - ailistPreprocessFile(g_StageSetup.ailists, MEMPOOL_STAGE); - // Convert path pad pointers from file-local to proper pointers // and calculate the path lengths if (g_StageSetup.paths) { diff --git a/src/game/stagetable.c b/src/game/stagetable.c index 5a1e5745f..3f70676e6 100644 --- a/src/game/stagetable.c +++ b/src/game/stagetable.c @@ -4,71 +4,188 @@ #include "data.h" #include "types.h" +extern u8 _setupdishasmSegmentRomStart; +extern u8 _setupameasmSegmentRomStart; +extern u8 _setupearasmSegmentRomStart; +extern u8 _setuparkasmSegmentRomStart; +extern u8 _setupeldasmSegmentRomStart; +extern u8 _setuppeteasmSegmentRomStart; +extern u8 _setupdepoasmSegmentRomStart; +extern u8 _setuplueasmSegmentRomStart; +extern u8 _setuplipasmSegmentRomStart; +extern u8 _setuptraasmSegmentRomStart; +extern u8 _setupcaveasmSegmentRomStart; +extern u8 _setupritasmSegmentRomStart; +extern u8 _setupaztasmSegmentRomStart; +extern u8 _setupdamasmSegmentRomStart; +extern u8 _setuppamasmSegmentRomStart; +extern u8 _setupimpasmSegmentRomStart; +extern u8 _setupleeasmSegmentRomStart; +extern u8 _setupshoasmSegmentRomStart; +extern u8 _setupwaxasmSegmentRomStart; +extern u8 _setupsevasmSegmentRomStart; +extern u8 _setupstatasmSegmentRomStart; +extern u8 _setupateasmSegmentRomStart; +extern u8 _mp_setuparecasmSegmentRomStart; +extern u8 _mp_setupcradasmSegmentRomStart; +extern u8 _mp_setupcrypasmSegmentRomStart; +extern u8 _mp_setupjunasmSegmentRomStart; +extern u8 _mp_setupmp1asmSegmentRomStart; +extern u8 _mp_setupmp3asmSegmentRomStart; +extern u8 _mp_setupmp4asmSegmentRomStart; +extern u8 _mp_setupmp5asmSegmentRomStart; +extern u8 _mp_setupmp9asmSegmentRomStart; +extern u8 _mp_setupmp10asmSegmentRomStart; +extern u8 _mp_setupmp11asmSegmentRomStart; +extern u8 _mp_setupmp12asmSegmentRomStart; +extern u8 _mp_setupmp13asmSegmentRomStart; +extern u8 _mp_setupmp15asmSegmentRomStart; +extern u8 _mp_setupoatasmSegmentRomStart; +extern u8 _mp_setuprefasmSegmentRomStart; + +extern u8 _setupdishasmSegmentRomEnd; +extern u8 _setupameasmSegmentRomEnd; +extern u8 _setupearasmSegmentRomEnd; +extern u8 _setuparkasmSegmentRomEnd; +extern u8 _setupeldasmSegmentRomEnd; +extern u8 _setuppeteasmSegmentRomEnd; +extern u8 _setupdepoasmSegmentRomEnd; +extern u8 _setuplueasmSegmentRomEnd; +extern u8 _setuplipasmSegmentRomEnd; +extern u8 _setuptraasmSegmentRomEnd; +extern u8 _setupcaveasmSegmentRomEnd; +extern u8 _setupritasmSegmentRomEnd; +extern u8 _setupaztasmSegmentRomEnd; +extern u8 _setupdamasmSegmentRomEnd; +extern u8 _setuppamasmSegmentRomEnd; +extern u8 _setupimpasmSegmentRomEnd; +extern u8 _setupleeasmSegmentRomEnd; +extern u8 _setupshoasmSegmentRomEnd; +extern u8 _setupwaxasmSegmentRomEnd; +extern u8 _setupsevasmSegmentRomEnd; +extern u8 _setupstatasmSegmentRomEnd; +extern u8 _setupateasmSegmentRomEnd; +extern u8 _mp_setuparecasmSegmentRomEnd; +extern u8 _mp_setupcradasmSegmentRomEnd; +extern u8 _mp_setupcrypasmSegmentRomEnd; +extern u8 _mp_setupjunasmSegmentRomEnd; +extern u8 _mp_setupmp1asmSegmentRomEnd; +extern u8 _mp_setupmp3asmSegmentRomEnd; +extern u8 _mp_setupmp4asmSegmentRomEnd; +extern u8 _mp_setupmp5asmSegmentRomEnd; +extern u8 _mp_setupmp9asmSegmentRomEnd; +extern u8 _mp_setupmp10asmSegmentRomEnd; +extern u8 _mp_setupmp11asmSegmentRomEnd; +extern u8 _mp_setupmp12asmSegmentRomEnd; +extern u8 _mp_setupmp13asmSegmentRomEnd; +extern u8 _mp_setupmp15asmSegmentRomEnd; +extern u8 _mp_setupoatasmSegmentRomEnd; +extern u8 _mp_setuprefasmSegmentRomEnd; + +extern struct ailist g_StageAilists_dish; +extern struct ailist g_StageAilists_ame; +extern struct ailist g_StageAilists_ear; +extern struct ailist g_StageAilists_ark; +extern struct ailist g_StageAilists_eld; +extern struct ailist g_StageAilists_pete; +extern struct ailist g_StageAilists_depo; +extern struct ailist g_StageAilists_lue; +extern struct ailist g_StageAilists_lip; +extern struct ailist g_StageAilists_tra; +extern struct ailist g_StageAilists_cave; +extern struct ailist g_StageAilists_rit; +extern struct ailist g_StageAilists_azt; +extern struct ailist g_StageAilists_dam; +extern struct ailist g_StageAilists_pam; +extern struct ailist g_StageAilists_imp; +extern struct ailist g_StageAilists_lee; +extern struct ailist g_StageAilists_sho; +extern struct ailist g_StageAilists_wax; +extern struct ailist g_StageAilists_sev; +extern struct ailist g_StageAilists_stat; +extern struct ailist g_StageAilists_ate; +extern struct ailist g_StageAilists_mp_arec; +extern struct ailist g_StageAilists_mp_crad; +extern struct ailist g_StageAilists_mp_cryp; +extern struct ailist g_StageAilists_mp_jun; +extern struct ailist g_StageAilists_mp_mp1; +extern struct ailist g_StageAilists_mp_mp3; +extern struct ailist g_StageAilists_mp_mp4; +extern struct ailist g_StageAilists_mp_mp5; +extern struct ailist g_StageAilists_mp_mp9; +extern struct ailist g_StageAilists_mp_mp10; +extern struct ailist g_StageAilists_mp_mp11; +extern struct ailist g_StageAilists_mp_mp12; +extern struct ailist g_StageAilists_mp_mp13; +extern struct ailist g_StageAilists_mp_mp15; +extern struct ailist g_StageAilists_mp_oat; +extern struct ailist g_StageAilists_mp_ref; + // When adding or removing items from this table you must also update the // STAGEINDEX constants in constants.h. struct stagetableentry g_Stages[61] = { - // id, ?, lia, liw, lih, ?, bg, tiles, pads, setup, mpsetp, ? 0x18, 0x1c, ?, ?, ?, 0x24, 0x28, ?, ?, ? ? - /*0x00*/ STAGE_MAIANSOS, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_SEV_PADS, FILE_USETUPSEV, FILE_UMP_SETUPSEV, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x01*/ STAGE_TEST_SILO, 2, 255, 100, 100, 0, FILE_BG_OAT_SEG, FILE_BG_OAT_TILES, FILE_BG_OAT_PADS, FILE_USETUPSILO, FILE_UMP_SETUPSILO, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, - /*0x02*/ STAGE_WAR, 2, 255, 100, 100, 0, FILE_BG_SHO_SEG, FILE_BG_SHO_TILES, FILE_BG_STAT_PADS, FILE_USETUPSTAT, FILE_UMP_SETUPSTAT, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x03*/ STAGE_MP_RAVINE, 2, 255, 100, 100, 0, FILE_BG_AREC_SEG, FILE_BG_AREC_TILES, FILE_BG_AREC_PADS, FILE_USETUPAREC, FILE_UMP_SETUPAREC, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, - /*0x04*/ STAGE_TEST_ARCH, 2, 255, 100, 100, 0, FILE_BG_ARCH_SEG, FILE_BG_ARCH_TILES, FILE_BG_ARCH_PADS, FILE_USETUPARCH, FILE_UMP_SETUPARCH, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x05*/ STAGE_ESCAPE, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_TRA_PADS, FILE_USETUPTRA, FILE_UMP_SETUPTRA, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x06*/ STAGE_TEST_DEST, 2, 255, 100, 100, 0, FILE_BG_DEST_SEG, FILE_BG_DEST_TILES, FILE_BG_DEST_PADS, FILE_USETUPDEST, FILE_UMP_SETUPDEST, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x07*/ STAGE_RETAKING, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_SEVB_PADS, FILE_USETUPSEVB, FILE_UMP_SETUPSEVB, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x08*/ STAGE_CRASHSITE, 2, 255, 100, 100, 0, FILE_BG_AZT_SEG, FILE_BG_AZT_TILES, FILE_BG_AZT_PADS, FILE_USETUPAZT, FILE_UMP_SETUPAZT, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x09*/ STAGE_CHICAGO, 2, 255, 100, 100, 0, FILE_BG_PETE_SEG, FILE_BG_PETE_TILES, FILE_BG_PETE_PADS, FILE_USETUPPETE, FILE_UMP_SETUPPETE, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x0a*/ STAGE_G5BUILDING, 2, 255, 100, 100, 0, FILE_BG_DEPO_SEG, FILE_BG_DEPO_TILES, FILE_BG_DEPO_PADS, FILE_USETUPDEPO, FILE_UMP_SETUPDEPO, 1, 1, 100, 0, 0, 20, 220, 0x3e19999a, -1, 400, 0, 1, - /*0x0b*/ STAGE_MP_COMPLEX, 2, 255, 100, 100, 0, FILE_BG_REF_SEG, FILE_BG_REF_TILES, FILE_BG_REF_PADS, FILE_USETUPREF, FILE_UMP_SETUPREF, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x0c*/ STAGE_MP_G5BUILDING, 2, 255, 100, 100, 0, FILE_BG_CRYP_SEG, FILE_BG_CRYP_TILES, FILE_BG_CRYP_PADS, FILE_USETUPCRYP, FILE_UMP_SETUPCRYP, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, - /*0x0d*/ STAGE_PELAGIC, 2, 255, 100, 100, 0, FILE_BG_DAM_SEG, FILE_BG_DAM_TILES, FILE_BG_DAM_PADS, FILE_USETUPDAM, FILE_UMP_SETUPDAM, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x0e*/ STAGE_EXTRACTION, 2, 255, 100, 100, 0, FILE_BG_AME_SEG, FILE_BG_AME_TILES, FILE_BG_ARK_PADS, FILE_USETUPARK, FILE_UMP_SETUPARK, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x0f*/ STAGE_TEST_RUN, 2, 255, 100, 100, 0, FILE_BG_RUN_SEG, FILE_BG_RUN_TILES, FILE_BG_RUN_PADS, FILE_USETUPRUN, FILE_UMP_SETUPRUN, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x10*/ STAGE_24, 2, 255, 100, 100, 0, FILE_BG_SEVX_SEG, FILE_BG_SEVX_TILES, FILE_BG_SEVX_PADS, FILE_USETUPSEVX, FILE_UMP_SETUPSEVX, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x11*/ STAGE_MP_TEMPLE, 2, 255, 100, 100, 0, FILE_BG_JUN_SEG, FILE_BG_JUN_TILES, FILE_BG_JUN_PADS, FILE_USETUPJUN, FILE_UMP_SETUPJUN, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, - /*0x12*/ STAGE_CITRAINING, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_DISH_PADS, FILE_USETUPDISH, FILE_UMP_SETUPDISH, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x13*/ STAGE_AIRBASE, 2, 255, 100, 100, 0, FILE_BG_CAVE_SEG, FILE_BG_CAVE_TILES, FILE_BG_CAVE_PADS, FILE_USETUPCAVE, FILE_UMP_SETUPCAVE, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x14*/ STAGE_28, 2, 255, 100, 100, 0, FILE_BG_CAT_SEG, FILE_BG_CAT_TILES, FILE_BG_CAT_PADS, FILE_USETUPCAT, FILE_UMP_SETUPCAT, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 200, 800, 400, 1, - /*0x15*/ STAGE_MP_PIPES, 2, 255, 100, 100, 0, FILE_BG_CRAD_SEG, FILE_BG_CRAD_TILES, FILE_BG_CRAD_PADS, FILE_USETUPCRAD, FILE_UMP_SETUPCRAD, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, - /*0x16*/ STAGE_SKEDARRUINS, 2, 255, 100, 100, 0, FILE_BG_SHO_SEG, FILE_BG_SHO_TILES, FILE_BG_SHO_PADS, FILE_USETUPSHO, FILE_UMP_SETUPSHO, 1, 1, 100, 0, 0, 20, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x17*/ STAGE_2B, 2, 255, 100, 100, 0, FILE_BG_SEVX_SEG, FILE_BG_SEVX_TILES, FILE_BG_SEVX_PADS, FILE_USETUPSEVX, FILE_UMP_SETUPSEVX, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x18*/ STAGE_VILLA, 2, 255, 100, 100, 0, FILE_BG_ELD_SEG, FILE_BG_ELD_TILES, FILE_BG_ELD_PADS, FILE_USETUPELD, FILE_UMP_SETUPELD, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x19*/ STAGE_DEFENSE, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_IMP_PADS, FILE_USETUPIMP, FILE_UMP_SETUPIMP, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x1a*/ STAGE_TEST_ASH, 2, 255, 100, 100, 0, FILE_BG_ASH_SEG, FILE_BG_ASH_TILES, FILE_BG_ASH_PADS, FILE_USETUPASH, FILE_UMP_SETUPASH, 1, 1, 100, 0, 0, -1, 500, 0x3e19999a, -1, 400, 0, 1, - /*0x1b*/ STAGE_INFILTRATION, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_LUE_PADS, FILE_USETUPLUE, FILE_UMP_SETUPLUE, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x1c*/ STAGE_DEFECTION, 2, 255, 100, 100, 0, FILE_BG_AME_SEG, FILE_BG_AME_TILES, FILE_BG_AME_PADS, FILE_USETUPAME, FILE_UMP_SETUPAME, 1, 1, 100, 0, 0, 40, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x1d*/ STAGE_AIRFORCEONE, 2, 255, 100, 100, 0, FILE_BG_RIT_SEG, FILE_BG_RIT_TILES, FILE_BG_RIT_PADS, FILE_USETUPRIT, FILE_UMP_SETUPRIT, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x1e*/ STAGE_MP_SKEDAR, 2, 255, 100, 100, 0, FILE_BG_OAT_SEG, FILE_BG_OAT_TILES, FILE_BG_OAT_PADS, FILE_USETUPOAT, FILE_UMP_SETUPOAT, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, - /*0x1f*/ STAGE_INVESTIGATION, 2, 255, 100, 100, 0, FILE_BG_EAR_SEG, FILE_BG_EAR_TILES, FILE_BG_EAR_PADS, FILE_USETUPEAR, FILE_UMP_SETUPEAR, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x20*/ STAGE_ATTACKSHIP, 2, 255, 100, 100, 0, FILE_BG_LEE_SEG, FILE_BG_LEE_TILES, FILE_BG_LEE_PADS, FILE_USETUPLEE, FILE_UMP_SETUPLEE, 1, 1, 100, 0, 0, 40, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x21*/ STAGE_RESCUE, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_LIP_PADS, FILE_USETUPLIP, FILE_UMP_SETUPLIP, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x22*/ STAGE_TEST_LEN, 2, 255, 100, 100, 0, FILE_BG_LEN_SEG, FILE_BG_LEN_TILES, FILE_BG_LEN_PADS, FILE_USETUPLEN, FILE_UMP_SETUPLEN, 0.10040000081062, 1, 6.6844921112061, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x23*/ STAGE_MBR, 2, 255, 100, 100, 0, FILE_BG_AME_SEG, FILE_BG_AME_TILES, FILE_BG_AME_PADS, FILE_USETUPWAX, FILE_UMP_SETUPWAX, 1, 1, 100, 0, 0, 40, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x24*/ STAGE_DEEPSEA, 8, 96, 80, 200, 0, FILE_BG_PAM_SEG, FILE_BG_PAM_TILES, FILE_BG_PAM_PADS, FILE_USETUPPAM, FILE_UMP_SETUPPAM, 1, 1, 100, 0, 0, 30, 255, 0x3e4ccccd, 300, 600, 0, 1, - /*0x25*/ STAGE_TEST_UFF, 2, 255, 100, 100, 0, FILE_BG_UFF_SEG, FILE_BG_UFF_TILES, FILE_BG_UFF_PADS, FILE_USETUPUFF, FILE_UMP_SETUPUFF, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x26*/ STAGE_TEST_OLD, 2, 255, 100, 100, 0, FILE_BG_OLD_SEG, FILE_BG_OLD_TILES, FILE_BG_OLD_PADS, FILE_USETUPOLD, FILE_UMP_SETUPOLD, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x27*/ STAGE_DUEL, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_ATE_PADS, FILE_USETUPATE, FILE_UMP_SETUPATE, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x28*/ STAGE_TEST_LAM, 2, 255, 100, 100, 0, FILE_BG_LAM_SEG, FILE_BG_LAM_TILES, FILE_BG_LAM_PADS, FILE_USETUPLAM, FILE_UMP_SETUPLAM, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x29*/ STAGE_MP_BASE, 2, 255, 100, 100, 0, FILE_BG_MP1_SEG, FILE_BG_MP1_TILES, FILE_BG_MP1_PADS, FILE_USETUPMP1, FILE_UMP_SETUPMP1, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x2a*/ STAGE_TEST_MP2, 2, 255, 100, 100, 0, FILE_BG_MP2_SEG, FILE_BG_MP2_TILES, FILE_BG_MP2_PADS, FILE_USETUPMP2, FILE_UMP_SETUPMP2, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x2b*/ STAGE_MP_AREA52, 2, 255, 100, 100, 0, FILE_BG_MP3_SEG, FILE_BG_MP3_TILES, FILE_BG_MP3_PADS, FILE_USETUPMP3, FILE_UMP_SETUPMP3, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x2c*/ STAGE_MP_WAREHOUSE, 2, 255, 100, 100, 0, FILE_BG_MP4_SEG, FILE_BG_MP4_TILES, FILE_BG_MP4_PADS, FILE_USETUPMP4, FILE_UMP_SETUPMP4, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x2d*/ STAGE_MP_CARPARK, 2, 255, 100, 100, 0, FILE_BG_MP5_SEG, FILE_BG_MP5_TILES, FILE_BG_MP5_PADS, FILE_USETUPMP5, FILE_UMP_SETUPMP5, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x2e*/ STAGE_TEST_MP6, 2, 255, 100, 100, 0, FILE_BG_MP6_SEG, FILE_BG_MP6_TILES, FILE_BG_MP6_PADS, FILE_USETUPMP6, FILE_UMP_SETUPMP6, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x2f*/ STAGE_TEST_MP7, 2, 255, 100, 100, 0, FILE_BG_MP7_SEG, FILE_BG_MP7_TILES, FILE_BG_MP7_PADS, FILE_USETUPMP7, FILE_UMP_SETUPMP7, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x30*/ STAGE_TEST_MP8, 2, 255, 100, 100, 0, FILE_BG_MP8_SEG, FILE_BG_MP8_TILES, FILE_BG_MP8_PADS, FILE_USETUPMP8, FILE_UMP_SETUPMP8, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x31*/ STAGE_MP_RUINS, 2, 255, 100, 100, 0, FILE_BG_MP9_SEG, FILE_BG_MP9_TILES, FILE_BG_MP9_PADS, FILE_USETUPMP9, FILE_UMP_SETUPMP9, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x32*/ STAGE_MP_SEWERS, 2, 255, 100, 100, 0, FILE_BG_MP10_SEG, FILE_BG_MP10_TILES, FILE_BG_MP10_PADS, FILE_USETUPMP10, FILE_UMP_SETUPMP10, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x33*/ STAGE_MP_FELICITY, 2, 255, 100, 100, 0, FILE_BG_MP11_SEG, FILE_BG_MP11_TILES, FILE_BG_MP11_PADS, FILE_USETUPMP11, FILE_UMP_SETUPMP11, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x34*/ STAGE_MP_FORTRESS, 2, 255, 100, 100, 0, FILE_BG_MP12_SEG, FILE_BG_MP12_TILES, FILE_BG_MP12_PADS, FILE_USETUPMP12, FILE_UMP_SETUPMP12, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x35*/ STAGE_MP_VILLA, 2, 255, 100, 100, 0, FILE_BG_MP13_SEG, FILE_BG_MP13_TILES, FILE_BG_MP13_PADS, FILE_USETUPMP13, FILE_UMP_SETUPMP13, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x36*/ STAGE_TEST_MP14, 2, 255, 100, 100, 0, FILE_BG_MP14_SEG, FILE_BG_MP14_TILES, FILE_BG_MP14_PADS, FILE_USETUPMP14, FILE_UMP_SETUPMP14, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x37*/ STAGE_MP_GRID, 2, 255, 100, 100, 0, FILE_BG_MP15_SEG, FILE_BG_MP15_TILES, FILE_BG_MP15_PADS, FILE_USETUPMP15, FILE_UMP_SETUPMP15, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x38*/ STAGE_TEST_MP16, 2, 255, 100, 100, 0, FILE_BG_MP16_SEG, FILE_BG_MP16_TILES, FILE_BG_MP16_PADS, FILE_USETUPMP16, FILE_UMP_SETUPMP16, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x39*/ STAGE_TEST_MP17, 2, 255, 100, 100, 0, FILE_BG_MP17_SEG, FILE_BG_MP17_TILES, FILE_BG_MP17_PADS, FILE_USETUPMP17, FILE_UMP_SETUPMP17, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x3a*/ STAGE_TEST_MP18, 2, 255, 100, 100, 0, FILE_BG_MP18_SEG, FILE_BG_MP18_TILES, FILE_BG_MP18_PADS, FILE_USETUPMP18, FILE_UMP_SETUPMP18, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x3b*/ STAGE_TEST_MP19, 2, 255, 100, 100, 0, FILE_BG_MP19_SEG, FILE_BG_MP19_TILES, FILE_BG_MP19_PADS, FILE_USETUPMP19, FILE_UMP_SETUPMP19, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, - /*0x3c*/ STAGE_TEST_MP20, 2, 255, 100, 100, 0, FILE_BG_MP20_SEG, FILE_BG_MP20_TILES, FILE_BG_MP20_PADS, FILE_USETUPMP20, FILE_UMP_SETUPMP20, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + // id, ?, lia, liw, lih, ?, bg, tiles, pads, setup, mpsetp, ailists, ? 0x18, 0x1c, ?, ?, ?, 0x24, 0x28, ?, ?, ? ? + /*0x00*/ STAGE_MAIANSOS, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_SEV_PADS, FILE_USETUPSEV, FILE_UMP_SETUPSEV, &_setupsevasmSegmentRomStart, &_setupsevasmSegmentRomEnd, &g_StageAilists_sev, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x01*/ STAGE_TEST_SILO, 2, 255, 100, 100, 0, FILE_BG_OAT_SEG, FILE_BG_OAT_TILES, FILE_BG_OAT_PADS, FILE_USETUPSILO, FILE_UMP_SETUPSILO, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, + /*0x02*/ STAGE_WAR, 2, 255, 100, 100, 0, FILE_BG_SHO_SEG, FILE_BG_SHO_TILES, FILE_BG_STAT_PADS, FILE_USETUPSTAT, FILE_UMP_SETUPSTAT, &_setupstatasmSegmentRomStart, &_setupstatasmSegmentRomEnd, &g_StageAilists_stat, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x03*/ STAGE_MP_RAVINE, 2, 255, 100, 100, 0, FILE_BG_AREC_SEG, FILE_BG_AREC_TILES, FILE_BG_AREC_PADS, FILE_USETUPAREC, FILE_UMP_SETUPAREC, &_mp_setuparecasmSegmentRomStart, &_mp_setuparecasmSegmentRomEnd, &g_StageAilists_mp_arec, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, + /*0x04*/ STAGE_TEST_ARCH, 2, 255, 100, 100, 0, FILE_BG_ARCH_SEG, FILE_BG_ARCH_TILES, FILE_BG_ARCH_PADS, FILE_USETUPARCH, FILE_UMP_SETUPARCH, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x05*/ STAGE_ESCAPE, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_TRA_PADS, FILE_USETUPTRA, FILE_UMP_SETUPTRA, &_setuptraasmSegmentRomStart, &_setuptraasmSegmentRomEnd, &g_StageAilists_tra, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x06*/ STAGE_TEST_DEST, 2, 255, 100, 100, 0, FILE_BG_DEST_SEG, FILE_BG_DEST_TILES, FILE_BG_DEST_PADS, FILE_USETUPDEST, FILE_UMP_SETUPDEST, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x07*/ STAGE_RETAKING, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_SEVB_PADS, FILE_USETUPSEVB, FILE_UMP_SETUPSEVB, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x08*/ STAGE_CRASHSITE, 2, 255, 100, 100, 0, FILE_BG_AZT_SEG, FILE_BG_AZT_TILES, FILE_BG_AZT_PADS, FILE_USETUPAZT, FILE_UMP_SETUPAZT, &_setupaztasmSegmentRomStart, &_setupaztasmSegmentRomEnd, &g_StageAilists_azt, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x09*/ STAGE_CHICAGO, 2, 255, 100, 100, 0, FILE_BG_PETE_SEG, FILE_BG_PETE_TILES, FILE_BG_PETE_PADS, FILE_USETUPPETE, FILE_UMP_SETUPPETE, &_setuppeteasmSegmentRomStart, &_setuppeteasmSegmentRomEnd, &g_StageAilists_pete, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x0a*/ STAGE_G5BUILDING, 2, 255, 100, 100, 0, FILE_BG_DEPO_SEG, FILE_BG_DEPO_TILES, FILE_BG_DEPO_PADS, FILE_USETUPDEPO, FILE_UMP_SETUPDEPO, &_setupdepoasmSegmentRomStart, &_setupdepoasmSegmentRomEnd, &g_StageAilists_depo, 1, 1, 100, 0, 0, 20, 220, 0x3e19999a, -1, 400, 0, 1, + /*0x0b*/ STAGE_MP_COMPLEX, 2, 255, 100, 100, 0, FILE_BG_REF_SEG, FILE_BG_REF_TILES, FILE_BG_REF_PADS, FILE_USETUPREF, FILE_UMP_SETUPREF, &_mp_setuprefasmSegmentRomStart, &_mp_setuprefasmSegmentRomEnd, &g_StageAilists_mp_ref, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x0c*/ STAGE_MP_G5BUILDING, 2, 255, 100, 100, 0, FILE_BG_CRYP_SEG, FILE_BG_CRYP_TILES, FILE_BG_CRYP_PADS, FILE_USETUPCRYP, FILE_UMP_SETUPCRYP, &_mp_setupcrypasmSegmentRomStart, &_mp_setupcrypasmSegmentRomEnd, &g_StageAilists_mp_cryp, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, + /*0x0d*/ STAGE_PELAGIC, 2, 255, 100, 100, 0, FILE_BG_DAM_SEG, FILE_BG_DAM_TILES, FILE_BG_DAM_PADS, FILE_USETUPDAM, FILE_UMP_SETUPDAM, &_setupdamasmSegmentRomStart, &_setupdamasmSegmentRomEnd, &g_StageAilists_dam, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x0e*/ STAGE_EXTRACTION, 2, 255, 100, 100, 0, FILE_BG_AME_SEG, FILE_BG_AME_TILES, FILE_BG_ARK_PADS, FILE_USETUPARK, FILE_UMP_SETUPARK, &_setuparkasmSegmentRomStart, &_setuparkasmSegmentRomEnd, &g_StageAilists_ark, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x0f*/ STAGE_TEST_RUN, 2, 255, 100, 100, 0, FILE_BG_RUN_SEG, FILE_BG_RUN_TILES, FILE_BG_RUN_PADS, FILE_USETUPRUN, FILE_UMP_SETUPRUN, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x10*/ STAGE_24, 2, 255, 100, 100, 0, FILE_BG_SEVX_SEG, FILE_BG_SEVX_TILES, FILE_BG_SEVX_PADS, FILE_USETUPSEVX, FILE_UMP_SETUPSEVX, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x11*/ STAGE_MP_TEMPLE, 2, 255, 100, 100, 0, FILE_BG_JUN_SEG, FILE_BG_JUN_TILES, FILE_BG_JUN_PADS, FILE_USETUPJUN, FILE_UMP_SETUPJUN, &_mp_setupjunasmSegmentRomStart, &_mp_setupjunasmSegmentRomEnd, &g_StageAilists_mp_jun, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, + /*0x12*/ STAGE_CITRAINING, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_DISH_PADS, FILE_USETUPDISH, FILE_UMP_SETUPDISH, &_setupdishasmSegmentRomStart, &_setupdishasmSegmentRomEnd, &g_StageAilists_dish, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x13*/ STAGE_AIRBASE, 2, 255, 100, 100, 0, FILE_BG_CAVE_SEG, FILE_BG_CAVE_TILES, FILE_BG_CAVE_PADS, FILE_USETUPCAVE, FILE_UMP_SETUPCAVE, &_setupcaveasmSegmentRomStart, &_setupcaveasmSegmentRomEnd, &g_StageAilists_cave, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x14*/ STAGE_28, 2, 255, 100, 100, 0, FILE_BG_CAT_SEG, FILE_BG_CAT_TILES, FILE_BG_CAT_PADS, FILE_USETUPCAT, FILE_UMP_SETUPCAT, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 200, 800, 400, 1, + /*0x15*/ STAGE_MP_PIPES, 2, 255, 100, 100, 0, FILE_BG_CRAD_SEG, FILE_BG_CRAD_TILES, FILE_BG_CRAD_PADS, FILE_USETUPCRAD, FILE_UMP_SETUPCRAD, &_mp_setupcradasmSegmentRomStart, &_mp_setupcradasmSegmentRomEnd, &g_StageAilists_mp_crad, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, + /*0x16*/ STAGE_SKEDARRUINS, 2, 255, 100, 100, 0, FILE_BG_SHO_SEG, FILE_BG_SHO_TILES, FILE_BG_SHO_PADS, FILE_USETUPSHO, FILE_UMP_SETUPSHO, &_setupshoasmSegmentRomStart, &_setupshoasmSegmentRomEnd, &g_StageAilists_sho, 1, 1, 100, 0, 0, 20, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x17*/ STAGE_2B, 2, 255, 100, 100, 0, FILE_BG_SEVX_SEG, FILE_BG_SEVX_TILES, FILE_BG_SEVX_PADS, FILE_USETUPSEVX, FILE_UMP_SETUPSEVX, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x18*/ STAGE_VILLA, 2, 255, 100, 100, 0, FILE_BG_ELD_SEG, FILE_BG_ELD_TILES, FILE_BG_ELD_PADS, FILE_USETUPELD, FILE_UMP_SETUPELD, &_setupeldasmSegmentRomStart, &_setupeldasmSegmentRomEnd, &g_StageAilists_eld, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x19*/ STAGE_DEFENSE, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_IMP_PADS, FILE_USETUPIMP, FILE_UMP_SETUPIMP, &_setupimpasmSegmentRomStart, &_setupimpasmSegmentRomEnd, &g_StageAilists_imp, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x1a*/ STAGE_TEST_ASH, 2, 255, 100, 100, 0, FILE_BG_ASH_SEG, FILE_BG_ASH_TILES, FILE_BG_ASH_PADS, FILE_USETUPASH, FILE_UMP_SETUPASH, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 500, 0x3e19999a, -1, 400, 0, 1, + /*0x1b*/ STAGE_INFILTRATION, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_LUE_PADS, FILE_USETUPLUE, FILE_UMP_SETUPLUE, &_setuplueasmSegmentRomStart, &_setuplueasmSegmentRomEnd, &g_StageAilists_lue, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x1c*/ STAGE_DEFECTION, 2, 255, 100, 100, 0, FILE_BG_AME_SEG, FILE_BG_AME_TILES, FILE_BG_AME_PADS, FILE_USETUPAME, FILE_UMP_SETUPAME, &_setupameasmSegmentRomStart, &_setupameasmSegmentRomEnd, &g_StageAilists_ame, 1, 1, 100, 0, 0, 40, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x1d*/ STAGE_AIRFORCEONE, 2, 255, 100, 100, 0, FILE_BG_RIT_SEG, FILE_BG_RIT_TILES, FILE_BG_RIT_PADS, FILE_USETUPRIT, FILE_UMP_SETUPRIT, &_setupritasmSegmentRomStart, &_setupritasmSegmentRomEnd, &g_StageAilists_rit, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x1e*/ STAGE_MP_SKEDAR, 2, 255, 100, 100, 0, FILE_BG_OAT_SEG, FILE_BG_OAT_TILES, FILE_BG_OAT_PADS, FILE_USETUPOAT, FILE_UMP_SETUPOAT, &_mp_setupoatasmSegmentRomStart, &_mp_setupoatasmSegmentRomEnd, &g_StageAilists_mp_oat, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, 700, 800, 400, 1, + /*0x1f*/ STAGE_INVESTIGATION, 2, 255, 100, 100, 0, FILE_BG_EAR_SEG, FILE_BG_EAR_TILES, FILE_BG_EAR_PADS, FILE_USETUPEAR, FILE_UMP_SETUPEAR, &_setupearasmSegmentRomStart, &_setupearasmSegmentRomEnd, &g_StageAilists_ear, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x20*/ STAGE_ATTACKSHIP, 2, 255, 100, 100, 0, FILE_BG_LEE_SEG, FILE_BG_LEE_TILES, FILE_BG_LEE_PADS, FILE_USETUPLEE, FILE_UMP_SETUPLEE, &_setupleeasmSegmentRomStart, &_setupleeasmSegmentRomEnd, &g_StageAilists_lee, 1, 1, 100, 0, 0, 40, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x21*/ STAGE_RESCUE, 2, 255, 100, 100, 0, FILE_BG_LUE_SEG, FILE_BG_LUE_TILES, FILE_BG_LIP_PADS, FILE_USETUPLIP, FILE_UMP_SETUPLIP, &_setuplipasmSegmentRomStart, &_setuplipasmSegmentRomEnd, &g_StageAilists_lip, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x22*/ STAGE_TEST_LEN, 2, 255, 100, 100, 0, FILE_BG_LEN_SEG, FILE_BG_LEN_TILES, FILE_BG_LEN_PADS, FILE_USETUPLEN, FILE_UMP_SETUPLEN, NULL, NULL, NULL, 0.10040000081062, 1, 6.6844921112061, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x23*/ STAGE_MBR, 2, 255, 100, 100, 0, FILE_BG_AME_SEG, FILE_BG_AME_TILES, FILE_BG_AME_PADS, FILE_USETUPWAX, FILE_UMP_SETUPWAX, &_setupwaxasmSegmentRomStart, &_setupwaxasmSegmentRomEnd, &g_StageAilists_wax, 1, 1, 100, 0, 0, 40, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x24*/ STAGE_DEEPSEA, 8, 96, 80, 200, 0, FILE_BG_PAM_SEG, FILE_BG_PAM_TILES, FILE_BG_PAM_PADS, FILE_USETUPPAM, FILE_UMP_SETUPPAM, &_setuppamasmSegmentRomStart, &_setuppamasmSegmentRomEnd, &g_StageAilists_pam, 1, 1, 100, 0, 0, 30, 255, 0x3e4ccccd, 300, 600, 0, 1, + /*0x25*/ STAGE_TEST_UFF, 2, 255, 100, 100, 0, FILE_BG_UFF_SEG, FILE_BG_UFF_TILES, FILE_BG_UFF_PADS, FILE_USETUPUFF, FILE_UMP_SETUPUFF, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x26*/ STAGE_TEST_OLD, 2, 255, 100, 100, 0, FILE_BG_OLD_SEG, FILE_BG_OLD_TILES, FILE_BG_OLD_PADS, FILE_USETUPOLD, FILE_UMP_SETUPOLD, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x27*/ STAGE_DUEL, 2, 255, 100, 100, 0, FILE_BG_DISH_SEG, FILE_BG_DISH_TILES, FILE_BG_ATE_PADS, FILE_USETUPATE, FILE_UMP_SETUPATE, &_setupateasmSegmentRomStart, &_setupateasmSegmentRomEnd, &g_StageAilists_ate, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x28*/ STAGE_TEST_LAM, 2, 255, 100, 100, 0, FILE_BG_LAM_SEG, FILE_BG_LAM_TILES, FILE_BG_LAM_PADS, FILE_USETUPLAM, FILE_UMP_SETUPLAM, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x29*/ STAGE_MP_BASE, 2, 255, 100, 100, 0, FILE_BG_MP1_SEG, FILE_BG_MP1_TILES, FILE_BG_MP1_PADS, FILE_USETUPMP1, FILE_UMP_SETUPMP1, &_mp_setupmp1asmSegmentRomStart, &_mp_setupmp1asmSegmentRomEnd, &g_StageAilists_mp_mp1, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x2a*/ STAGE_TEST_MP2, 2, 255, 100, 100, 0, FILE_BG_MP2_SEG, FILE_BG_MP2_TILES, FILE_BG_MP2_PADS, FILE_USETUPMP2, FILE_UMP_SETUPMP2, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x2b*/ STAGE_MP_AREA52, 2, 255, 100, 100, 0, FILE_BG_MP3_SEG, FILE_BG_MP3_TILES, FILE_BG_MP3_PADS, FILE_USETUPMP3, FILE_UMP_SETUPMP3, &_mp_setupmp3asmSegmentRomStart, &_mp_setupmp3asmSegmentRomEnd, &g_StageAilists_mp_mp3, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x2c*/ STAGE_MP_WAREHOUSE, 2, 255, 100, 100, 0, FILE_BG_MP4_SEG, FILE_BG_MP4_TILES, FILE_BG_MP4_PADS, FILE_USETUPMP4, FILE_UMP_SETUPMP4, &_mp_setupmp4asmSegmentRomStart, &_mp_setupmp4asmSegmentRomEnd, &g_StageAilists_mp_mp4, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x2d*/ STAGE_MP_CARPARK, 2, 255, 100, 100, 0, FILE_BG_MP5_SEG, FILE_BG_MP5_TILES, FILE_BG_MP5_PADS, FILE_USETUPMP5, FILE_UMP_SETUPMP5, &_mp_setupmp5asmSegmentRomStart, &_mp_setupmp5asmSegmentRomEnd, &g_StageAilists_mp_mp5, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x2e*/ STAGE_TEST_MP6, 2, 255, 100, 100, 0, FILE_BG_MP6_SEG, FILE_BG_MP6_TILES, FILE_BG_MP6_PADS, FILE_USETUPMP6, FILE_UMP_SETUPMP6, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x2f*/ STAGE_TEST_MP7, 2, 255, 100, 100, 0, FILE_BG_MP7_SEG, FILE_BG_MP7_TILES, FILE_BG_MP7_PADS, FILE_USETUPMP7, FILE_UMP_SETUPMP7, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x30*/ STAGE_TEST_MP8, 2, 255, 100, 100, 0, FILE_BG_MP8_SEG, FILE_BG_MP8_TILES, FILE_BG_MP8_PADS, FILE_USETUPMP8, FILE_UMP_SETUPMP8, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x31*/ STAGE_MP_RUINS, 2, 255, 100, 100, 0, FILE_BG_MP9_SEG, FILE_BG_MP9_TILES, FILE_BG_MP9_PADS, FILE_USETUPMP9, FILE_UMP_SETUPMP9, &_mp_setupmp9asmSegmentRomStart, &_mp_setupmp9asmSegmentRomEnd, &g_StageAilists_mp_mp9, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x32*/ STAGE_MP_SEWERS, 2, 255, 100, 100, 0, FILE_BG_MP10_SEG, FILE_BG_MP10_TILES, FILE_BG_MP10_PADS, FILE_USETUPMP10, FILE_UMP_SETUPMP10, &_mp_setupmp10asmSegmentRomStart, &_mp_setupmp10asmSegmentRomEnd, &g_StageAilists_mp_mp10, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x33*/ STAGE_MP_FELICITY, 2, 255, 100, 100, 0, FILE_BG_MP11_SEG, FILE_BG_MP11_TILES, FILE_BG_MP11_PADS, FILE_USETUPMP11, FILE_UMP_SETUPMP11, &_mp_setupmp11asmSegmentRomStart, &_mp_setupmp11asmSegmentRomEnd, &g_StageAilists_mp_mp11, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x34*/ STAGE_MP_FORTRESS, 2, 255, 100, 100, 0, FILE_BG_MP12_SEG, FILE_BG_MP12_TILES, FILE_BG_MP12_PADS, FILE_USETUPMP12, FILE_UMP_SETUPMP12, &_mp_setupmp12asmSegmentRomStart, &_mp_setupmp12asmSegmentRomEnd, &g_StageAilists_mp_mp12, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x35*/ STAGE_MP_VILLA, 2, 255, 100, 100, 0, FILE_BG_MP13_SEG, FILE_BG_MP13_TILES, FILE_BG_MP13_PADS, FILE_USETUPMP13, FILE_UMP_SETUPMP13, &_mp_setupmp13asmSegmentRomStart, &_mp_setupmp13asmSegmentRomEnd, &g_StageAilists_mp_mp13, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x36*/ STAGE_TEST_MP14, 2, 255, 100, 100, 0, FILE_BG_MP14_SEG, FILE_BG_MP14_TILES, FILE_BG_MP14_PADS, FILE_USETUPMP14, FILE_UMP_SETUPMP14, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x37*/ STAGE_MP_GRID, 2, 255, 100, 100, 0, FILE_BG_MP15_SEG, FILE_BG_MP15_TILES, FILE_BG_MP15_PADS, FILE_USETUPMP15, FILE_UMP_SETUPMP15, &_mp_setupmp15asmSegmentRomStart, &_mp_setupmp15asmSegmentRomEnd, &g_StageAilists_mp_mp15, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x38*/ STAGE_TEST_MP16, 2, 255, 100, 100, 0, FILE_BG_MP16_SEG, FILE_BG_MP16_TILES, FILE_BG_MP16_PADS, FILE_USETUPMP16, FILE_UMP_SETUPMP16, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x39*/ STAGE_TEST_MP17, 2, 255, 100, 100, 0, FILE_BG_MP17_SEG, FILE_BG_MP17_TILES, FILE_BG_MP17_PADS, FILE_USETUPMP17, FILE_UMP_SETUPMP17, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x3a*/ STAGE_TEST_MP18, 2, 255, 100, 100, 0, FILE_BG_MP18_SEG, FILE_BG_MP18_TILES, FILE_BG_MP18_PADS, FILE_USETUPMP18, FILE_UMP_SETUPMP18, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x3b*/ STAGE_TEST_MP19, 2, 255, 100, 100, 0, FILE_BG_MP19_SEG, FILE_BG_MP19_TILES, FILE_BG_MP19_PADS, FILE_USETUPMP19, FILE_UMP_SETUPMP19, NULL, NULL, NULL, 1, 1, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, + /*0x3c*/ STAGE_TEST_MP20, 2, 255, 100, 100, 0, FILE_BG_MP20_SEG, FILE_BG_MP20_TILES, FILE_BG_MP20_PADS, FILE_USETUPMP20, FILE_UMP_SETUPMP20, NULL, NULL, NULL, 1, 0.5, 100, 0, 0, -1, 255, 0x3e19999a, -1, 400, 0, 1, }; struct stagetableentry *stageGetCurrent(void) diff --git a/src/include/commands.h b/src/include/commands.h index c71e63e85..2b858d0a8 100644 --- a/src/include/commands.h +++ b/src/include/commands.h @@ -15,7 +15,7 @@ * label command, so this will match beginloops too. */ #define goto_first(label) \ - mkshort(0x0100), \ + mkshort(0x0001), \ label, /** @@ -27,7 +27,7 @@ * command. */ #define label(id) \ - mkshort(0x9400), \ + mkshort(0x0002), \ id, /** @@ -45,7 +45,7 @@ * may need to yield before detonating it. */ #define yield \ - mkshort(0x9500), + mkshort(0x0003), /** * Marks the end of the ailist. @@ -55,7 +55,7 @@ * or assign a different ailist before the end is reached. */ #define endlist \ - mkshort(0x9600), + mkshort(0x0004), /** * Assigns a new ailist to the given chr. If the given chr is the current chr, @@ -63,7 +63,7 @@ * yield). */ #define set_ailist(chr, ailist) \ - mkshort(0x9700), \ + mkshort(0x0005), \ chr, \ mkshort(ailist), @@ -76,7 +76,7 @@ * to the original ailist. */ #define set_returnlist(chr, ailist) \ - mkshort(0x9800), \ + mkshort(0x0006), \ chr, \ mkshort(ailist), @@ -91,7 +91,7 @@ * continue their regular logic. */ #define set_shotlist(ailist) \ - mkshort(0x9900), \ + mkshort(0x0007), \ mkshort(ailist), /** @@ -99,19 +99,19 @@ * is started from the top. */ #define return \ - mkshort(0x9a00), + mkshort(0x0008), /** * Makes the chr stop doing whatever they were doing (eg. running). */ #define stop_chr \ - mkshort(0x9b00), + mkshort(0x0009), /** * Makes the chr begin kneeling. */ #define kneel \ - mkshort(0x9c00), + mkshort(0x000a), /** * Make a chr do an animation. See the ANIM constants in constants.h for known @@ -125,7 +125,7 @@ * chranimflags is expected to be a CHRANIMFLAG constant. */ #define chr_do_animation(animation, startframe, endframe, chranimflags, timemerge, chr, animspeed) \ - mkshort(0x9d00), \ + mkshort(0x000b), \ mkshort(animation), \ mkshort(startframe), \ mkshort(endframe), \ @@ -143,7 +143,7 @@ * - idle animations such as yawning */ #define if_chr_idle(label) \ - mkshort(0x0200), \ + mkshort(0x000c), \ label, /** @@ -151,7 +151,7 @@ * The command may fail if the chr is blocked. */ #define try_sidestep(label) \ - mkshort(0x0300), \ + mkshort(0x000f), \ label, /** @@ -159,7 +159,7 @@ * The command may fail if the chr is blocked. */ #define try_jumpout(label) \ - mkshort(0x0400), \ + mkshort(0x0010), \ label, /** @@ -167,7 +167,7 @@ * The command may fail if the chr is blocked. */ #define try_run_sideways(label) \ - mkshort(0x0500), \ + mkshort(0x0011), \ label, /** @@ -176,7 +176,7 @@ * their target. */ #define try_attack_walk(label) \ - mkshort(0x0600), \ + mkshort(0x0012), \ label, /** @@ -185,7 +185,7 @@ * their target. */ #define try_attack_roll(label) \ - mkshort(0x0700), \ + mkshort(0x0014), \ label, /** @@ -194,7 +194,7 @@ * attackflags is expected to be a bitfield of ATTACKFLAG constants. */ #define try_attack_stand(attackflags, entity_id, label) \ - mkshort(0x0800), \ + mkshort(0x0015), \ mkshort(attackflags), \ mkshort(entity_id), \ label, @@ -205,7 +205,7 @@ * attackflags is expected to be a bitfield of ATTACKFLAG constants. */ #define try_attack_kneel(attackflags, entity_id, label) \ - mkshort(0x0900), \ + mkshort(0x0016), \ mkshort(attackflags), \ mkshort(entity_id), \ label, @@ -220,7 +220,7 @@ * ATTACKFLAG_AIMONLY flag, causing the chr to shoot. */ #define try_modify_attack(attackflags, entity_id, label) \ - mkshort(0x0a00), \ + mkshort(0x0017), \ mkshort(attackflags), \ mkshort(entity_id), \ label, @@ -232,7 +232,7 @@ * attackflags is expected to be a bitfield of ATTACKFLAG constants. */ #define try_face_entity(attackflags, entity_id, label) \ - mkshort(0x0b00), \ + mkshort(0x0018), \ mkshort(attackflags), \ mkshort(entity_id), \ label, @@ -241,7 +241,7 @@ * Damages the chr using the given weapon's stats. */ #define damage_chr(chr, weapon) \ - mkshort(0x9e00), \ + mkshort(0x0019), \ chr, \ HITPART_HEAD, \ weapon, \ @@ -258,7 +258,7 @@ * It's expected to be a HITPART constant. */ #define chr_damage_chr(achr, vchr, hitpart) \ - mkshort(0x9f00), \ + mkshort(0x001a), \ achr, \ vchr, \ hitpart, @@ -270,7 +270,7 @@ * The values are not known. It's only called with values 512 and 0. */ #define consider_throwing_grenade(value_1, value_2, label) \ - mkshort(0x0c00), \ + mkshort(0x001b), \ mkshort(value_1), \ mkshort(value_2), \ label, @@ -279,7 +279,7 @@ * Makes the chr jog to the given pad. This may fail if pathfinding fails. */ #define jog_to_pad(pad) \ - mkshort(0xa000), \ + mkshort(0x001d), \ mkshort(pad), /** @@ -288,21 +288,21 @@ * Speed should be GOPOSFLAG_WALK, GOPOSFLAG_JOG or GOPOSFLAG_RUN. */ #define go_to_target_pad(speed) \ - mkshort(0xa100), \ + mkshort(0x001e), \ speed, /** * Makes the chr walk to the given pad. This may fail if pathfinding fails. */ #define walk_to_pad(pad) \ - mkshort(0xa200), \ + mkshort(0x001f), \ mkshort(pad), /** * Makes the chr run to the given pad. This may fail if pathfinding fails. */ #define run_to_pad(pad) \ - mkshort(0xa300), \ + mkshort(0x0020), \ mkshort(pad), /** @@ -310,40 +310,40 @@ * patrolling until start_patrol is used. */ #define assign_path(pathid) \ - mkshort(0xff07), \ + mkshort(0x0021), \ pathid, /** * Makes the chr start patrolling. */ #define start_patrol \ - mkshort(0xff08), + mkshort(0x0022), /** * Checks if the chr is patrolling. */ #define if_patrolling(label) \ - mkshort(0x0d00), \ + mkshort(0x0023), \ label, /** * Makes the chr surrender. */ #define surrender \ - mkshort(0xff09), + mkshort(0x0024), /** * Makes the chr drop their gun and fade out. For an immersive gameplay * experience, don't do this when the chr is on screen. */ #define drop_gun_and_fade_out \ - mkshort(0xa400), + mkshort(0x0025), /** * Remove the chr completely. */ #define remove_chr(chr) \ - mkshort(0xa500), \ + mkshort(0x0026), \ chr, /** @@ -355,20 +355,20 @@ * 55 seconds. */ #define activate_alarm \ - mkshort(0xa600), + mkshort(0x0028), /** * Deactivates the alarm. */ #define deactivate_alarm \ - mkshort(0xa700), + mkshort(0x0029), /** * Makes the chr attempt to jog to their target. The target can be a chr, object * or the player. */ #define try_jog_to_target(label) \ - mkshort(0x0e00), \ + mkshort(0x002b), \ label, /** @@ -376,7 +376,7 @@ * or the player. */ #define try_walk_to_target(label) \ - mkshort(0x0f00), \ + mkshort(0x002c), \ label, /** @@ -384,14 +384,14 @@ * or the player. */ #define try_run_to_target(label) \ - mkshort(0x1000), \ + mkshort(0x002d), \ label, /** * Makes the chr attempt to jog to the given chr. */ #define try_jog_to_chr(chr, label) \ - mkshort(0x1100), \ + mkshort(0x002f), \ chr, \ label, @@ -399,7 +399,7 @@ * Makes the chr attempt to run to the given chr. */ #define try_run_to_chr(chr, label) \ - mkshort(0x1200), \ + mkshort(0x0031), \ chr, \ label, @@ -407,7 +407,7 @@ * Checks if the chr is doing anything, such as running or animating. */ #define if_chr_stopped(label) \ - mkshort(0x1300), \ + mkshort(0x0032), \ label, /** @@ -415,7 +415,7 @@ * animation or is invalid. */ #define if_chr_dead(chr, label) \ - mkshort(0x1400), \ + mkshort(0x0033), \ chr, \ label, @@ -423,12 +423,12 @@ * Checks if the chr has finished dying. */ #define if_chr_death_animation_finished(chr, label) \ - mkshort(0x1500), \ + mkshort(0x0034), \ chr, \ label, #define if_chr_deadish(chr, label) \ - mkshort(0xfd00), \ + mkshort(0x000d), \ chr, \ label, @@ -437,7 +437,7 @@ * object or the player. */ #define if_target_in_sight(label) \ - mkshort(0x1600), \ + mkshort(0x0035), \ label, /** @@ -445,13 +445,13 @@ * value between 0 and 255 (inclusive). */ #define call_rng \ - mkshort(0xa800), + mkshort(0x0036), /** * Checks if the chr's rand property is less than the given value. */ #define if_rand_lt(value, label) \ - mkshort(0x1700), \ + mkshort(0x0037), \ value, \ label, @@ -459,7 +459,7 @@ * Checks if the chr's rand property is greater than the given value. */ #define if_rand_gt(value, label) \ - mkshort(0x1800), \ + mkshort(0x0038), \ value, \ label, @@ -470,21 +470,21 @@ * have contained extra per-chr checks such as chr flags and distance. */ #define if_can_hear_alarm(label) \ - mkshort(0x1900), \ + mkshort(0x0039), \ label, /** * Checks if the alarm is currently sounding. */ #define if_alarm_active(label) \ - mkshort(0x1a00), \ + mkshort(0x003a), \ label, /** * Checks if the chr has heard their target (eg. due to gunfire). */ #define if_hears_target(label) \ - mkshort(0x1b00), \ + mkshort(0x003c), \ label, /** @@ -501,7 +501,7 @@ * |-----------|-------|-------------------------| */ #define if_saw_injury(checktype, label) \ - mkshort(0x1c00), \ + mkshort(0x003d), \ checktype, \ label, @@ -519,7 +519,7 @@ * |-----------|-------|------------------------| */ #define if_saw_death(checktype, label) \ - mkshort(0x1d00), \ + mkshort(0x003e), \ checktype, \ label, @@ -527,7 +527,7 @@ * Checks if the current chr can see their target. */ #define if_can_see_target(label) \ - mkshort(0x1e00), \ + mkshort(0x003f), \ label, /** @@ -536,7 +536,7 @@ * around their target. */ #define if_nearly_in_targets_sight(distance, label) \ - mkshort(0x1f00), \ + mkshort(0x0041), \ mkword(distance), \ label, @@ -544,7 +544,7 @@ * Checks if the chr heard their target within the last 10 seconds. */ #define if_heard_target_recently(label) \ - mkshort(0x2000), \ + mkshort(0x0044), \ label, /** @@ -552,7 +552,7 @@ * the chr or hearing gunfire. */ #define if_detected_chr(chr, label) \ - mkshort(0x2100), \ + mkshort(0x0045), \ chr, \ label, @@ -561,7 +561,7 @@ * clones until the source chr has appeared on screen. */ #define if_never_been_onscreen(label) \ - mkshort(0x2200), \ + mkshort(0x0046), \ label, /** @@ -569,7 +569,7 @@ * either on this tick or on the prev tick. */ #define if_onscreen(label) \ - mkshort(0x2300), \ + mkshort(0x0047), \ label, /** @@ -579,19 +579,19 @@ * it as a pad number, and use the room that the pad is in. */ #define if_room_onscreen(room, label) \ - mkshort(0x2400), \ + mkshort(0x0049), \ mkshort(room), \ label, #define if_chr_in_view(label) \ - mkshort(0x2500), \ + mkshort(0x004a), \ label, /** * Checks if the chr had a shot nearly hit them. */ #define if_near_miss(label) \ - mkshort(0x2600), \ + mkshort(0x004b), \ label, /** @@ -603,7 +603,7 @@ * - And other unknown things */ #define if_sees_suspicious_item(label) \ - mkshort(0x2700), \ + mkshort(0x004c), \ label, /** @@ -613,7 +613,7 @@ * With angle 10, returns true if target is roughly within 12-11 o'clock. */ #define if_target_in_fov_left(angle, label) \ - mkshort(0x2800), \ + mkshort(0x004d), \ angle, \ label, @@ -641,7 +641,7 @@ * if_target_outside_my_yvisang */ #define if_fov_check_with_target(angle, op1, op2, label) \ - mkshort(0x2900), \ + mkshort(0x004e), \ angle, \ op1, \ op2, \ @@ -654,7 +654,7 @@ * if the target is roughly within 12-1 o'clock. */ #define if_target_out_of_fov_left(angle, label) \ - mkshort(0x2a00), \ + mkshort(0x004f), \ angle, \ label, @@ -663,7 +663,7 @@ * current chr's 12 o'clock (ie. either side). */ #define if_target_in_fov(angle, label) \ - mkshort(0x2b00), \ + mkshort(0x0050), \ angle, \ label, @@ -672,7 +672,7 @@ * given value. */ #define if_distance_to_target_lt(distance, label) \ - mkshort(0x2c00), \ + mkshort(0x0052), \ mkshort(distance / 10), \ label, @@ -681,7 +681,7 @@ * the given value. */ #define if_distance_to_target_gt(distance, label) \ - mkshort(0x2d00), \ + mkshort(0x0053), \ mkshort(distance / 10), \ label, @@ -690,7 +690,7 @@ * given value. */ #define if_chr_distance_to_pad_lt(chr, distance, pad, label) \ - mkshort(0x2e00), \ + mkshort(0x0054), \ chr, \ mkshort(distance / 10), \ mkshort(pad), \ @@ -701,7 +701,7 @@ * the given value. */ #define if_chr_distance_to_pad_gt(chr, distance, pad, label) \ - mkshort(0x2f00), \ + mkshort(0x0055), \ chr, \ mkshort(distance / 10), \ mkshort(pad), \ @@ -712,7 +712,7 @@ * given value. */ #define if_distance_to_chr_lt(distance, chr, label) \ - mkshort(0x3000), \ + mkshort(0x0056), \ mkshort(distance / 10), \ chr, \ label, @@ -722,7 +722,7 @@ * the given value. */ #define if_distance_to_chr_gt(distance, chr, label) \ - mkshort(0x3100), \ + mkshort(0x0057), \ mkshort(distance / 10), \ chr, \ label, @@ -732,7 +732,7 @@ * than the given value. The target can be another chr or an object. */ #define if_distance_from_target_to_pad_lt(distance, pad, label) \ - mkshort(0x3200), \ + mkshort(0x0059), \ mkshort(distance / 10), \ mkshort(pad), \ label, @@ -747,7 +747,7 @@ * Type 2 is hard coded to only work in G5 Building. */ #define if_chr_in_room(chr, type, room_or_pad, label) \ - mkshort(0x3300), \ + mkshort(0x005b), \ chr, \ type, \ mkshort(room_or_pad), \ @@ -757,7 +757,7 @@ * Checks if the given chr has the given object in their inventory. */ #define if_chr_has_object(chr, object, label) \ - mkshort(0x3400), \ + mkshort(0x005d), \ chr, \ object, \ label, @@ -766,7 +766,7 @@ * Checks if the given weapon has been thrown. */ #define if_weapon_thrown(weapon, label) \ - mkshort(0x3500), \ + mkshort(0x005e), \ weapon, \ label, @@ -775,7 +775,7 @@ * object. */ #define if_weapon_thrown_on_object(weapon, object, label) \ - mkshort(0x3600), \ + mkshort(0x005f), \ weapon, \ object, \ label, @@ -784,7 +784,7 @@ * Checks if the chr has the given weapon equipped. */ #define if_chr_weapon_equipped(chr, weapon, label) \ - mkshort(0x3700), \ + mkshort(0x0060), \ chr, \ weapon, \ label, @@ -796,7 +796,7 @@ * In practice this is always called with object = -1 and behavior = 1. */ #define if_gun_unclaimed(object, behavior, label) \ - mkshort(0x3800), \ + mkshort(0x0061), \ object, \ behavior, \ label, @@ -805,7 +805,7 @@ * Checks if the object is in good working order (ie. not destroyed). */ #define if_object_in_good_condition(object, label) \ - mkshort(0x3900), \ + mkshort(0x0062), \ object, \ label, @@ -816,7 +816,7 @@ * of this command will not pass unless the chr activates it again. */ #define if_chr_activated_object(chr, object, label) \ - mkshort(0x3a00), \ + mkshort(0x0063), \ chr, \ object, \ label, @@ -827,28 +827,28 @@ * In practice this is only used on mines. It might work on other objects. */ #define destroy_object(object) \ - mkshort(0xa900), \ + mkshort(0x0066), \ object, /** * Makes the given chr drop their concealed items. */ #define drop_concealed_items(chr) \ - mkshort(0xaa00), \ + mkshort(0x0068), \ chr, /** * Makes the given chr drop their weapon. */ #define chr_drop_weapon(chr) \ - mkshort(0xab00), \ + mkshort(0x0069), \ chr, /** * Makes the current chr give their object to the given chr. */ #define give_object_to_chr(object, chr) \ - mkshort(0xac00), \ + mkshort(0x006a), \ object, \ chr, @@ -856,7 +856,7 @@ * Moves the object to the given pad. The move is instant. */ #define move_object_to_pad(object, pad) \ - mkshort(0xad00), \ + mkshort(0x006b), \ object, \ mkshort(pad), @@ -864,14 +864,14 @@ * Opens the door. */ #define open_door(door) \ - mkshort(0xae00), \ + mkshort(0x006c), \ door, /** * Closes the door. */ #define close_door(door) \ - mkshort(0xaf00), \ + mkshort(0x006d), \ door, /** @@ -882,7 +882,7 @@ * together to check multiple states at the same time. */ #define if_door_state(door, doorstate, label) \ - mkshort(0x3b00), \ + mkshort(0x006e), \ door, \ doorstate, \ label, @@ -897,7 +897,7 @@ * player completes each requirement. */ #define lock_door(door, bits) \ - mkshort(0xff0a), \ + mkshort(0x0070), \ door, \ bits, @@ -906,7 +906,7 @@ * the same bitmask that was used to lock the door) then the door is unlocked. */ #define unlock_door(door, bits) \ - mkshort(0xb000), \ + mkshort(0x0071), \ door, \ bits, @@ -914,7 +914,7 @@ * Checks if the door is locked with the given bitmask. */ #define if_door_locked(door, bits, label) \ - mkshort(0x3c00), \ + mkshort(0x0072), \ door, \ bits, \ label, @@ -926,7 +926,7 @@ * and some objective indexes do not apply to easier difficulties. */ #define if_objective_complete(objective, label) \ - mkshort(0x3d00), \ + mkshort(0x0073), \ objective, \ label, @@ -937,7 +937,7 @@ * and some objective indexes do not apply to easier difficulties. */ #define if_objective_failed(objective, label) \ - mkshort(0x3e00), \ + mkshort(0x0074), \ objective, \ label, @@ -948,7 +948,7 @@ * If u1 were 0x10 or 0x20, some other logic would be used. */ #define try_set_target_pad_to_something(u1, label) \ - mkshort(0x3f00), \ + mkshort(0x0075), \ u1, \ label, @@ -966,7 +966,7 @@ * No further checks are done. */ #define try_set_padpreset_to_target_quadrant(quadrant, label) \ - mkshort(0x4000), \ + mkshort(0x0076), \ quadrant, \ label, @@ -976,7 +976,7 @@ * Diff is expected to be one of DIFF_A, DIFF_SA, DIFF_PA or DIFF_PD. */ #define if_difficulty_lt(diff, label) \ - mkshort(0x4100), \ + mkshort(0x0077), \ diff, \ label, @@ -986,17 +986,12 @@ * Diff is expected to be one of DIFF_A, DIFF_SA, DIFF_PA or DIFF_PD. */ #define if_difficulty_gt(diff, label) \ - mkshort(0x4200), \ + mkshort(0x0078), \ diff, \ label, -/** - * Checks if the stage ID is less than the given value. - * - * Consider using the helper macro if_stage_is_not instead. - */ #define if_stage_is_not(stage, label) \ - mkshort(0x4300), \ + mkshort(0x007b), \ stage, \ label, @@ -1004,7 +999,7 @@ * Checks if the chr has been shot less than the given number of times. */ #define if_num_times_shot_lt(value, label) \ - mkshort(0x4400), \ + mkshort(0x007d), \ value, \ label, @@ -1012,7 +1007,7 @@ * Checks if the chr has been shot more than the given number of times. */ #define if_num_times_shot_gt(value, label) \ - mkshort(0x4500), \ + mkshort(0x007e), \ value, \ label, @@ -1031,7 +1026,7 @@ * unless the chr is injured again. */ #define if_just_injured(chr, label) \ - mkshort(0x4600), \ + mkshort(0x0083), \ chr, \ label, @@ -1042,28 +1037,28 @@ * The value range is 0-255. */ #define set_morale(value) \ - mkshort(0xb100), \ + mkshort(0x0084), \ value, /** * Adds the given value to the current chr's morale property. */ #define add_morale(value) \ - mkshort(0xb200), \ + mkshort(0x0085), \ value, /** * Subtracts the given value from the current chr's morale property. */ #define subtract_morale(value) \ - mkshort(0xb300), \ + mkshort(0x0087), \ value, /** * Checks if the chr's morale property is less than the given value. */ #define if_morale_lt(value, label) \ - mkshort(0x4700), \ + mkshort(0x0088), \ value, \ label, @@ -1072,21 +1067,21 @@ * respond. */ #define set_alertness(value) \ - mkshort(0xb400), \ + mkshort(0x008a), \ value, /** * Adds the given value to the current chr's alertness. */ #define increase_self_alertness(value) \ - mkshort(0xb500), \ + mkshort(0x008b), \ value, /** * Adds the given value to the given chr's alertness. */ #define increase_chr_alertness(value, chr) \ - mkshort(0xb600), \ + mkshort(0x008c), \ value, \ chr, @@ -1096,7 +1091,7 @@ * Operator is expected to be OPERATOR_LESS_THAN or OPERATOR_GREATER_THAN. */ #define if_alertness(value, operator, label) \ - mkshort(0x4800), \ + mkshort(0x008e), \ value, \ operator, \ label, @@ -1105,7 +1100,7 @@ * Checks if the given chr's alertness is less than the given value. */ #define if_chr_alertness_lt(value, chr, label) \ - mkshort(0x4900), \ + mkshort(0x008f), \ value, \ chr, \ label, @@ -1116,14 +1111,14 @@ * This value might be multiplied or divided by 1000. */ #define set_hear_distance(value) \ - mkshort(0xb700), \ + mkshort(0x0092), \ mkshort(value), /** * Set the current chr's view distance. */ #define set_view_distance(value) \ - mkshort(0xb800), \ + mkshort(0x0093), \ value, /** @@ -1131,14 +1126,14 @@ * consider_throwing_grenade command. */ #define set_grenade_probability_out_of_255(value) \ - mkshort(0xff0b), \ + mkshort(0x0094), \ value, /** * Assigns a new ID to the chr. */ #define set_chr_id(newid) \ - mkshort(0xff0c), \ + mkshort(0x0095), \ newid, /** @@ -1149,7 +1144,7 @@ * be assigned to the object itself. */ #define set_chr_maxdamage(chr, value) \ - mkshort(0xff0d), \ + mkshort(0x0096), \ chr, \ mkshort(value), @@ -1165,21 +1160,21 @@ * may become negative, which has the effect of having body armor. */ #define add_health_or_armor(value) \ - mkshort(0xff0e), \ + mkshort(0x0097), \ mkshort(value), /** * Set the chr's reaction speed. Range is probably -128 to 127. */ #define set_reaction_speed(value) \ - mkshort(0xff0f), \ + mkshort(0x0098), \ value, /** * Set the chr's injury recovery speed. Range is probably -128 to 127. */ #define set_recovery_speed(value) \ - mkshort(0xff10), \ + mkshort(0x0099), \ value, /** @@ -1191,7 +1186,7 @@ * This setting has no effect if the chr has CHRHFLAG_PERFECTACCURACY. */ #define set_accuracy(value) \ - mkshort(0xff11), \ + mkshort(0x009a), \ value, /** @@ -1201,7 +1196,7 @@ * Use BANK_1 and a CHRFLAG1 constant for chr->flags2 (chr struct offset 0x118). */ #define set_self_flag_bankx(flag, bank) \ - mkshort(0xb900), \ + mkshort(0x009b), \ mkword(flag), \ bank, @@ -1211,7 +1206,7 @@ * See set_self_flag_bankx for more info. */ #define unset_self_flag_bankx(flag, bank) \ - mkshort(0xba00), \ + mkshort(0x009c), \ mkword(flag), \ bank, @@ -1224,7 +1219,7 @@ * See set_self_flag_bankx for more info. */ #define if_self_flag_bankx_eq(flag, bool, bank, label) \ - mkshort(0x4a00), \ + mkshort(0x009d), \ mkword(flag), \ bool, \ bank, \ @@ -1236,7 +1231,7 @@ * See set_self_flag_bankx for more info. */ #define set_chr_flag_bankx(chr, props, bank) \ - mkshort(0xbb00), \ + mkshort(0x009e), \ chr, \ mkword(props), \ bank, @@ -1247,7 +1242,7 @@ * See set_self_flag_bankx for more info. */ #define unset_chr_flag_bankx(chr, flag, bank) \ - mkshort(0xbc00), \ + mkshort(0x009f), \ chr, \ mkword(flag), \ bank, @@ -1258,7 +1253,7 @@ * See set_self_flag_bankx for more info. */ #define if_chr_has_flag_bankx(chr, flag, bank, label) \ - mkshort(0x4b00), \ + mkshort(0x00a0), \ chr, \ mkword(flag), \ bank, \ @@ -1273,7 +1268,7 @@ * stage flag is set. */ #define set_stage_flag(stageflag) \ - mkshort(0xbd00), \ + mkshort(0x00a1), \ mkword(stageflag), /** @@ -1283,7 +1278,7 @@ * incomplete. */ #define unset_stage_flag(stageflag) \ - mkshort(0xbe00), \ + mkshort(0x00a2), \ mkword(stageflag), /** @@ -1292,7 +1287,7 @@ * Set bool to TRUE if checking if set, or FALSE if checking if unset. */ #define if_stage_flag_eq(stageflag, bool, label) \ - mkshort(0x4c00), \ + mkshort(0x00a3), \ mkword(stageflag), \ bool, \ label, @@ -1303,7 +1298,7 @@ * Expects a CHRCFLAG constant. */ #define set_self_chrflag(chrflag3) \ - mkshort(0xbf00), \ + mkshort(0x00a4), \ mkword(chrflag3), /** @@ -1312,7 +1307,7 @@ * See set_self_chrflag for more info. */ #define unset_self_chrflag(chrflag3) \ - mkshort(0xc000), \ + mkshort(0x00a5), \ mkword(chrflag3), /** @@ -1321,7 +1316,7 @@ * See set_self_chrflag for more info. */ #define if_self_has_chrflag(chrflag3, label) \ - mkshort(0x4d00), \ + mkshort(0x00a6), \ mkword(chrflag3), \ label, @@ -1331,7 +1326,7 @@ * See set_self_chrflag for more info. */ #define set_chr_chrflag(chr, chrflag3) \ - mkshort(0xc100), \ + mkshort(0x00a7), \ chr, \ mkword(chrflag3), @@ -1341,7 +1336,7 @@ * See set_self_chrflag for more info. */ #define unset_chr_chrflag(chr, chrflag3) \ - mkshort(0xc200), \ + mkshort(0x00a8), \ chr, \ mkword(chrflag3), @@ -1351,7 +1346,7 @@ * See set_self_chrflag for more info. */ #define if_chr_has_chrflag(chr, chrflag3, label) \ - mkshort(0x4e00), \ + mkshort(0x00a9), \ chr, \ mkword(chrflag3), \ label, @@ -1362,7 +1357,7 @@ * Expects an OBJFLAG constant. */ #define set_object_flag(object, objectflag) \ - mkshort(0xc300), \ + mkshort(0x00aa), \ object, \ mkword(objectflag), @@ -1372,7 +1367,7 @@ * See set_object_flag for more info. */ #define unset_object_flag(object, objectflag) \ - mkshort(0xc400), \ + mkshort(0x00ab), \ object, \ mkword(objectflag), @@ -1382,7 +1377,7 @@ * Expects an OBJFLAG2 constant. */ #define set_object_flag2(object, objectflag2) \ - mkshort(0xc500), \ + mkshort(0x00ad), \ object, \ mkword(objectflag2), @@ -1392,7 +1387,7 @@ * See set_object_flag2 for more info. */ #define unset_object_flag2(object, objectflag2) \ - mkshort(0xc600), \ + mkshort(0x00ae), \ object, \ mkword(objectflag2), @@ -1402,7 +1397,7 @@ * See set_object_flag2 for more info. */ #define if_object_flag2(object, objectflag2, label) \ - mkshort(0x4f00), \ + mkshort(0x00af), \ object, \ mkword(objectflag2), \ label, @@ -1413,7 +1408,7 @@ * chrpreset is a general purpose property. It can be referenced via CHR_PRESET. */ #define set_chrpreset(chr) \ - mkshort(0xc700), \ + mkshort(0x00b0), \ chr, /** @@ -1423,7 +1418,7 @@ * CHR_TARGET. */ #define set_chr_target_chr(chr, target) \ - mkshort(0xc800), \ + mkshort(0x00b1), \ chr, \ target, @@ -1433,39 +1428,39 @@ * padpreset can be referenced via PAD_PRESET. */ #define set_padpreset(pad) \ - mkshort(0xc900), \ + mkshort(0x00b2), \ mkshort(pad), /** * Resets the current chr's timer to zero and starts it. */ #define restart_timer \ - mkshort(0xca00), + mkshort(0x00b6), /** * Resets the current chr's timer to zero. The running state is unchanged. */ #define reset_timer \ - mkshort(0xcb00), + mkshort(0x00b7), /** * Pauses the current chr's timer. The timer value is unchanged. */ #define pause_timer \ - mkshort(0xcc00), + mkshort(0x00b8), /** * Resumes the current chr's timer. The timer continues from where it left off * previously. */ #define resume_timer \ - mkshort(0xcd00), + mkshort(0x00b9), /** * Checks if the current chr's timer value is greater than the given value. */ #define if_timer_gt(value, label) \ - mkshort(0x5100), \ + mkshort(0x00bd), \ 0x00, \ mkshort(value), \ label, @@ -1474,7 +1469,7 @@ * Checks if the current chr's timer value is less than the given value. */ #define if_timer_lt(value, label) \ - mkshort(0x5000), \ + mkshort(0x00bc), \ 0x00, \ mkshort(value), \ label, @@ -1483,38 +1478,38 @@ * Shows the countdown timer. */ #define show_countdown_timer \ - mkshort(0xff12), + mkshort(0x00be), /** * Hides the countdown timer. */ #define hide_countdown_timer \ - mkshort(0xff13), + mkshort(0x00bf), /** * Sets the countdown timer value. */ #define set_countdown_timer(seconds) \ - mkshort(0xff14), \ + mkshort(0x00c0), \ mkshort(seconds), /** * Stops the countdown timer. */ #define stop_countdown_timer \ - mkshort(0xff15), + mkshort(0x00c1), /** * Starts the countdown timer. */ #define start_countdown_timer \ - mkshort(0xff16), + mkshort(0x00c2), /** * Checks if the countdown timer value is less than the given value. */ #define if_countdown_timer_lt(value, label) \ - mkshort(0x5200), \ + mkshort(0x00c4), \ mkshort(value), \ label, @@ -1522,7 +1517,7 @@ * Checks if the countdown timer value is greater than the given value. */ #define if_countdown_timer_gt(value, label) \ - mkshort(0x5300), \ + mkshort(0x00c5), \ mkshort(value), \ label, @@ -1530,7 +1525,7 @@ * Attempts to spawn a chr at the given pad. */ #define try_spawn_chr_at_pad(body, head, pad, ailist, spawnflags, label) \ - mkshort(0x5400), \ + mkshort(0x00c6), \ body, \ head, \ mkshort(pad), \ @@ -1542,7 +1537,7 @@ * Attempts to spawn a chr at the given chr. */ #define try_spawn_chr_at_chr(body, head, chrnum, ailist, spawnflags, label) \ - mkshort(0x5500), \ + mkshort(0x00c7), \ body, \ head, \ chrnum, \ @@ -1556,14 +1551,14 @@ * Will cause crashes if the weapon's model file lacks positional information. */ #define try_equip_weapon(model, weapon, flags, label) \ - mkshort(0x5600), \ + mkshort(0x00c8), \ mkshort(model), \ weapon, \ mkword(flags), \ label, #define try_spawn_clone2(chr, ailist, spawnflags, label) \ - mkshort(0x5700), \ + mkshort(0x00ca), \ chr, \ mkshort(ailist), \ mkword(spawnflags), \ @@ -1575,7 +1570,7 @@ * The chr argument should be a player. */ #define show_hudmsg(chr, text) \ - mkshort(0xce00), \ + mkshort(0x00cb), \ chr, \ mkshort(text), @@ -1586,7 +1581,7 @@ * The color argument should be a COLOR constant. */ #define show_hudmsg_top_middle(chr, text, color) \ - mkshort(0xcf00), \ + mkshort(0x00cc), \ chr, \ mkshort(text), \ color, @@ -1599,7 +1594,7 @@ * The color argument should be a COLOR constant. */ #define speak(chr, text, sound, channel, color) \ - mkshort(0xd000), \ + mkshort(0x00cd), \ chr, \ mkshort(text), \ mkshort(sound), \ @@ -1612,7 +1607,7 @@ * The channel argument should be a CHANNEL constant. */ #define play_sound(id, channel) \ - mkshort(0xd100), \ + mkshort(0x00ce), \ mkshort(id), \ channel, @@ -1623,7 +1618,7 @@ * The bool argument should be TRUE to play or FALSE to stop. */ #define control_sound_from_object(channel, object, bool) \ - mkshort(0xd200), \ + mkshort(0x00cf), \ channel, \ object, \ 0x00, \ @@ -1633,7 +1628,7 @@ * Plays a sound coming from the given pad. */ #define play_sound_from_pad(pad, sound) \ - mkshort(0xff17), \ + mkshort(0x00d0), \ 0x00, \ mkshort(pad), \ mkshort(sound), @@ -1644,14 +1639,14 @@ * The channel argument should be a CHANNEL constant. */ #define mute_channel(channel) \ - mkshort(0xd300), \ + mkshort(0x00d3), \ channel, /** * Assigns a path to a hovercar and makes it start it. */ #define begin_hovercar_path(path) \ - mkshort(0xff18), \ + mkshort(0x00d5), \ path, /** @@ -1663,7 +1658,7 @@ * new speed, assuming 60 frames per second. */ #define set_vehicle_speed(speed, num_accel_frames) \ - mkshort(0xff19), \ + mkshort(0x00d6), \ mkshort(speed), \ mkshort(num_accel_frames), @@ -1674,7 +1669,7 @@ * The units for this aren't known. */ #define set_rotor_speed(speed, time) \ - mkshort(0xff1a), \ + mkshort(0x00d7), \ mkshort(speed), \ mkshort(time), @@ -1685,7 +1680,7 @@ * For multi screen objects, slot can be 0-3. */ #define set_object_image(object, slot, image) \ - mkshort(0xd400), \ + mkshort(0x00da), \ object, \ slot, \ image, @@ -1696,13 +1691,13 @@ * If all objectives are complete then the endscreen will be completed. */ #define end_level \ - mkshort(0xff1b), + mkshort(0x00dc), #define enter_firstperson \ - mkshort(0xff1c), + mkshort(0x00dd), #define enter_camera_and_move_to_pad(pad) \ - mkshort(0xff1d), \ + mkshort(0x00de), \ mkshort(pad), /** @@ -1711,7 +1706,7 @@ * Used for the auto walk sequences in Extraction and Duel. */ #define revoke_control(chr, value) \ - mkshort(0xff1e), \ + mkshort(0x00e0), \ chr, \ value, @@ -1719,7 +1714,7 @@ * Grant control back to the given chr. */ #define grant_control(chr) \ - mkshort(0xff1f), \ + mkshort(0x00e1), \ chr, /** @@ -1739,7 +1734,7 @@ * warp a co-op AI buddy to the player when using the stealth command. */ #define chr_move_to_pad(chr, pad, allowonscreen, label) \ - mkshort(0x5800), \ + mkshort(0x00e2), \ chr, \ mkshort(pad), \ allowonscreen, \ @@ -1750,14 +1745,14 @@ * applied instantly. */ #define set_door_open(door) \ - mkshort(0xd500), \ + mkshort(0x00e8), \ door, /** * Checks if the number of players is less than the given value. */ #define if_num_human_players_lt(value, label) \ - mkshort(0x5900), \ + mkshort(0x00ea), \ value, \ label, @@ -1767,7 +1762,7 @@ * Ammotype is expected to be an AMMOTYPE constant. */ #define if_ammo_quantity_lt(chr, ammotype, value, label) \ - mkshort(0x5a00), \ + mkshort(0x00eb), \ chr, \ ammotype, \ value, \ @@ -1777,7 +1772,7 @@ * Makes the player equip the given weapon. */ #define chr_draw_weapon(chr, weapon) \ - mkshort(0xd600), \ + mkshort(0x00ec), \ chr, \ weapon, @@ -1785,7 +1780,7 @@ * Makes the player equip the given weapon (for cutscene use). */ #define chr_draw_weapon_in_cutscene(chr, weapon) \ - mkshort(0xff20), \ + mkshort(0x00ed), \ chr, \ weapon, @@ -1793,7 +1788,7 @@ * Checks if the given object is in the given room. */ #define if_object_in_room(object, room, label) \ - mkshort(0x5b00), \ + mkshort(0x00ef), \ object, \ mkshort(room), \ label, @@ -1802,14 +1797,14 @@ * Makes the given player invincible. */ #define set_invincible(chr) \ - mkshort(0xff21), \ + mkshort(0x00f3), \ chr, /** * Checks if all objectives are complete. */ #define if_all_objectives_complete(label) \ - mkshort(0x5c00), \ + mkshort(0x00f7), \ label, /** @@ -1827,7 +1822,7 @@ * Once maxsecs is reached the track is stopped regardless. */ #define play_x_track(xreason, minsecs, maxsecs) \ - mkshort(0xff22), \ + mkshort(0x00f9), \ xreason, \ minsecs, \ maxsecs, @@ -1842,14 +1837,14 @@ * reason. */ #define stop_x_track(xreason) \ - mkshort(0xff23), \ + mkshort(0x00fa), \ xreason, /** * Surround the given player in infinite explosions. */ #define explosions_around_chr(chr) \ - mkshort(0xff24), \ + mkshort(0x00fb), \ chr, /** @@ -1860,12 +1855,12 @@ * Skedar in Attack Ship. */ #define if_kill_count_gt(value, label) \ - mkshort(0x5d00), \ + mkshort(0x00fc), \ value, \ label, #define set_lights_state(pad, operation, u1, u2, u3) \ - mkshort(0xff25), \ + mkshort(0x0102), \ mkshort(pad), \ operation, \ u1, \ @@ -1882,7 +1877,7 @@ * not currently supported by the decomp project. */ #define set_target_chr(chr) \ - mkshort(0xd700), \ + mkshort(0x0106), \ chr, \ 0x00, \ 0x00, @@ -1895,7 +1890,7 @@ * prevent both chrs from attacking the same enemy. */ #define if_chrpresets_target_is_different(label) \ - mkshort(0x5e00), \ + mkshort(0x0107), \ label, /** @@ -1903,7 +1898,7 @@ * If anytarget is true, check if chr1 has any target at all. */ #define if_chr_target_eq(chr1, chr2, anytarget, label) \ - mkshort(0x5f00), \ + mkshort(0x0108), \ chr1, \ chr2, \ anytarget, \ @@ -1919,7 +1914,7 @@ * Chrs will not engage in combat with anyone who is on this team. */ #define set_chr_team(chr, team) \ - mkshort(0xff26), \ + mkshort(0x010b), \ chr, \ team, @@ -1927,14 +1922,14 @@ * Set the shield amount for the current chr. */ #define set_shield(amount) \ - mkshort(0xff27), \ + mkshort(0x010e), \ mkshort(amount), /** * Checks if the chr's shield amount is less than the given value. */ #define if_chr_shield_lt(chr, value, label) \ - mkshort(0x6000), \ + mkshort(0x010f), \ chr, \ mkshort(value), \ label, @@ -1943,7 +1938,7 @@ * Begins a camera animation (ie. for cutscenes). */ #define camera_movement(animation) \ - mkshort(0xff28), \ + mkshort(0x0111), \ mkshort(animation), /** @@ -1958,7 +1953,7 @@ * (ie. same as 0), or -2 for the last frame. */ #define object_do_animation(animation, object, u2, startframe) \ - mkshort(0xd800), \ + mkshort(0x0112), \ mkshort(animation), \ object, \ u2, \ @@ -1968,7 +1963,7 @@ * Checks if a cutscene is still running. */ #define if_camera_animating(label) \ - mkshort(0x6100), \ + mkshort(0x0113), \ label, /** @@ -1976,7 +1971,7 @@ * considered in collision checks. */ #define enable_chr(chr) \ - mkshort(0xd900), \ + mkshort(0x0114), \ chr, /** @@ -1985,7 +1980,7 @@ * explosives, at which point they become enabled (and die) automatically. */ #define disable_chr(chr) \ - mkshort(0xda00), \ + mkshort(0x0115), \ chr, /** @@ -1993,7 +1988,7 @@ * be considered in collision checks. */ #define enable_object(object) \ - mkshort(0xdb00), \ + mkshort(0x0116), \ object, /** @@ -2001,7 +1996,7 @@ * not considered in collision checks. */ #define disable_object(object) \ - mkshort(0xdc00), \ + mkshort(0x0117), \ object, /** @@ -2010,7 +2005,7 @@ * Expects an OBJFLAG3 constant. */ #define set_object_flag3(object, objectflag3) \ - mkshort(0xdd00), \ + mkshort(0x0118), \ object, \ mkword(objectflag3), @@ -2020,7 +2015,7 @@ * See set_object_flag3 for more info. */ #define unset_object_flag3(object, objectflag3) \ - mkshort(0xde00), \ + mkshort(0x0119), \ object, \ mkword(objectflag3), @@ -2030,7 +2025,7 @@ * See set_object_flag3 for more info. */ #define if_object_flag3(object, objectflag3, label) \ - mkshort(0x6200), \ + mkshort(0x011a), \ object, \ mkword(objectflag3), \ label, @@ -2041,7 +2036,7 @@ * Expects a CHRHFLAG constant. */ #define set_chr_hiddenflag(chr, chrflag2) \ - mkshort(0xdf00), \ + mkshort(0x011b), \ chr, \ mkword(chrflag2), @@ -2051,7 +2046,7 @@ * See set_chr_hiddenflag for more info. */ #define unset_chr_hiddenflag(chr, chrflag2) \ - mkshort(0xe000), \ + mkshort(0x011c), \ chr, \ mkword(chrflag2), @@ -2061,7 +2056,7 @@ * See set_chr_hiddenflag for more info. */ #define if_chr_has_hiddenflag(chr, chrflag2, label) \ - mkshort(0x6300), \ + mkshort(0x011d), \ chr, \ mkword(chrflag2), \ label, @@ -2070,7 +2065,7 @@ * Checks if the given chr is Skedar. */ #define if_chr_is_skedar(chr, label) \ - mkshort(0x6400), \ + mkshort(0x011f), \ chr, \ label, @@ -2091,7 +2086,7 @@ * weapon check. */ #define if_calculated_safety2_lt(value, label) \ - mkshort(0x6500), \ + mkshort(0x0120), \ value, \ label, @@ -2104,12 +2099,12 @@ * To actually go to the cover, go_to_cover must be used afterwards. */ #define find_cover(criteria, label) \ - mkshort(0x6600), \ + mkshort(0x0121), \ mkshort(criteria), \ label, #define go_to_cover(speed) \ - mkshort(0xe100), \ + mkshort(0x0124), \ speed, /** @@ -2118,14 +2113,14 @@ * can't see the cover. */ #define check_cover_out_of_sight(label) \ - mkshort(0x6700), \ + mkshort(0x0125), \ label, /** * Checks if the player is using the CMP150 or AR34. */ #define if_player_using_cmp150_or_ar34(label) \ - mkshort(0x6800), \ + mkshort(0x0126), \ label, /** @@ -2134,7 +2129,7 @@ * A line of sight check is not used. */ #define set_target_to_enemy_on_same_floor(label) \ - mkshort(0x6900), \ + mkshort(0x0127), \ label, /** @@ -2142,7 +2137,7 @@ * chr's target chr field to that enemy. */ #define if_enemy_distance_lt_and_los(distance, label) \ - mkshort(0x6a00), \ + mkshort(0x0128), \ distance / 10, \ label, @@ -2158,7 +2153,7 @@ * If chr is non-zero, compare the given chr and their target. */ #define if_target_moving_slowly(chr, label) \ - mkshort(0x6b00), \ + mkshort(0x012a), \ chr, \ label, @@ -2167,7 +2162,7 @@ * least 50 units in the last second. */ #define if_target_moving_closer(label) \ - mkshort(0x6c00), \ + mkshort(0x012b), \ label, /** @@ -2175,14 +2170,14 @@ * least 50 units in the last second. */ #define if_target_moving_away(label) \ - mkshort(0x6d00), \ + mkshort(0x012c), \ label, // If chr->cover > 0, call some function. // Involves some global array at 0x800a2360 // globals.c only #define cmd012f \ - mkshort(0xe200), + mkshort(0x012f), /** * Allows the current chr to say a semi-random statement from some predefined @@ -2243,7 +2238,7 @@ * the chr's current speech (if any) will be stopped. */ #define say_quip(player, quip, probability, soundgap, onlyifothers, special, textrow, colour) \ - mkshort(0xe300), \ + mkshort(0x0130), \ player, \ quip, \ probability, \ @@ -2265,7 +2260,7 @@ * The current chr's alertness will not be adjusted by this command. */ #define increase_squadron_alertness(value) \ - mkshort(0xe400), \ + mkshort(0x0131), \ value, /** @@ -2274,7 +2269,7 @@ * Action is expected to be a MA constant. */ #define set_action(action, bool) \ - mkshort(0xe500), \ + mkshort(0x0132), \ action, \ bool, @@ -2307,7 +2302,7 @@ * For all other actions it will follow if there is any eligible chr nearby. */ #define set_team_orders(orders, label) \ - mkshort(0x6e00), \ + mkshort(0x0133), \ orders, \ label, @@ -2315,7 +2310,7 @@ * Checks if the current chr's orders equal the given value. */ #define if_orders_eq(action, label) \ - mkshort(0x6f00), \ + mkshort(0x0134), \ 0xfd, \ action, \ label, @@ -2324,7 +2319,7 @@ * Checks if the current chr has orders at all. */ #define if_has_orders(label) \ - mkshort(0x7000), \ + mkshort(0x0135), \ label, /** @@ -2338,12 +2333,12 @@ * within 2314 units then runs to it. */ #define retreat(speed, operation) \ - mkshort(0xe600), \ + mkshort(0x0136), \ speed, \ operation, #define if_chr_in_squadron_doing_action(action, label) \ - mkshort(0x7100), \ + mkshort(0x0137), \ action, \ label, @@ -2354,7 +2349,7 @@ * otherwise the speech can be skipped by pausing as it starts. */ #define if_sound_finished(channel, label) \ - mkshort(0x7200), \ + mkshort(0x0138), \ channel, \ label, @@ -2366,7 +2361,7 @@ // relative to the player's direction. 335 is the same as 25 degress to the // right (360 - 25). #define cmd0139(angle, u1, bool) \ - mkshort(0xe700), \ + mkshort(0x0139), \ mkword(angle), \ u1, \ bool, @@ -2378,7 +2373,7 @@ * If distance is specified, limit search to chrs within that distance. */ #define try_set_chrpreset_to_unalerted_teammate(distance, label) \ - mkshort(0x7300), \ + mkshort(0x013a), \ distance, \ 0x00, \ label, @@ -2387,7 +2382,7 @@ * Set the current chr's squadron. */ #define set_squadron(id) \ - mkshort(0xff29), \ + mkshort(0x013b), \ id, /** @@ -2405,7 +2400,7 @@ * Those are the only supported flags. */ #define if_dangerous_object_nearby(flags, label) \ - mkshort(0x7400), \ + mkshort(0x013d), \ flags, \ label, @@ -2413,7 +2408,7 @@ * Makes the chr run away from a live grenade. */ #define run_from_grenade \ - mkshort(0xe800), + mkshort(0x013e), /** * Checks if a hoverbot's next step is less than or greater than the given @@ -2422,7 +2417,7 @@ * Operator is expected to be OPERATOR_LESS_THAN or OPERATOR_GREATER_THAN. */ #define if_hoverbot_next_step(operator, step, label) \ - mkshort(0x7500), \ + mkshort(0x0140), \ operator, \ step, \ label, @@ -2434,7 +2429,7 @@ * terminals. */ #define shuffle_investigation_terminals(goodtag, badtag, pc1, pc2, pc3, pc4) \ - mkshort(0xff2a), \ + mkshort(0x0141), \ goodtag, \ badtag, \ pc1, \ @@ -2453,7 +2448,7 @@ * location, it's recommended to keep usage of this function to one stage only. */ #define set_pad_preset_to_investigation_terminal(object) \ - mkshort(0xff2b), \ + mkshort(0x0142), \ object, \ 0x00, @@ -2463,7 +2458,7 @@ * The state of the weapons can be checked with if_chopper_weapons_armed. */ #define chopper_arm_weapons \ - mkshort(0xff2c), + mkshort(0x0143), /** * Rebuilds the list of teams containing chr IDs in each team. @@ -2471,9 +2466,15 @@ * Should be used after reassigning chrs to teams. */ #define rebuild_teams \ - mkshort(0xe900), + mkshort(0x0145), -#define rebuild_squadrons +/** + * Rebuilds the list of squadrons containing chr IDs in each squadron. + * + * Should be used after reassigning chrs to squadrons. + */ +#define rebuild_squadrons \ + mkshort(0x0146), /** * Checks if all chrs in the given squadron are dead. @@ -2482,7 +2483,7 @@ * squadron is dead. */ #define if_all_chrs_in_squadron_are_dead(squadron, label) \ - mkshort(0x7600), \ + mkshort(0x0147), \ squadron, \ label, @@ -2491,7 +2492,7 @@ * value. */ #define if_num_chrs_in_squadron_gt(value, squadron, label) \ - mkshort(0x7700), \ + mkshort(0x0152), \ value, \ squadron, \ label, @@ -2500,7 +2501,7 @@ * Toggles tinted glass opaqueness/transparency. */ #define set_tinted_glass_enabled(bool) \ - mkshort(0xff2d), \ + mkshort(0x0157), \ bool, /** @@ -2512,7 +2513,7 @@ * It's used to start the CI training music and the Skedar King battle music. */ #define play_track_isolated(id) \ - mkshort(0xff2e), \ + mkshort(0x015b), \ id, /** @@ -2521,7 +2522,7 @@ * It's used to restart the default CI music after a training session. */ #define play_default_tracks \ - mkshort(0xff2f), + mkshort(0x015c), /** * Checks if the chr injured their target. Use this after attacking. @@ -2529,7 +2530,7 @@ * The command will unset the flag so it may be used again. */ #define if_chr_injured_target(chr, label) \ - mkshort(0x7800), \ + mkshort(0x0165), \ chr, \ label, @@ -2539,7 +2540,7 @@ * Side may be 0 or 1. */ #define hovercopter_fire_rocket(side) \ - mkshort(0xea00), \ + mkshort(0x0167), \ side, /** @@ -2547,12 +2548,12 @@ * checked. */ #define if_chr_shield_damaged(chr, label) \ - mkshort(0x7900), \ + mkshort(0x0168), \ chr, \ label, #define if_chr_idle_action_eq(action, label) \ - mkshort(0x7a00), \ + mkshort(0x0169), \ action, \ label, @@ -2563,7 +2564,7 @@ * Operator is expected to be OPERATOR_LESS_THAN or OPERATOR_GREATER_THAN. */ #define if_chr_y(chr, value, operator, label) \ - mkshort(0x7b00), \ + mkshort(0x016a), \ chr, \ mkshort(value), \ operator, \ @@ -2575,7 +2576,7 @@ * Typically used to make terminals hum. */ #define play_sound_from_object(channel, object, u1, u2, u3) \ - mkshort(0xff30), \ + mkshort(0x016b), \ channel, \ object, \ mkshort(u1), \ @@ -2586,7 +2587,7 @@ * Add motion blur to the player. Motion blur will wear off automatically. */ #define add_motion_blur(chr, value, bool) \ - mkshort(0xff31), \ + mkshort(0x016d), \ chr, \ value, \ bool, @@ -2601,7 +2602,7 @@ * If operation is 2, the chr is damaged and poisoned. */ #define damage_chr_by_amount(chr, amount, operation) \ - mkshort(0xeb00), \ + mkshort(0x016e), \ chr, \ amount, \ operation, @@ -2614,7 +2615,7 @@ * has been collected by the player, or if the chr has drawn a backup gun. */ #define if_has_gun(chr, label) \ - mkshort(0x7c00), \ + mkshort(0x016f), \ chr, \ 0x00, \ label, @@ -2630,7 +2631,7 @@ * instead. */ #define do_gun_command(operation, label) \ - mkshort(0x7d00), \ + mkshort(0x0170), \ operation, \ label, @@ -2639,7 +2640,7 @@ * value. */ #define if_distance_to_gun_lt(distance, label) \ - mkshort(0x7e00), \ + mkshort(0x0171), \ mkshort(distance / 10), \ label, @@ -2650,7 +2651,7 @@ * The chr argument is ignored. The command applies to the current chr. */ #define chr_recover_gun(chr, label) \ - mkshort(0x7f00), \ + mkshort(0x0172), \ chr, \ label, @@ -2660,7 +2661,7 @@ * Typically used after spawning a guard. */ #define try_inherit_properties(chr_src, label) \ - mkshort(0x8000), \ + mkshort(0x0173), \ chr_src, \ label, @@ -2671,28 +2672,28 @@ * the cutscene becomes unskippable. */ #define if_controller_button_pressed(label) \ - mkshort(0xff00), \ + mkshort(0x0174), \ label, // Used in cutscenes before giving control to Jo // Value is always 60 // Without this command, or with a 0 value, Jo faces a different direction #define cmd0175(u1) \ - mkshort(0xec00), \ + mkshort(0x0175), \ u1, /** * */ #define cmd0176_if_something(label) \ - mkshort(0x8100), \ + mkshort(0x0176), \ label, /** * Forces the player to walk to the given pad (eg. Extraction and Duel). */ #define force_walk(chr, aimpad, walkspeed, turnspeed, lookup, dist) \ - mkshort(0xff32), \ + mkshort(0x0177), \ chr, \ mkshort(aimpad), \ walkspeed, \ @@ -2704,12 +2705,12 @@ * Checks if the player's force walk has finished. */ #define if_force_walk_finished(chr, label) \ - mkshort(0xff01), \ + mkshort(0x0178), \ chr, \ label, #define play_sound_from_entity(channel, entity_id, u1, u2, attackflags) \ - mkshort(0xed00), \ + mkshort(0x0179), \ channel, \ entity_id, \ 0x00, \ @@ -2726,14 +2727,14 @@ * their normal target (same as if_can_see_target). */ #define if_can_see_attack_target(label) \ - mkshort(0x8200), \ + mkshort(0x017a), \ label, /** * Checks if the chr is knocked out or invalid. */ #define if_chr_knockedout(chr, label) \ - mkshort(0x8300), \ + mkshort(0x017b), \ chr, \ label, @@ -2741,7 +2742,7 @@ * Assigns a sound to the given channel. Does not play the sound. */ #define assign_sound(sound, channel) \ - mkshort(0xee00), \ + mkshort(0x017c), \ mkshort(sound), \ channel, @@ -2752,7 +2753,7 @@ * until stop_cutscene_track is called. */ #define play_cutscene_track(tracknum) \ - mkshort(0xff33), \ + mkshort(0x017d), \ tracknum, /** @@ -2760,7 +2761,7 @@ * stage. */ #define stop_cutscene_track \ - mkshort(0xff34), + mkshort(0x017e), /** * Overrides the ambient track temporarily to the given one and plays it. @@ -2769,7 +2770,7 @@ * outro to traffic noises. */ #define play_temporary_track(tracknum) \ - mkshort(0xff35), \ + mkshort(0x017f), \ tracknum, /** @@ -2779,13 +2780,13 @@ * ambient tracks. */ #define stop_ambient_track \ - mkshort(0xff36), + mkshort(0x0180), /** * Checks if the player is looking directly at the given object. */ #define if_chr_looking_at_object(chr, object, label) \ - mkshort(0x8400), \ + mkshort(0x0181), \ chr, \ object, \ label, @@ -2794,7 +2795,7 @@ * Makes the current chr attack their target by punching or kicking. */ #define try_punch_or_kick(label) \ - mkshort(0x8500), \ + mkshort(0x0182), \ 0x00, \ label, @@ -2802,7 +2803,7 @@ * Checks if the current chr's target is the player. */ #define if_target_is_player(label) \ - mkshort(0x8600), \ + mkshort(0x0183), \ label, /** @@ -2828,15 +2829,15 @@ * Global AI lists - with values 90,100 and 20,30 */ #define try_attack_amount(lower, upper) \ - mkshort(0xef00), \ + mkshort(0x0184), \ lower, \ upper, #define mp_init_simulants \ - mkshort(0xff37), + mkshort(0x0185), #define if_chr_soundtimer(value, operator, label) \ - mkshort(0x8700), \ + mkshort(0x0186), \ mkshort(value), \ operator, \ label, @@ -2849,14 +2850,14 @@ * be set to the player whose camspy should be checked. */ #define set_target_to_camspy_if_in_sight(label) \ - mkshort(0x8800), \ + mkshort(0x0187), \ label, /** * Checks if the lift is currently stopped. */ #define if_lift_stationary(lift, label) \ - mkshort(0x8900), \ + mkshort(0x0188), \ lift, \ label, @@ -2866,7 +2867,7 @@ * The given value is not known. It may be intensity or direction. */ #define enable_rain(value) \ - mkshort(0xff38), \ + mkshort(0x018b), \ value, /** @@ -2876,7 +2877,7 @@ * modelpart should be a MODELPART constant, and refers to a node in the model. */ #define chr_toggle_modelpart(chr, modelpart) \ - mkshort(0xff39), \ + mkshort(0x018c), \ chr, \ modelpart, @@ -2886,7 +2887,7 @@ * Lifts need to be activated before they start working. */ #define activate_lift(liftid, object) \ - mkshort(0xff3a), \ + mkshort(0x018d), \ liftid, \ object, @@ -2896,7 +2897,7 @@ * Will not pass the check if the miniskedar doesn't have enough room. */ #define miniskedar_try_pounce(u1, u2, label) \ - mkshort(0x8a00), \ + mkshort(0x018e), \ u1, \ mkshort(u2), \ 0x00, \ @@ -2907,7 +2908,7 @@ * than the given value. */ #define if_object_distance_to_pad_lt(object, distance, pad, label) \ - mkshort(0x8b00), \ + mkshort(0x018f), \ object, \ mkshort(distance / 10), \ mkshort(pad), \ @@ -2919,21 +2920,21 @@ * Expected to be a GAMEFILEFLAG constant. */ #define set_savefile_flag(flag) \ - mkshort(0xff3b), \ + mkshort(0x0190), \ flag, /** * Unsets a savefile flag. */ #define unset_savefile_flag(flag) \ - mkshort(0xff3c), \ + mkshort(0x0191), \ flag, /** * Checks if the given savefile flag is set. */ #define if_savefile_flag_is_set(flag, label) \ - mkshort(0xff02), \ + mkshort(0x0192), \ flag, \ label, @@ -2941,7 +2942,7 @@ * Checks if the given savefile flag is unset. */ #define if_savefile_flag_is_unset(flag, label) \ - mkshort(0xff03), \ + mkshort(0x0193), \ flag, \ label, @@ -2949,7 +2950,7 @@ * Checks if the given object's health is less than the given value. */ #define if_object_health_lt(object, value, label) \ - mkshort(0x8c00), \ + mkshort(0x019e), \ object, \ mkshort(value), \ label, @@ -2958,7 +2959,7 @@ * Sets the given object's health. */ #define set_object_health(object, value) \ - mkshort(0xf000), \ + mkshort(0x019f), \ object, \ mkshort(value), @@ -2971,7 +2972,7 @@ * The value for specialdie should be one of the SPECIALDIE constants. */ #define set_chr_special_death_animation(chr, specialdie) \ - mkshort(0xf100), \ + mkshort(0x01a0), \ chr, \ specialdie, @@ -2980,7 +2981,7 @@ * target is in. */ #define set_chr_roomtosearch \ - mkshort(0xf200), + mkshort(0x01a1), /** * Play a quip for the CI staff. @@ -2995,7 +2996,7 @@ * The quip used is random. */ #define play_cistaff_quip(ciquip, channel) \ - mkshort(0xff3d), \ + mkshort(0x01a2), \ ciquip, \ channel, @@ -3008,7 +3009,7 @@ * See the PRESETANIM constants. */ #define do_preset_animation(value) \ - mkshort(0xf300), \ + mkshort(0x01a3), \ value, /** @@ -3021,7 +3022,7 @@ * For removing HUD messages, consider using remove_hudmsgs instead. */ #define show_hudmsg_middle(operation, color, text) \ - mkshort(0xf400), \ + mkshort(0x01a4), \ operation, \ color, \ mkshort(text), @@ -3030,7 +3031,7 @@ * Checks if the chr is not currently talking. */ #define if_chr_not_talking(chr, label) \ - mkshort(0x8d00), \ + mkshort(0x01a7), \ chr, \ label, @@ -3041,7 +3042,7 @@ * Operator is expected to be OPERATOR_LESS_THAN or OPERATOR_GREATER_THAN. */ #define if_num_subdued(value, operator, label) \ - mkshort(0x8e00), \ + mkshort(0x01ab), \ value, \ 1 - operator, \ label, @@ -3050,21 +3051,21 @@ * Makes the player let go of the currently held object (eg. hovercrate or bed). */ #define release_grabbed_object(chr) \ - mkshort(0xff3e), \ + mkshort(0x01ad), \ chr, /** * Removes all items from the player's inventory. */ #define clear_inventory(chr) \ - mkshort(0xff3f), \ + mkshort(0x01ae), \ chr, /** * Makes the player grab the given object (eg. hovercrate or bed). */ #define grab_object(chr, object) \ - mkshort(0xff40), \ + mkshort(0x01af), \ chr, \ object, @@ -3076,7 +3077,7 @@ * The dst tags are remapped so they point at random pillars. */ #define shuffle_ruins_pillars(pdst1, pdst2, pdst3, psrc1, psrc2, psrc3, psrc4, psrc5, mdst1, mdst2, mdst3, msrc1, msrc2, msrc3, msrc4, msrc5) \ - mkshort(0xff41), \ + mkshort(0x01b1), \ pdst1, \ pdst2, \ pdst3, \ @@ -3098,7 +3099,7 @@ * Set the wind speed, which controls how quickly clouds in the sky are moving. */ #define set_wind_speed(speed) \ - mkshort(0xff42), \ + mkshort(0x01b2), \ speed, /** @@ -3110,18 +3111,18 @@ * exist. */ #define chr_toggle_p1p2(chr) \ - mkshort(0xf500), \ + mkshort(0x01b3), \ chr, #define cmd01b4_if_something(label) \ - mkshort(0x8f00), \ + mkshort(0x01b4), \ label, /** * Enables or disables the snow effect. */ #define enable_snow(bool) \ - mkshort(0xff43), \ + mkshort(0x01b6), \ bool, /** @@ -3130,7 +3131,7 @@ * bool_unknown determines whether to call some function on the chr afterwards */ #define set_chr_cloaked(chr, bool_enable, bool_unknown) \ - mkshort(0xf600), \ + mkshort(0x01b7), \ chr, \ bool_enable, \ bool_unknown, @@ -3139,7 +3140,7 @@ * Define the team that an autogun should shoot at. */ #define set_autogun_target_team(object, team) \ - mkshort(0xf700), \ + mkshort(0x01b8), \ object, \ team, @@ -3149,7 +3150,7 @@ * Note no arguments are passed here. The switch numbers are hard coded. */ #define shuffle_pelagic_switches \ - mkshort(0xff44), + mkshort(0x01b9), /** * Makes the chr attempt to do a lying down attack. @@ -3157,7 +3158,7 @@ * attackflags is expected to be a bitfield of ATTACKFLAG constants. */ #define try_attack_lie(attackflags, entity_id, label) \ - mkshort(0x9000), \ + mkshort(0x01ba), \ mkshort(attackflags), \ mkshort(entity_id), \ label, @@ -3166,7 +3167,7 @@ * Checks if the CI training PC has been holographed. */ #define if_training_pc_holographed(label) \ - mkshort(0xff04), \ + mkshort(0x01bd), \ label, /** @@ -3185,7 +3186,7 @@ * WEAPON_XRAYSCANNER */ #define if_player_using_device(player, weapon, label) \ - mkshort(0x9100), \ + mkshort(0x01be), \ player, \ weapon, \ label, @@ -3197,7 +3198,7 @@ * if_teleport_full_white, then call this again with pad = 0. */ #define teleport_to_pad(pad, chr) \ - mkshort(0xff45), \ + mkshort(0x01bf), \ mkshort(pad), \ chr, @@ -3205,7 +3206,7 @@ * Checks if the teleport effect is full white. */ #define if_teleport_full_white(label, chr) \ - mkshort(0xff05), \ + mkshort(0x01c0), \ label, \ chr, @@ -3216,7 +3217,7 @@ * them. It is invoked somewhat randomly. See set_chr_dodge_rating. */ #define set_aishootingatmelist(ailistid) \ - mkshort(0xf800), \ + mkshort(0x01c2), \ mkshort(ailistid), /** @@ -3224,7 +3225,7 @@ * switched off. */ #define set_darkroomlist(ailist) \ - mkshort(0xf900), \ + mkshort(0x01c3), \ mkshort(ailist), /** @@ -3240,7 +3241,7 @@ * again. */ #define set_chr_dodge_rating(value, whichprop) \ - mkshort(0xff46), \ + mkshort(0x01c6), \ value, \ whichprop, @@ -3248,7 +3249,7 @@ * This doesn't appear to be used. */ #define set_unarmeddodgerating(value) \ - mkshort(0xff47), \ + mkshort(0x01c7), \ value, /** @@ -3263,7 +3264,7 @@ * a pistol, otherwise the Falcon 2 will be used. */ #define set_cutscene_weapon(chr, weapon, weapon_fallback) \ - mkshort(0xff48), \ + mkshort(0x01ca), \ chr, \ weapon, \ weapon_fallback, @@ -3279,7 +3280,7 @@ * Second with 0x00000000 (transparent) and num_frames = 90. */ #define fade_to_color(rgba, num_frames) \ - mkshort(0xfa00), \ + mkshort(0x01cb), \ mkword(rgba), \ mkshort(num_frames), @@ -3288,7 +3289,7 @@ * person perspective (ie. in cutscenes or when playing coop). */ #define set_chr_hudpiece_visible(chr, bool) \ - mkshort(0xff49), \ + mkshort(0x01cd), \ chr, \ bool, @@ -3298,19 +3299,19 @@ * Used in the Carrington Institute. */ #define passive_mode(bool) \ - mkshort(0xff4a), \ + mkshort(0x01ce), \ bool, /** * Makes a chr start or stop shooting in a cutscene. */ #define set_chr_shooting_in_cutscene(chr, bool) \ - mkshort(0xff4b), \ + mkshort(0x01cf), \ chr, \ bool, #define set_portal_flag(portal, flag) \ - mkshort(0xff4c), \ + mkshort(0x01d0), \ mkshort(portal), \ flag, @@ -3322,7 +3323,7 @@ * visible is a boolean. TRUE makes it visible. FALSE makes it invisible. */ #define object_set_modelpart_visible(object, modelpart, visible) \ - mkshort(0xff4d), \ + mkshort(0x01d1), \ object, \ modelpart, \ visible, @@ -3333,7 +3334,7 @@ * Used for Dr Caroll. */ #define emit_sparks(chr) \ - mkshort(0xfb00), \ + mkshort(0x01d2), \ chr, /** @@ -3348,13 +3349,13 @@ * See also DRCAROLLIMAGE constants. */ #define set_drcaroll_images(chr, left, right) \ - mkshort(0xff4e), \ + mkshort(0x01d3), \ chr, \ left, \ right, #define set_room_flag(room, flag) \ - mkshort(0xff4f), \ + mkshort(0x01d4), \ mkshort(room), \ mkshort(flag), @@ -3364,7 +3365,7 @@ * Used for cutscenes. */ #define show_nonessential_chrs(bool) \ - mkshort(0xff50), \ + mkshort(0x01d5), \ bool, /** @@ -3427,13 +3428,13 @@ * - Stops the UFO humming noise. */ #define configure_environment(room, operation, value) \ - mkshort(0xff51), \ + mkshort(0x01d6), \ mkshort(room), \ operation, \ value, #define play_sound_from_object2(channel, object, sound, u1, u2) \ - mkshort(0xff52), \ + mkshort(0x01d9), \ channel, \ object, \ mkshort(sound), \ @@ -3450,21 +3451,21 @@ * Track is expected to be a MUSIC constant. */ #define play_music_continuously(track) \ - mkshort(0xff53), \ + mkshort(0x01da), \ track, /** * Kills the given chr. */ #define kill(chr) \ - mkshort(0xfc00), \ + mkshort(0x01db), \ chr, /** * Removes the given weapon from the current player's inventory. */ #define remove_weapon_from_inventory(weapon) \ - mkshort(0xff54), \ + mkshort(0x01dc), \ weapon, /** @@ -3476,7 +3477,7 @@ * The value argument is unused. */ #define if_music_event_queue_empty(value, label) \ - mkshort(0xff06), \ + mkshort(0x01dd), \ value, \ label, @@ -3485,7 +3486,7 @@ * (ie. Y difference is less than 150). */ #define if_chr_same_floor_distance_to_pad_lt(chr, pad, distance, label) \ - mkshort(0x9300), \ + mkshort(0x01df), \ chr, \ mkshort(pad), \ mkshort(distance / 10), \ @@ -3498,7 +3499,7 @@ * if_num_human_players_lt for that. */ #define if_coop_mode(label) \ - mkshort(0x9200), \ + mkshort(0x01de), \ label, /** @@ -3511,7 +3512,10 @@ * This appears to be a debug command. It is not used normally. */ #define remove_references_to_chr \ - mkshort(0xff55), + mkshort(0x01e0), + +#define infloop \ + mkshort(0xdead), // Convenience macros for readability #define beginloop(id) \ diff --git a/src/include/constants.h b/src/include/constants.h index 695e239f0..90cd76133 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -20,8 +20,6 @@ #define MINFLOAT ((float)-3.40282346638528860e+38) #define MAXFLOAT ((float)3.40282346638528860e+38) -#define AILABEL(ailist, upper, lower) ((ailist) + ((upper) << 8 | (lower))) - #define ABS(val) ((val) > 0 ? (val) : -(val)) #define ABSF(val) ((val) > 0.0f ? (val) : -(val)) #define ALIGN2(val) (((val) | 1) ^ 0x1) @@ -617,10 +615,6 @@ #define CIQUIP_ANNOYED 2 #define CIQUIP_THANKS 3 -#define CMD_LABEL 0x9400 -#define CMD_END 0x9600 -#define CMD_GOTOFIRST 0x0100 - // Collision detection #define CDRESULT_ERROR -1 #define CDRESULT_COLLISION 0 diff --git a/src/include/game/challenge.h b/src/include/game/challenge.h index 640238d12..4abf986fe 100644 --- a/src/include/game/challenge.h +++ b/src/include/game/challenge.h @@ -23,7 +23,6 @@ void challengeApply(void); char *challengeGetCurrentDescription(void); char *challengeGetConfigDescription(struct mpconfigfull *mpconfig); bool challengeIsCompleteForEndscreen(void); -u8 *aiMpInitSimulants(u8 *cmd); void vmPrintStatsIfEnabled(void); bool ChallengeIsAvailableToPlayer(s32 chrnum, s32 challengeindex); bool challengeIsAvailableToAnyPlayer(s32 challengeindex); diff --git a/src/include/game/chrai.h b/src/include/game/chrai.h index 18c1a61b0..020508731 100644 --- a/src/include/game/chrai.h +++ b/src/include/game/chrai.h @@ -4,7 +4,6 @@ #include "data.h" #include "types.h" -s32 chraiGetListIdByList(u8 *ailist, bool *is_global); void chraiExecute(void *entity, s32 proptype); #endif diff --git a/src/include/lib/ailist.h b/src/include/lib/ailist.h index 4de4abb3f..439581e8e 100644 --- a/src/include/lib/ailist.h +++ b/src/include/lib/ailist.h @@ -5,6 +5,5 @@ #include "types.h" u8 *ailistFindById(s32 ailistid); -void ailistPreprocessFile(struct ailist *ailist, s32 mempool); #endif diff --git a/src/include/types.h b/src/include/types.h index ed893e20a..e3d1f5c6a 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3083,6 +3083,9 @@ struct stagetableentry { /*0x0c*/ u16 padsfileid; /*0x0e*/ u16 setupfileid; /*0x10*/ u16 mpsetupfileid; + u8 *ailistsromstart; + u8 *ailistsromend; + struct ailist *ailists; /*0x14*/ f32 unk14; /*0x18*/ f32 unk18; /*0x1c*/ f32 unk1c; diff --git a/src/lib/ailist.c b/src/lib/ailist.c index 2611323e3..9f2a60526 100644 --- a/src/lib/ailist.c +++ b/src/lib/ailist.c @@ -57,617 +57,3 @@ u8 *ailistFindById(s32 ailistid) return NULL; } - -u8 g_TopLengths[] = { - /* 0x00 */ 3, - /* 0x01 */ 3, - /* 0x02 */ 3, - /* 0x03 */ 3, - /* 0x04 */ 3, - /* 0x05 */ 3, - /* 0x06 */ 3, - /* 0x07 */ 3, - /* 0x08 */ 7, - /* 0x09 */ 7, - /* 0x0a */ 7, - /* 0x0b */ 7, - /* 0x0c */ 7, - /* 0x0d */ 3, - /* 0x0e */ 3, - /* 0x0f */ 3, - /* 0x10 */ 3, - /* 0x11 */ 4, - /* 0x12 */ 4, - /* 0x13 */ 3, - /* 0x14 */ 4, - /* 0x15 */ 4, - /* 0x16 */ 3, - /* 0x17 */ 4, - /* 0x18 */ 4, - /* 0x19 */ 3, - /* 0x1a */ 3, - /* 0x1b */ 3, - /* 0x1c */ 4, - /* 0x1d */ 4, - /* 0x1e */ 3, - /* 0x1f */ 7, - /* 0x20 */ 3, - /* 0x21 */ 4, - /* 0x22 */ 3, - /* 0x23 */ 3, - /* 0x24 */ 5, - /* 0x25 */ 3, - /* 0x26 */ 3, - /* 0x27 */ 3, - /* 0x28 */ 4, - /* 0x29 */ 6, - /* 0x2a */ 4, - /* 0x2b */ 4, - /* 0x2c */ 5, - /* 0x2d */ 5, - /* 0x2e */ 8, - /* 0x2f */ 8, - /* 0x30 */ 6, - /* 0x31 */ 6, - /* 0x32 */ 7, - /* 0x33 */ 7, - /* 0x34 */ 5, - /* 0x35 */ 4, - /* 0x36 */ 5, - /* 0x37 */ 5, - /* 0x38 */ 5, - /* 0x39 */ 4, - /* 0x3a */ 5, - /* 0x3b */ 5, - /* 0x3c */ 5, - /* 0x3d */ 4, - /* 0x3e */ 4, - /* 0x3f */ 4, - /* 0x40 */ 4, - /* 0x41 */ 4, - /* 0x42 */ 4, - /* 0x43 */ 4, - /* 0x44 */ 4, - /* 0x45 */ 4, - /* 0x46 */ 4, - /* 0x47 */ 4, - /* 0x48 */ 5, - /* 0x49 */ 5, - /* 0x4a */ 9, - /* 0x4b */ 9, - /* 0x4c */ 8, - /* 0x4d */ 7, - /* 0x4e */ 8, - /* 0x4f */ 8, - /* 0x50 */ 6, - /* 0x51 */ 6, - /* 0x52 */ 5, - /* 0x53 */ 5, - /* 0x54 */ 13, - /* 0x55 */ 12, - /* 0x56 */ 10, - /* 0x57 */ 10, - /* 0x58 */ 7, - /* 0x59 */ 4, - /* 0x5a */ 6, - /* 0x5b */ 6, - /* 0x5c */ 3, - /* 0x5d */ 4, - /* 0x5e */ 3, - /* 0x5f */ 6, - /* 0x60 */ 6, - /* 0x61 */ 3, - /* 0x62 */ 8, - /* 0x63 */ 8, - /* 0x64 */ 4, - /* 0x65 */ 4, - /* 0x66 */ 5, - /* 0x67 */ 3, - /* 0x68 */ 3, - /* 0x69 */ 3, - /* 0x6a */ 4, - /* 0x6b */ 4, - /* 0x6c */ 3, - /* 0x6d */ 3, - /* 0x6e */ 4, - /* 0x6f */ 5, - /* 0x70 */ 3, - /* 0x71 */ 4, - /* 0x72 */ 4, - /* 0x73 */ 5, - /* 0x74 */ 4, - /* 0x75 */ 5, - /* 0x76 */ 4, - /* 0x77 */ 5, - /* 0x78 */ 4, - /* 0x79 */ 4, - /* 0x7a */ 4, - /* 0x7b */ 7, - /* 0x7c */ 5, - /* 0x7d */ 4, - /* 0x7e */ 5, - /* 0x7f */ 4, - /* 0x80 */ 4, - /* 0x81 */ 3, - /* 0x82 */ 3, - /* 0x83 */ 4, - /* 0x84 */ 5, - /* 0x85 */ 4, - /* 0x86 */ 3, - /* 0x87 */ 6, - /* 0x88 */ 3, - /* 0x89 */ 4, - /* 0x8a */ 7, - /* 0x8b */ 8, - /* 0x8c */ 6, - /* 0x8d */ 4, - /* 0x8e */ 5, - /* 0x8f */ 3, - /* 0x90 */ 7, - /* 0x91 */ 5, - /* 0x92 */ 3, - /* 0x93 */ 8, - /* 0x94 */ 3, - /* 0x95 */ 2, - /* 0x96 */ 2, - /* 0x97 */ 5, - /* 0x98 */ 5, - /* 0x99 */ 4, - /* 0x9a */ 2, - /* 0x9b */ 2, - /* 0x9c */ 2, - /* 0x9d */ 12, - /* 0x9e */ 8, - /* 0x9f */ 5, - /* 0xa0 */ 4, - /* 0xa1 */ 3, - /* 0xa2 */ 4, - /* 0xa3 */ 4, - /* 0xa4 */ 2, - /* 0xa5 */ 3, - /* 0xa6 */ 2, - /* 0xa7 */ 2, - /* 0xa8 */ 2, - /* 0xa9 */ 3, - /* 0xaa */ 3, - /* 0xab */ 3, - /* 0xac */ 4, - /* 0xad */ 5, - /* 0xae */ 3, - /* 0xaf */ 3, - /* 0xb0 */ 4, - /* 0xb1 */ 3, - /* 0xb2 */ 3, - /* 0xb3 */ 3, - /* 0xb4 */ 3, - /* 0xb5 */ 3, - /* 0xb6 */ 4, - /* 0xb7 */ 4, - /* 0xb8 */ 3, - /* 0xb9 */ 7, - /* 0xba */ 7, - /* 0xbb */ 8, - /* 0xbc */ 8, - /* 0xbd */ 6, - /* 0xbe */ 6, - /* 0xbf */ 6, - /* 0xc0 */ 6, - /* 0xc1 */ 7, - /* 0xc2 */ 7, - /* 0xc3 */ 7, - /* 0xc4 */ 7, - /* 0xc5 */ 7, - /* 0xc6 */ 7, - /* 0xc7 */ 3, - /* 0xc8 */ 4, - /* 0xc9 */ 4, - /* 0xca */ 2, - /* 0xcb */ 2, - /* 0xcc */ 2, - /* 0xcd */ 2, - /* 0xce */ 5, - /* 0xcf */ 6, - /* 0xd0 */ 9, - /* 0xd1 */ 5, - /* 0xd2 */ 6, - /* 0xd3 */ 3, - /* 0xd4 */ 5, - /* 0xd5 */ 3, - /* 0xd6 */ 4, - /* 0xd7 */ 5, - /* 0xd8 */ 8, - /* 0xd9 */ 3, - /* 0xda */ 3, - /* 0xdb */ 3, - /* 0xdc */ 3, - /* 0xdd */ 7, - /* 0xde */ 7, - /* 0xdf */ 7, - /* 0xe0 */ 7, - /* 0xe1 */ 3, - /* 0xe2 */ 2, - /* 0xe3 */ 10, - /* 0xe4 */ 3, - /* 0xe5 */ 4, - /* 0xe6 */ 4, - /* 0xe7 */ 8, - /* 0xe8 */ 2, - /* 0xe9 */ 2, - /* 0xea */ 3, - /* 0xeb */ 5, - /* 0xec */ 3, - /* 0xed */ 11, - /* 0xee */ 5, - /* 0xef */ 4, - /* 0xf0 */ 5, - /* 0xf1 */ 4, - /* 0xf2 */ 2, - /* 0xf3 */ 3, - /* 0xf4 */ 6, - /* 0xf5 */ 3, - /* 0xf6 */ 5, - /* 0xf7 */ 4, - /* 0xf8 */ 4, - /* 0xf9 */ 4, - /* 0xfa */ 8, - /* 0xfb */ 3, - /* 0xfc */ 3, - /* 0xfd */ 4, -}; - -u8 g_SubLengths[] = { - /* 0x00 */ 3, - /* 0x01 */ 4, - /* 0x02 */ 4, - /* 0x03 */ 4, - /* 0x04 */ 3, - /* 0x05 */ 4, - /* 0x06 */ 4, - /* 0x07 */ 3, - /* 0x08 */ 2, - /* 0x09 */ 2, - /* 0x0a */ 4, - /* 0x0b */ 3, - /* 0x0c */ 3, - /* 0x0d */ 5, - /* 0x0e */ 4, - /* 0x0f */ 3, - /* 0x10 */ 3, - /* 0x11 */ 3, - /* 0x12 */ 2, - /* 0x13 */ 2, - /* 0x14 */ 4, - /* 0x15 */ 2, - /* 0x16 */ 2, - /* 0x17 */ 7, - /* 0x18 */ 3, - /* 0x19 */ 6, - /* 0x1a */ 6, - /* 0x1b */ 2, - /* 0x1c */ 2, - /* 0x1d */ 4, - /* 0x1e */ 4, - /* 0x1f */ 3, - /* 0x20 */ 4, - /* 0x21 */ 3, - /* 0x22 */ 5, - /* 0x23 */ 3, - /* 0x24 */ 3, - /* 0x25 */ 11, - /* 0x26 */ 4, - /* 0x27 */ 4, - /* 0x28 */ 4, - /* 0x29 */ 3, - /* 0x2a */ 9, - /* 0x2b */ 4, - /* 0x2c */ 2, - /* 0x2d */ 3, - /* 0x2e */ 3, - /* 0x2f */ 2, - /* 0x30 */ 10, - /* 0x31 */ 5, - /* 0x32 */ 9, - /* 0x33 */ 3, - /* 0x34 */ 2, - /* 0x35 */ 3, - /* 0x36 */ 2, - /* 0x37 */ 2, - /* 0x38 */ 3, - /* 0x39 */ 4, - /* 0x3a */ 4, - /* 0x3b */ 3, - /* 0x3c */ 3, - /* 0x3d */ 4, - /* 0x3e */ 3, - /* 0x3f */ 3, - /* 0x40 */ 4, - /* 0x41 */ 18, - /* 0x42 */ 3, - /* 0x43 */ 3, - /* 0x44 */ 2, - /* 0x45 */ 5, - /* 0x46 */ 4, - /* 0x47 */ 3, - /* 0x48 */ 5, - /* 0x49 */ 4, - /* 0x4a */ 3, - /* 0x4b */ 4, - /* 0x4c */ 5, - /* 0x4d */ 5, - /* 0x4e */ 5, - /* 0x4f */ 6, - /* 0x50 */ 3, - /* 0x51 */ 6, - /* 0x52 */ 11, - /* 0x53 */ 3, - /* 0x54 */ 3, - /* 0x55 */ 2, -}; - -bool ailistIsGoto(u8 major, u8 minor) -{ - if (major == 0xff) { - return minor <= 0x06; - } else { - return major <= 0x93 || major == 0xfd; - } -} - -bool ailistGetLen(u8 major, u8 minor) -{ - if (major == 0xff) { - return g_SubLengths[minor]; - } else { - return g_TopLengths[major]; - } -} - -void ailistAnalyse(u8 *ailist, s32 *numcmdsptr, s32 *numlabelsptr, s32 *numgotosptr, s32 *oldsizeptr) -{ - s32 numcmds = 0; - s32 numlabels = 0; - s32 numgotos = 0; - u8 *ptr = ailist; - s32 type; - - do { - u8 major = ptr[0]; - u8 minor = ptr[1]; - - type = major << 8 | minor; - - if (type == CMD_LABEL) { - numlabels++; - } else if (ailistIsGoto(major, minor)) { - numgotos++; - } - - numcmds++; - ptr += ailistGetLen(major, minor); - } while (type != CMD_END); - - *numcmdsptr = numcmds; - *numlabelsptr = numlabels; - *numgotosptr = numgotos; - *oldsizeptr = ptr - ailist; -} - -struct tmpcmd { - u16 type; - u16 oldoffset; - u16 newoffset; - u8 len; - u8 labelnum; // if label - u8 gotolabelnum; // if goto - struct tmpcmd *target; -}; - -void ailistConvert(u8 *src, u8 *dst, struct tmpcmd *cmds, s32 numcmds) -{ - s32 i = 0; - s32 j; - u8 *ptr = src; - s32 newoffset = 0; - s32 type; - - // Start by building the tmpcmd list, but keeping the target pointers NULL - do { - u8 major = ptr[0]; - u8 minor = ptr[1]; - - type = major << 8 | minor; - - cmds[i].type = type; - cmds[i].oldoffset = ptr - src; - cmds[i].newoffset = newoffset; - cmds[i].labelnum = 0xff; - cmds[i].gotolabelnum = 0xff; - cmds[i].target = NULL; - cmds[i].len = ailistGetLen(major, minor); - - if (type == CMD_LABEL) { - cmds[i].labelnum = ptr[2]; - } else if (ailistIsGoto(major, minor)) { - if (type == 0xff05) { - cmds[i].gotolabelnum = ptr[2]; - } else { - cmds[i].gotolabelnum = ptr[cmds[i].len - 1]; - } - - newoffset += cmds[i].len + 1; - } else { - newoffset += cmds[i].len; - } - - ptr += cmds[i].len; - i++; - } while (type != CMD_END); - - // Iterate again and populate the target pointers - for (i = 0; i < numcmds; i++) { - if (cmds[i].gotolabelnum != 0xff) { - j = cmds[i].type == CMD_GOTOFIRST ? 0 : i + 1; - - while (j < numcmds) { - if (cmds[j].labelnum == cmds[i].gotolabelnum) { - cmds[i].target = &cmds[j]; - break; - } - - j++; - } - - if (j == numcmds) { - // Label wasn't found - cmds[i].target = &cmds[0]; - } - } - } - - // Write the new data - ptr = dst; - - for (i = 0; i < numcmds; i++) { - if (cmds[i].labelnum != 0xff) { - // Label - don't write it - } else if (cmds[i].type == 0xff05) { - // Special goto with label as first param instead of last - ptr[0] = 0xff; - ptr[1] = 0x05; - ptr[2] = cmds[i].target->newoffset >> 8; - ptr[3] = cmds[i].target->newoffset & 0xff; - ptr[4] = src[cmds[i].oldoffset + 3]; - ptr += 5; - } else if (cmds[i].gotolabelnum != 0xff) { - // Goto - write it and replace the label with the offset - for (j = 0; j < cmds[i].len - 1; j++) { - ptr[j] = src[cmds[i].oldoffset + j]; - } - - ptr += cmds[i].len + 1; - ptr[-2] = cmds[i].target->newoffset >> 8; - ptr[-1] = cmds[i].target->newoffset & 0xff; - } else { - // Other command - copy it verbatim - for (j = 0; j < cmds[i].len; j++) { - ptr[j] = src[cmds[i].oldoffset + j]; - } - - ptr += cmds[i].len; - } - } -} - -/** - * Preprocess a single ailist. - */ -u8 *ailistPreprocessList(u8 *ailist, s32 mempool) -{ - s32 numcmds; - s32 numlabels; - s32 numgotos; - s32 oldsize; - s32 newsize; - s32 newsizealigned; - u8 *ptr; - u8 *scratch; - struct tmpcmd *tmpcmds; - - // Do the initial pass over the function, counting the number of commands, - // labels, gotos and also totalling out the byte size of the list. - ailistAnalyse(ailist, &numcmds, &numlabels, &numgotos, &oldsize); - - // All goto instructions are having one byte added, - // and all labels (3 bytes each) are being removed. - newsize = oldsize + numgotos - numlabels * 3; - newsizealigned = ALIGN4(newsize); - - // Allocate some scratch space where the new list will be built, - // and some space for a temporary command list. - ptr = mempAlloc(newsizealigned + numcmds * sizeof(struct tmpcmd), mempool); - - scratch = ptr; - ptr += newsizealigned; - tmpcmds = (void *) ptr; - - // Build the new list - ailistConvert(ailist, scratch, tmpcmds, numcmds); - - if (newsize > oldsize) { - // It's too big to copy back to its original spot, - // so the scratch space is now becoming permanent. - // Free the tmpcmds part by resizing the allocation - // to the size of the scratch. - mempRealloc(scratch, newsize, mempool); - - return scratch; - } - - // Copy it back into its original spot - bcopy(scratch, ailist, newsize); - - // Free the scratch space and cmds - mempRealloc(scratch, 0, mempool); - - return NULL; -} - -/** - * What we're doing here is preprocessing ailists to remove all label commands, - * and replace "goto label"-like statements with "goto offset". - * - * This allows the engine to jump directly to an offset in the ailist without - * having to iterate the commands in the list to find the label. - * - * In most cases the converted ailist is smaller than the original and can - * just overwrite the original data. In a few cases the new ailist is bigger - * so it must be relocated. - * - * This function in particular is processing all ailists in the file - * (file meaning gailists.c or a stage setup file). The ailist argument is a - * pointer to the start of the ailist table, usually found near the bottom of - * the file. - * - * Some ailists have multiple entries in the table, so we have to track which - * ones have been done to prevent doing them twice. - */ -void ailistPreprocessFile(struct ailist *ailist, s32 mempool) -{ - u8 *done[150]; - s32 donelen = 0; - s32 i; - - // Iterate the ailists in the table - while (ailist->list) { - // Check it's not done already - for (i = 0; i < donelen; i++) { - if (done[i] == ailist->list) { - break; - } - } - - if (i == donelen) { - // Convert the list, which might require relocating it in memory - u8 *newaddr = ailistPreprocessList(ailist->list, mempool); - - if (newaddr) { - // Update this ailist's pointer to its commands - // and any future ailists that point to the same commands - struct ailist *tmp = ailist; - - while (tmp->list) { - if (tmp->list == ailist->list) { - tmp->list = newaddr; - } - - tmp++; - } - } - - done[donelen] = ailist->list; - donelen++; - } - - ailist++; - } -} diff --git a/src/lib/main.c b/src/lib/main.c index 7d8d4ddb5..25a5bbbff 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -97,10 +97,10 @@ struct stageallocation g_StageAllocations8Mb[] = { { STAGE_AIRFORCEONE, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, { STAGE_CRASHSITE, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, { STAGE_PELAGIC, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, - { STAGE_DEEPSEA, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, + { STAGE_DEEPSEA, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma200" }, { STAGE_DEFENSE, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, - { STAGE_ATTACKSHIP, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, - { STAGE_SKEDARRUINS, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma100" }, + { STAGE_ATTACKSHIP, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma200" }, + { STAGE_SKEDARRUINS, "-ml0 -me0 -mgfx110 -mgfxtra80 -mvtx100 -ma200" }, { STAGE_MP_SKEDAR, "-ml0 -me0 -mgfx200 -mvtx200 -ma100" }, { STAGE_MP_RAVINE, "-ml0 -me0 -mgfx200 -mvtx200 -ma100" }, { STAGE_MP_PIPES, "-ml0 -me0 -mgfx200 -mvtx200 -ma100" }, @@ -170,7 +170,7 @@ extern u8 _accessingpakSegmentRomStart; extern u8 _accessingpakSegmentRomEnd; extern u8 _copyrightSegmentRomStart; extern u8 _copyrightSegmentRomEnd; -extern u8 _gameSegmentEnd; +extern u8 _setupdishasmSegmentEnd; #if VERSION >= VERSION_NTSC_1_0 /** @@ -392,15 +392,13 @@ void mainInit(void) argSetString(" -ml0 -me0 -mgfx100 -mvtx50 -mt700 -ma400"); } - start = (u8 *) PHYS_TO_K0(osVirtualToPhysical(&_gameSegmentEnd)); + start = (u8 *) PHYS_TO_K0(osVirtualToPhysical(&_setupdishasmSegmentEnd)); end = g_VmMarker; mempSetHeap(start, end - start); mempResetPool(MEMPOOL_8); mempResetPool(MEMPOOL_PERMANENT); - ailistPreprocessFile(g_GlobalAilists, MEMPOOL_PERMANENT); - crashReset(); challengesInit(); utilsInit(); diff --git a/src/lib/mema.c b/src/lib/mema.c index 0b347d749..46049d1d6 100644 --- a/src/lib/mema.c +++ b/src/lib/mema.c @@ -218,15 +218,6 @@ void memaReset(void *heapaddr, u32 heapsize) { struct memaspace *space; -#if VERSION != VERSION_NTSC_BETA && VERSION != VERSION_PAL_BETA - // Adding an amount to the heap size here means that mema can allocate past - // the end of its heap. This would overflow into the gun names language - // file. Maybe this code was intended to be temporary while a developer - // figured out how much memory was needed, but they forgot to remove it? - // @dangerous - heapsize += 0x8e0; -#endif - g_MemaHeap.unk000 = 0; g_MemaHeap.start.addr = 0; diff --git a/src/setups/mp_setupame.c b/src/setups/mp_setupame.c index 5b4e86f0e..35c43a957 100644 --- a/src/setups/mp_setupame.c +++ b/src/setups/mp_setupame.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuparch.c b/src/setups/mp_setuparch.c index 2478e6ed1..185a8fd13 100644 --- a/src/setups/mp_setuparch.c +++ b/src/setups/mp_setuparch.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuparec.c b/src/setups/mp_setuparec.c index 42a668fff..924b5c7c2 100644 --- a/src/setups/mp_setuparec.c +++ b/src/setups/mp_setuparec.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -127,27 +127,3 @@ struct path paths[] = { { NULL, 0, 0 }, }; -u8 func1001_start_lift[] = { - activate_lift(1, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_1b30[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1b30, 0x1000 }, - { func1001_start_lift, 0x1001 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupark.c b/src/setups/mp_setupark.c index 84ad2af2d..43095c21c 100644 --- a/src/setups/mp_setupark.c +++ b/src/setups/mp_setupark.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,8 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupash.c b/src/setups/mp_setupash.c index db9d59704..fb98ec562 100644 --- a/src/setups/mp_setupash.c +++ b/src/setups/mp_setupash.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupate.c b/src/setups/mp_setupate.c index 62c256ce5..45d722b0b 100644 --- a/src/setups/mp_setupate.c +++ b/src/setups/mp_setupate.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupazt.c b/src/setups/mp_setupazt.c index a6e6379dc..a4402549a 100644 --- a/src/setups/mp_setupazt.c +++ b/src/setups/mp_setupazt.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupcat.c b/src/setups/mp_setupcat.c index d4be4efe4..df5118b6d 100644 --- a/src/setups/mp_setupcat.c +++ b/src/setups/mp_setupcat.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupcave.c b/src/setups/mp_setupcave.c index 55509d349..8e2704dbb 100644 --- a/src/setups/mp_setupcave.c +++ b/src/setups/mp_setupcave.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupcrad.c b/src/setups/mp_setupcrad.c index c91bca4ff..d03ca3720 100644 --- a/src/setups/mp_setupcrad.c +++ b/src/setups/mp_setupcrad.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -118,28 +118,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_start_lift[] = { - activate_lift(1, 0x01) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_14e0[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_14e0, 0x1000 }, - { func1001_start_lift, 0x1001 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupcryp.c b/src/setups/mp_setupcryp.c index 2f0cde66f..1cbe0a941 100644 --- a/src/setups/mp_setupcryp.c +++ b/src/setups/mp_setupcryp.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -115,26 +115,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_13d4[] = { - set_wind_speed(11) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_13e0[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_13e0, 0x1000 }, - { func1001_13d4, 0x1001 }, - { NULL, 0 }, -}; - - - diff --git a/src/setups/mp_setupdam.c b/src/setups/mp_setupdam.c index 355b8faa2..f670fc3b7 100644 --- a/src/setups/mp_setupdam.c +++ b/src/setups/mp_setupdam.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -42,7 +42,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; diff --git a/src/setups/mp_setupdepo.c b/src/setups/mp_setupdepo.c index 1648f80f0..efc2aab10 100644 --- a/src/setups/mp_setupdepo.c +++ b/src/setups/mp_setupdepo.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupdest.c b/src/setups/mp_setupdest.c index 4c403f233..7f65a1f2e 100644 --- a/src/setups/mp_setupdest.c +++ b/src/setups/mp_setupdest.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupdish.c b/src/setups/mp_setupdish.c index 0f397dbc8..0128c81e2 100644 --- a/src/setups/mp_setupdish.c +++ b/src/setups/mp_setupdish.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupear.c b/src/setups/mp_setupear.c index 1a6da36d0..fcf30184c 100644 --- a/src/setups/mp_setupear.c +++ b/src/setups/mp_setupear.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -37,12 +37,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_004c[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupeld.c b/src/setups/mp_setupeld.c index 09acb1b31..b0b1ba4ef 100644 --- a/src/setups/mp_setupeld.c +++ b/src/setups/mp_setupeld.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -37,12 +37,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_004c[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupimp.c b/src/setups/mp_setupimp.c index ed405a95b..e7575c2ac 100644 --- a/src/setups/mp_setupimp.c +++ b/src/setups/mp_setupimp.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupjun.c b/src/setups/mp_setupjun.c index 81d72e78d..a3c1d21cb 100644 --- a/src/setups/mp_setupjun.c +++ b/src/setups/mp_setupjun.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -116,24 +116,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - endlist -}; - -u8 func1000_1898[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1898, 0x1000 }, - { NULL, 0 }, -}; - - - - diff --git a/src/setups/mp_setuplam.c b/src/setups/mp_setuplam.c index d5624157a..a25967feb 100644 --- a/src/setups/mp_setuplam.c +++ b/src/setups/mp_setuplam.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuplee.c b/src/setups/mp_setuplee.c index 69fb20617..51836af25 100644 --- a/src/setups/mp_setuplee.c +++ b/src/setups/mp_setuplee.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -37,12 +37,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_004c[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuplen.c b/src/setups/mp_setuplen.c index 66b44ceda..3c9f94e92 100644 --- a/src/setups/mp_setuplen.c +++ b/src/setups/mp_setuplen.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -36,12 +36,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_003c[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuplip.c b/src/setups/mp_setuplip.c index 6fe213064..a785887ab 100644 --- a/src/setups/mp_setuplip.c +++ b/src/setups/mp_setuplip.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuplue.c b/src/setups/mp_setuplue.c index 12b495cee..f35c40596 100644 --- a/src/setups/mp_setuplue.c +++ b/src/setups/mp_setuplue.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp1.c b/src/setups/mp_setupmp1.c index 3a2cf25b2..4330ff63a 100644 --- a/src/setups/mp_setupmp1.c +++ b/src/setups/mp_setupmp1.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -142,30 +142,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_start_lifts[] = { - activate_lift(1, 0x01) - activate_lift(2, 0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_21d4[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_21d4, 0x1000 }, - { func1001_start_lifts, 0x1001 }, - { NULL, 0 }, -}; - - - - - - diff --git a/src/setups/mp_setupmp10.c b/src/setups/mp_setupmp10.c index a8363ee98..353e2ded2 100644 --- a/src/setups/mp_setupmp10.c +++ b/src/setups/mp_setupmp10.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -115,30 +115,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_start_lifts[] = { - activate_lift(1, 0x00) - activate_lift(2, 0x01) - activate_lift(3, 0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_1680[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1680, 0x1000 }, - { func1001_start_lifts, 0x1001 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupmp11.c b/src/setups/mp_setupmp11.c index da1c2cd2e..3b44b1247 100644 --- a/src/setups/mp_setupmp11.c +++ b/src/setups/mp_setupmp11.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -139,21 +139,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_26fc[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_26fc, 0x1000 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupmp12.c b/src/setups/mp_setupmp12.c index 09c91e65e..5198f7652 100644 --- a/src/setups/mp_setupmp12.c +++ b/src/setups/mp_setupmp12.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -179,35 +179,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_start_lifts[] = { - activate_lift(1, 0x01) - activate_lift(2, 0x02) - activate_lift(3, 0x03) - activate_lift(4, 0x04) - activate_lift(5, 0x05) - activate_lift(6, 0x06) - activate_lift(7, 0x07) - activate_lift(8, 0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_3cc8[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_3cc8, 0x1000 }, - { func1001_start_lifts, 0x1001 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupmp13.c b/src/setups/mp_setupmp13.c index ae04dcb2c..392c1d79e 100644 --- a/src/setups/mp_setupmp13.c +++ b/src/setups/mp_setupmp13.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -106,19 +106,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_1368[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1368, 0x1000 }, - { NULL, 0 }, -}; - - - diff --git a/src/setups/mp_setupmp14.c b/src/setups/mp_setupmp14.c index 4ed802a11..236cc3993 100644 --- a/src/setups/mp_setupmp14.c +++ b/src/setups/mp_setupmp14.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -40,8 +40,3 @@ u8 unregistered_func1[] = { set_ailist(CHR_SELF, GAILIST_IDLE) endlist }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp15.c b/src/setups/mp_setupmp15.c index 3bf4ae759..746a92696 100644 --- a/src/setups/mp_setupmp15.c +++ b/src/setups/mp_setupmp15.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -144,29 +144,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_start_lift[] = { - activate_lift(1, 0x01) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_2400[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_2400, 0x1000 }, - { func1001_start_lift, 0x1001 }, - { NULL, 0 }, -}; - - - - - - diff --git a/src/setups/mp_setupmp16.c b/src/setups/mp_setupmp16.c index deb474881..b2c8a80eb 100644 --- a/src/setups/mp_setupmp16.c +++ b/src/setups/mp_setupmp16.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,16 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp17.c b/src/setups/mp_setupmp17.c index b5a35afd9..90d771a95 100644 --- a/src/setups/mp_setupmp17.c +++ b/src/setups/mp_setupmp17.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,24 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_0038[] = { - set_wind_speed(130) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_0044[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0044, 0x1000 }, - { func1001_0038, 0x1001 }, - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp18.c b/src/setups/mp_setupmp18.c index 4ee06e743..df1a91c8e 100644 --- a/src/setups/mp_setupmp18.c +++ b/src/setups/mp_setupmp18.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,17 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_0038[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0038, 0x1000 }, - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp19.c b/src/setups/mp_setupmp19.c index aaa6b4b2f..c14b496e5 100644 --- a/src/setups/mp_setupmp19.c +++ b/src/setups/mp_setupmp19.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,17 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_0038[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0038, 0x1000 }, - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp2.c b/src/setups/mp_setupmp2.c index bf2e43ea0..b827658df 100644 --- a/src/setups/mp_setupmp2.c +++ b/src/setups/mp_setupmp2.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,20 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - endlist -}; - -u8 unregistered_func2[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp20.c b/src/setups/mp_setupmp20.c index a806de67b..57193752a 100644 --- a/src/setups/mp_setupmp20.c +++ b/src/setups/mp_setupmp20.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,17 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_0038[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0038, 0x1000 }, - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp3.c b/src/setups/mp_setupmp3.c index 1cd892079..fe7cffa75 100644 --- a/src/setups/mp_setupmp3.c +++ b/src/setups/mp_setupmp3.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -135,28 +135,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_27e0[] = { - set_wind_speed(15) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_27ec[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_27ec, 0x1000 }, - { func1001_27e0, 0x1001 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupmp4.c b/src/setups/mp_setupmp4.c index 78d9999ed..29e11801c 100644 --- a/src/setups/mp_setupmp4.c +++ b/src/setups/mp_setupmp4.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -109,28 +109,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_1590[] = { - set_wind_speed(22) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_159c[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_159c, 0x1000 }, - { func1001_1590, 0x1001 }, - { NULL, 0 }, -}; - - - - - diff --git a/src/setups/mp_setupmp5.c b/src/setups/mp_setupmp5.c index 6d2a63fa1..0c7c67b25 100644 --- a/src/setups/mp_setupmp5.c +++ b/src/setups/mp_setupmp5.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -119,27 +119,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_1dc0[] = { - set_wind_speed(8) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_1dcc[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1dcc, 0x1000 }, - { func1001_1dc0, 0x1001 }, - { NULL, 0 }, -}; - - - - diff --git a/src/setups/mp_setupmp6.c b/src/setups/mp_setupmp6.c index b5c2fcd14..10c980ec1 100644 --- a/src/setups/mp_setupmp6.c +++ b/src/setups/mp_setupmp6.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,16 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp7.c b/src/setups/mp_setupmp7.c index d71ac84fd..66d97ebb0 100644 --- a/src/setups/mp_setupmp7.c +++ b/src/setups/mp_setupmp7.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,17 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_0038[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0038, 0x1000 }, - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp8.c b/src/setups/mp_setupmp8.c index eef5783b9..954b5d14f 100644 --- a/src/setups/mp_setupmp8.c +++ b/src/setups/mp_setupmp8.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,17 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_0038[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0038, 0x1000 }, - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupmp9.c b/src/setups/mp_setupmp9.c index bfc5dc238..265c89aff 100644 --- a/src/setups/mp_setupmp9.c +++ b/src/setups/mp_setupmp9.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -121,16 +121,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_1cf8[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1cf8, 0x1000 }, - { NULL, 0 }, -}; diff --git a/src/setups/mp_setupoat.c b/src/setups/mp_setupoat.c index b47e7e5df..b65877a22 100644 --- a/src/setups/mp_setupoat.c +++ b/src/setups/mp_setupoat.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -125,23 +125,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - endlist -}; - -u8 func1000_1c08[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1c08, 0x1000 }, - { NULL, 0 }, -}; - - - diff --git a/src/setups/mp_setupold.c b/src/setups/mp_setupold.c index 6e18b3f0c..1383d77a9 100644 --- a/src/setups/mp_setupold.c +++ b/src/setups/mp_setupold.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuppam.c b/src/setups/mp_setuppam.c index 0b3cc37fa..d4591cb1f 100644 --- a/src/setups/mp_setuppam.c +++ b/src/setups/mp_setuppam.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -37,12 +37,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_004c[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuppete.c b/src/setups/mp_setuppete.c index 885549b69..611733234 100644 --- a/src/setups/mp_setuppete.c +++ b/src/setups/mp_setuppete.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -57,7 +57,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; diff --git a/src/setups/mp_setupref.c b/src/setups/mp_setupref.c index 7ea6ba73b..3a0018d66 100644 --- a/src/setups/mp_setupref.c +++ b/src/setups/mp_setupref.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -123,24 +123,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - endlist -}; - -u8 func1000_1598[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_1598, 0x1000 }, - { NULL, 0 }, -}; - - - - diff --git a/src/setups/mp_setuprit.c b/src/setups/mp_setuprit.c index 5c6cc4738..0ade0e618 100644 --- a/src/setups/mp_setuprit.c +++ b/src/setups/mp_setuprit.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -37,12 +37,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_004c[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuprun.c b/src/setups/mp_setuprun.c index 82431fc23..1d0f20c2c 100644 --- a/src/setups/mp_setuprun.c +++ b/src/setups/mp_setuprun.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,21 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 unregistered_func1[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_func2[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupsev.c b/src/setups/mp_setupsev.c index 6a6701faf..7c672a244 100644 --- a/src/setups/mp_setupsev.c +++ b/src/setups/mp_setupsev.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupsevb.c b/src/setups/mp_setupsevb.c index ec826f8f5..eb43db343 100644 --- a/src/setups/mp_setupsevb.c +++ b/src/setups/mp_setupsevb.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupsevx.c b/src/setups/mp_setupsevx.c index 50770203a..7b882160a 100644 --- a/src/setups/mp_setupsevx.c +++ b/src/setups/mp_setupsevx.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupsho.c b/src/setups/mp_setupsho.c index d8b24c236..564330097 100644 --- a/src/setups/mp_setupsho.c +++ b/src/setups/mp_setupsho.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -28,10 +28,6 @@ s32 intro[] = { endintro }; -struct ailist ailists[] = { - { NULL, 0 }, -}; - struct path paths[] = { { NULL, 0, 0 }, }; diff --git a/src/setups/mp_setupsilo.c b/src/setups/mp_setupsilo.c index 56837031d..55aea9554 100644 --- a/src/setups/mp_setupsilo.c +++ b/src/setups/mp_setupsilo.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupstat.c b/src/setups/mp_setupstat.c index 011df9f00..8eb63d49e 100644 --- a/src/setups/mp_setupstat.c +++ b/src/setups/mp_setupstat.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setuptra.c b/src/setups/mp_setuptra.c index dea66e525..ce955a1e3 100644 --- a/src/setups/mp_setuptra.c +++ b/src/setups/mp_setuptra.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -31,8 +31,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupuff.c b/src/setups/mp_setupuff.c index 1c17ef24d..8c439d89b 100644 --- a/src/setups/mp_setupuff.c +++ b/src/setups/mp_setupuff.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/mp_setupwax.c b/src/setups/mp_setupwax.c index d9b039d75..1fbf0393c 100644 --- a/src/setups/mp_setupwax.c +++ b/src/setups/mp_setupwax.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupame.c b/src/setups/setupame.c index 56be7cb22..e8fa9c191 100644 --- a/src/setups/setupame.c +++ b/src/setups/setupame.c @@ -145,7 +145,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -1029,3108 +1029,6 @@ s32 path29[] = { -1, }; -/** - * @unused - */ -u8 func0401_do_some_animation[] = { - // Do some animation - restart_timer - chr_do_animation(ANIM_0066, 0, 1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) - - beginloop(0x08) - if_timer_gt(0, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - chr_do_animation(ANIM_0066, 1, -1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) - - beginloop(0x85) - endloop(0x85) - - // Unreachable - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func0402_guard_with_chrflag[] = { - set_returnlist(CHR_SELF, 0x0402) - set_self_chrflag(CHRCFLAG_00000200) - set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) - endlist -}; - -/** - * @unused - */ -u8 func0403_shielded_guard[] = { - set_shield(200) - set_self_chrflag(CHRCFLAG_00000200) - set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) - endlist -}; - -u8 func0404_init_hovercar[] = { - begin_hovercar_path(0) - set_vehicle_speed(0x0c00, 120) - - beginloop(0x04) - reloop(0x04) - - // Unreachable - label(0x08) - set_vehicle_speed(0x0600, 120) - reloop(0x04) - - label(0x09) - set_vehicle_speed(0x0700, 120) - reloop(0x04) - - label(0x0a) - set_vehicle_speed(0x0800, 120) - reloop(0x04) - - label(0x0b) - set_vehicle_speed(0x0900, 120) - reloop(0x04) - - label(0x0c) - set_vehicle_speed(0x0a00, 120) - reloop(0x04) - - label(0x0d) - set_vehicle_speed(0x0b00, 120) - reloop(0x04) - - label(0x0e) - set_vehicle_speed(0x0d00, 120) - endloop(0x04) - - endlist -}; - -#define do_path(path) \ - assign_path(path) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) \ - endlist - -u8 func0405_start_path26[] = { - do_path(26) -}; - -u8 func0406_start_path27[] = { - do_path(27) -}; - -u8 func0407_start_path28[] = { - do_path(28) -}; - -u8 func0408_start_path29[] = { - do_path(29) -}; - -u8 func0409_start_path30[] = { - do_path(30) -}; - -u8 func040a_start_path31[] = { - set_chr_dodge_rating(2, 20) - set_unarmeddodgerating(0) - set_accuracy(0) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_returnlist(CHR_SELF, 0x040a) - assign_path(31) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040b_start_path32[] = { - set_chr_dodge_rating(2, 20) - set_unarmeddodgerating(0) - set_accuracy(0) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(32) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040c_start_path33[] = { - set_chr_dodge_rating(2, 20) - set_unarmeddodgerating(0) - set_accuracy(0) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(33) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040d_start_path34[] = { - set_chr_dodge_rating(2, 20) - set_unarmeddodgerating(0) - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(34) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040e_start_path35[] = { - assign_path(35) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0410_init_cass[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_CASS) - endlist -}; - -u8 func040f_cass[] = { - set_shotlist(GAILIST_IDLE) - if_chr_dead(CHR_CASS, /*goto*/ 0x06) - if_chr_knockedout(CHR_CASS, /*goto*/ 0x06) - goto_next(0x2c) - - // Dying - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - // Wait for player to enter room - beginloop(0x59) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x5a) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x5a) - set_target_chr(CHR_BOND) - if_stage_flag_eq(STAGEFLAG_SECETARY_SAW_JO_OR_COOP, TRUE, /*goto*/ 0xbe) - endloop(0x59) - - label(0xbe) - if_stage_flag_eq(STAGEFLAG_SECRETARY_SAW_COOP, TRUE, /*goto*/ 0xbf) - set_target_chr(CHR_BOND) - goto_next(0x5a) - - label(0xbf) - set_target_chr(CHR_COOP) - goto_next(0x5a) - - // Face target chr (Jo or Velvet) - label(0x5a) - stop_chr - yield - unset_stage_flag(STAGEFLAG_SECETARY_SAW_JO_OR_COOP) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x5b) - - beginloop(0x5b) - if_chr_stopped(/*goto*/ 0x5c) - endloop(0x5b) - - label(0x5c) - speak(CHR_TARGET, L_AME_021, MP3_02F4, CHANNEL_6, COLOR_04_ORANGE) // "Who are you and what are you doing here?" - restart_timer - chr_do_animation(ANIM_TALKING_0098, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x5d) - if_sound_finished(CHANNEL_6, /*goto*/ 0x5e) - endloop(0x5d) - - // Walk backwards for 4 seconds - label(0x5e) - stop_chr - chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - restart_timer - - beginloop(0x5f) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x5f) - - label(0x06) - stop_chr - - // Face target again - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x64) - - beginloop(0x64) - if_target_in_fov_left(10, /*goto*/ 0x65) - if_timer_gt(90, /*goto*/ 0x65) - endloop(0x64) - - label(0x65) - restart_timer - if_can_see_target(/*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005b, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005c, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005d, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005e, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005f, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0060, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0061, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0062, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0064, /*goto*/ 0x2c) - goto_next(0x66) - - label(0x2c) - speak(CHR_TARGET, L_AME_023, MP3_02F5, CHANNEL_6, COLOR_04_ORANGE) // "You won't shoot me, foolish child!" - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x66) - if_sound_finished(CHANNEL_6, /*goto*/ 0x67) - endloop(0x66) - - label(0x67) - if_can_see_target(/*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005b, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005c, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005d, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005e, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005f, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0060, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0061, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0062, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0064, /*goto*/ 0x2c) - goto_next(0x68) - - label(0x2c) - chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - speak(CHR_TARGET, L_AME_024, MP3_02F6, CHANNEL_6, COLOR_04_ORANGE) // "Don't you know who I am?" - - beginloop(0x68) - if_sound_finished(CHANNEL_6, /*goto*/ 0x69) - endloop(0x68) - - label(0x69) - walk_to_pad(PAD_AME_004D) - - beginloop(0x60) - if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_AME_004D, /*goto*/ 0x06) - endloop(0x60) - - label(0x06) - walk_to_pad(PAD_AME_004E) - - beginloop(0x61) - if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_AME_004E, /*goto*/ 0x06) - endloop(0x61) - - label(0x06) - walk_to_pad(PAD_AME_0041) - - beginloop(0x62) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x62) - - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, 0x0042, /*goto*/ 0xb8) - - beginloop(0xb8) - if_timer_gt(60, /*goto*/ 0x63) - endloop(0xb8) - - label(0x63) - if_can_see_target(/*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005b, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005c, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005d, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005e, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x005f, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0060, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0061, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0062, /*goto*/ 0x2c) - if_chr_in_room(CHR_TARGET, 0x00, 0x0064, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - speak(CHR_TARGET, L_AME_025, MP3_02F7, CHANNEL_6, COLOR_04_ORANGE) // "Let's see how you deal with security." - label(0x06) - chr_do_animation(ANIM_PUSH_BUTTON, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x6a) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x6a) - - label(0x06) - activate_alarm - - label(0x6b) - stop_chr - yield - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x6c) - - beginloop(0x6c) - call_rng - if_rand_lt(250, /*goto*/ 0x06) - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x2c) - label(0x2c) - call_rng - if_distance_to_target_gt(500, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x6d) - label(0x06) - endloop(0x6c) - - label(0x6d) - restart_timer - say_quip(CHR_TARGET, 0x00, 0xff, 0x00, 0xff, BANK_1, 0x01, 0x04) // "How dare you disturb me","You will regret this intrusion girl","If I were you I'd leave, now" - chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x6e) - if_timer_gt(100, /*goto*/ 0x6f) - endloop(0x6e) - - label(0x6f) - restart_timer - - beginloop(0x70) - if_timer_gt(300, /*goto*/ 0x71) - endloop(0x70) - - label(0x71) - goto_first(0x6b) - - endlist -}; - -u8 func0412_init_secretary[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_SECRETARY) - endlist -}; - -u8 func0411_secretary[] = { - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_hiddenflag(CHR_SECRETARY, CHRHFLAG_00100000) - chr_move_to_pad(CHR_SECRETARY, PAD_AME_01C3, 0x00, /*goto*/ 0x2c) - label(0x2c) - stop_chr - label(0x06) - set_shotlist(GAILIST_IDLE) - if_chr_dead(CHR_SECRETARY, /*goto*/ 0x06) - if_chr_knockedout(CHR_SECRETARY, /*goto*/ 0x06) - goto_next(0x2c) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - chr_do_animation(ANIM_00A1, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x72) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x73) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x74) - set_target_chr(CHR_BOND) - endloop(0x72) - - label(0x74) - set_stage_flag(STAGEFLAG_SECRETARY_SAW_COOP) - label(0x73) - stop_chr - restart_timer - set_stage_flag(STAGEFLAG_SECETARY_SAW_JO_OR_COOP) - - beginloop(0x7a) - if_timer_gt(20, /*goto*/ 0x7b) - endloop(0x7a) - - label(0x7b) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x7c) - - beginloop(0x7c) - if_timer_lt(80, /*goto*/ 0x2c) - if_sound_finished(CHANNEL_6, /*goto*/ 0x7d) - label(0x2c) - endloop(0x7c) - - label(0x7d) - restart_timer - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x2c) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x2c) - speak(CHR_TARGET, L_AME_022, MP3_02ED, CHANNEL_5, COLOR_07_RED) // "Look out! She's got a gun." - label(0x2c) - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x75) - if_timer_gt(60, /*goto*/ 0x76) - endloop(0x75) - - label(0x76) - set_action(MA_PANIC, FALSE) - jog_to_pad(PAD_AME_0047) - - beginloop(0x77) - if_chr_stopped(/*goto*/ 0x78) - endloop(0x77) - - label(0x78) - chr_do_animation(ANIM_COWER_01F5, -1, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 20, CHR_SELF, 2) - - beginloop(0x79) - if_distance_to_target_gt(500, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x7e) - label(0x06) - endloop(0x79) - - label(0x7e) - restart_timer - chr_do_animation(ANIM_COWER_01F5, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - yield - goto_next(0x81) - - // Unreachable - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x7f) - - beginloop(0x7f) - if_target_in_fov_left(10, /*goto*/ 0x81) - if_timer_gt(120, /*goto*/ 0x81) - endloop(0x7f) - - label(0x81) - restart_timer - say_quip(CHR_TARGET, 0x01, 0xff, 0x00, 0xff, BANK_1, 0x02, 0x07) // "Please don't kill me","Don't shoot!" - chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x82) - if_timer_gt(180, /*goto*/ 0x83) - endloop(0x82) - - label(0x83) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - - beginloop(0x84) - call_rng - if_rand_gt(254, /*goto*/ 0x06) - endloop(0x84) - - label(0x06) - goto_first(0x78) - - endlist -}; - -u8 func0414_programmer[] = { -#define LABEL_JO_SPEAK 0x9c -#define LABEL_RUN_TO_GUARD 0xa5 -#define LABEL_NEAR_LAPTOPGUN_ROOM 0xa8 -#define LABEL_LOG_ON 0xaa -#define LABEL_PC_BROKEN 0xc5 - - // PA only - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - set_reaction_speed(100) - set_shotlist(AILIST_PROGRAMMER) - set_chr_chrflag(CHR_PROGRAMMER, CHRCFLAG_CANFACEWALL) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x2c) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - if_num_times_shot_lt(1, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_PROGRAMMER_INJURED) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x2c) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x2c) - if_sound_finished(CHANNEL_3, /*goto*/ 0x90) - goto_next(0x2c) - - label(0x90) - speak(CHR_TARGET, L_AME_053, MP3_02FE, CHANNEL_3, COLOR_03_RED) // "Don't shoot, don't shoot!" - label(0x2c) - restart_timer - - beginloop(0xab) - if_chr_stopped(/*goto*/ LABEL_JO_SPEAK) - endloop(0xab) - - // Hasn't been shot - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - stop_chr - - // Wait until Jo or Velvet near his office - beginloop(0x91) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) - if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, 80, 1240, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, 80, 1240, /*goto*/ 0x06) -#else - set_target_chr(CHR_BOND) - if_chr_distance_to_pad_lt(CHR_TARGET, 800, 124, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_chr_distance_to_pad_lt(CHR_TARGET, 800, 124, /*goto*/ 0x06) -#endif - endloop(0x91) - - // Phone ringing - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_4, OBJ_PCMONITOR, SFX_8109, 0x0f, 0x02) -#else - speak(CHR_TARGET, -1, SFX_8109, CHANNEL_4, COLOR_00_GREEN) -#endif - - // Wait until Jo or Velvet is close to his door - beginloop(0x92) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) - if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, PAD_AME_0014, 1240, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_chr_same_floor_distance_to_pad_lt(CHR_TARGET, PAD_AME_0014, 1240, /*goto*/ 0x06) -#else - set_target_chr(CHR_BOND) - if_chr_distance_to_pad_lt(CHR_TARGET, 200, 124, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_chr_distance_to_pad_lt(CHR_TARGET, 200, 124, /*goto*/ 0x06) -#endif - endloop(0x92) - - label(0x06) - restart_timer - - beginloop(0x8e) - if_timer_gt(40, /*goto*/ 0x2c) - endloop(0x8e) - - label(0x2c) - mute_channel(CHANNEL_4) // stop ringing - restart_timer - - beginloop(0x8f) - if_timer_gt(90, /*goto*/ 0x2c) - endloop(0x8f) - - // The timer in the following is dialogue is used to measure the gap between - // speaks. - label(0x2c) - restart_timer - speak(CHR_TARGET, L_AME_068, SFX_8104, CHANNEL_3, COLOR_03_RED) // "Yes, yes, I agree. Personality is expendable in th..." - restart_timer - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x08) - pause_timer - if_sound_finished(CHANNEL_3, /*goto*/ 0x06) - reloop(0x08) - - label(0x06) - resume_timer - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - yield - yield - yield - speak(CHR_TARGET, L_AME_069, SFX_8105, CHANNEL_3, COLOR_03_RED) // "No, I can start the process from my office termina..." - restart_timer - - beginloop(0x0e) - pause_timer - if_sound_finished(CHANNEL_3, /*goto*/ 0x06) - reloop(0x0e) - - label(0x06) - resume_timer - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - speak(CHR_TARGET, L_AME_070, SFX_8106, CHANNEL_3, COLOR_03_RED) // "I'll begin at once. Goodbye." - - beginloop(0x0f) - if_sound_finished(CHANNEL_3, /*goto*/ 0x06) - endloop(0x0f) - - label(0x06) - stop_chr - walk_to_pad(PAD_AME_0062) - restart_timer - - beginloop(0x09) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_stage_flag(STAGEFLAG_PROGRAMMER_WALKING) - label(0x06) - - label(0x99) - walk_to_pad(PAD_AME_0062) - - // While walking, check for anything that might cause him to detect Jo. - - // @bug The condition to jump to log on should be a distance check rather - // than chr stopped. If the programmer's pathing has failed then he will - // have stopped without being near the PC. This bug is repeated several - // times in this function but only documented here. - beginloop(0x93) - if_target_in_sight(/*goto*/ 0x96) - if_near_miss(/*goto*/ 0x96) - if_saw_injury(0x00, /*goto*/ 0x96) - if_saw_death(0x00, /*goto*/ 0x96) - if_hears_target(/*goto*/ 0x96) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_RAN_TO_GUARD, TRUE, /*goto*/ 0x2c) - if_sees_suspicious_item(/*goto*/ 0x96) - label(0x2c) - if_chr_stopped(/*goto*/ LABEL_LOG_ON) - endloop(0x93) - - // Detected Jo - label(0x96) - restart_timer - set_alertness(255) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x9a) - - beginloop(0x9a) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x9a) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x06) - speak(CHR_TARGET, L_AME_036, MP3_0300, CHANNEL_3, COLOR_03_RED) // "HELP - Intruder!" - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0xa3) - if_sound_finished(CHANNEL_3, /*goto*/ 0x06) - endloop(0xa3) - - label(0x06) - if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007d, /*goto*/ LABEL_NEAR_LAPTOPGUN_ROOM) - if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007e, /*goto*/ LABEL_NEAR_LAPTOPGUN_ROOM) - if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007f, /*goto*/ LABEL_NEAR_LAPTOPGUN_ROOM) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_INJURED, TRUE, /*goto*/ LABEL_JO_SPEAK) - - label(0xa2) - if_can_see_target(/*goto*/ 0x06) - goto_next(0x2c) - - // Can see Jo, and not injured or near Laptop Gun room - label(0x06) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_RAN_TO_GUARD, TRUE, /*goto*/ 0x06) - - label(0x2c) - speak(CHR_TARGET, L_AME_079, SFX_8107, CHANNEL_3, COLOR_03_RED) // "Security... Help me!" - goto_next(0xa1) - - label(0x06) - speak(CHR_TARGET, L_AME_038, SFX_8108, CHANNEL_3, COLOR_03_RED) // "HELP, HELP!" - label(0xa1) - restart_timer - set_stage_flag(STAGEFLAG_PROGRAMMER_RAN_TO_GUARD) - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ LABEL_RUN_TO_GUARD) - unset_object_flag2(OBJ_LAPTOPGUNDOOR, OBJFLAG2_AICANNOTUSE) - jog_to_pad(PAD_AME_0086) - - beginloop(0x97) - if_timer_lt(240, /*goto*/ 0x06) - if_can_see_target(/*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - if_distance_to_target_lt(300, /*goto*/ LABEL_JO_SPEAK) - label(0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x97) - - label(0x06) - set_stage_flag(STAGEFLAG_PROGRAMMER_INJURED) - restart_timer - unlock_door(OBJ_LAPTOPGUNDOOR, 0x02) - chr_do_animation(ANIM_COWER_01F5, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 16, CHR_SELF, 2) - - beginloop(0x0d) - if_timer_gt(300, /*goto*/ 0xb5) - if_distance_to_target_gt(300, /*goto*/ 0x2c) - if_can_see_target(/*goto*/ 0x06) - goto_next(0x2c) - label(0x06) - if_within_targets_fovx_by_angle(40, /*goto*/ LABEL_JO_SPEAK) - label(0x2c) - endloop(0x0d) - - label(0xb5) - goto_first(0x99) - - label(LABEL_RUN_TO_GUARD) - try_run_to_chr(CHR_PRESET, /*goto*/ 0xa6) - - beginloop(0xa6) - if_detected_chr(CHR_PRESET, /*goto*/ 0xa7) - if_timer_lt(120, /*goto*/ 0x06) - if_can_see_target(/*goto*/ LABEL_JO_SPEAK) - goto_next(0x06) - if_distance_to_target_lt(300, /*goto*/ LABEL_JO_SPEAK) - label(0x06) - if_chr_stopped(/*goto*/ 0xa7) - endloop(0xa6) - - label(0xa7) - speak(CHR_TARGET, L_AME_038, SFX_8108, CHANNEL_3, COLOR_03_RED) // "HELP, HELP!" - increase_squadron_alertness(100) - endloop(0x99) - - label(LABEL_JO_SPEAK) - restart_timer - if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x2c) - speak(CHR_TARGET, L_AME_072, MP3_0322, CHANNEL_3, COLOR_09_BLUE) // "I've got a password problem, and you're the man to..." - goto_next(0x06) - label(0x2c) - speak(CHR_TARGET, L_AME_071, MP3_0323, CHANNEL_3, COLOR_09_BLUE) // "Move it!" - label(0x06) - set_stage_flag(STAGEFLAG_TALKED_TO_PROGRAMMER) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x9b) - - beginloop(0x9b) - if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x06) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x9b) - - label(0x06) - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x10) - if_sound_finished(CHANNEL_3, /*goto*/ 0x06) - endloop(0x10) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_TALKED_TO_PROGRAMMER, TRUE, /*goto*/ 0x2c) - speak(CHR_TARGET, L_AME_035, MP3_02FF, CHANNEL_5, COLOR_03_RED) // "I'll do what you want!" - set_stage_flag(STAGEFLAG_TALKED_TO_PROGRAMMER) - goto_next(0x06) - label(0x2c) - speak(CHR_TARGET, L_AME_073, MP3_02FE, CHANNEL_5, COLOR_03_RED) // "Don't shoot, don't shoot!" - label(0x06) - chr_do_animation(ANIM_DONT_SHOOT, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x9f) - if_sound_finished(CHANNEL_5, /*goto*/ 0x9d) - endloop(0x9f) - - label(0x9d) - walk_to_pad(PAD_AME_0062) - - beginloop(0x9e) - if_chr_stopped(/*goto*/ LABEL_LOG_ON) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_INJURED, TRUE, /*goto*/ 0x06) - if_distance_to_target_lt(500, /*goto*/ 0x06) - if_within_targets_fovx_by_angle(40, /*goto*/ 0x06) - if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007d, /*goto*/ 0x06) - if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007e, /*goto*/ 0x06) - if_chr_in_room(CHR_PROGRAMMER, 0x00, 0x007f, /*goto*/ 0x06) - goto_next(0xa0) - label(0x06) - endloop(0x9e) - - label(0xa0) - goto_first(0xa2) - - label(LABEL_NEAR_LAPTOPGUN_ROOM) - stop_chr - speak(CHR_TARGET, L_AME_039, MP3_02FF, CHANNEL_3, COLOR_03_RED) // "I'll do what you want..." - restart_timer - label(0x06) - walk_to_pad(PAD_AME_0062) - - beginloop(0xa9) - if_chr_stopped(/*goto*/ LABEL_LOG_ON) - endloop(0xa9) - - label(LABEL_LOG_ON) - restart_timer - if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) - if_detected_chr(CHR_TARGET, /*goto*/ 0x2c) - speak(CHR_TARGET, L_AME_040, MP3_0301, CHANNEL_3, COLOR_03_RED) // "Logging on now..." - goto_next(0x06) - label(0x2c) - speak(CHR_TARGET, L_AME_109, MP3_0304, CHANNEL_3, COLOR_03_RED) // "I...I'm logging on now." - label(0x06) - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - speak(CHR_TARGET, -1, SFX_8116, -1, COLOR_00_GREEN) - - beginloop(0xae) - if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) - if_timer_gt(360, /*goto*/ 0x06) - endloop(0xae) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) - chr_do_animation(ANIM_PUSH_BUTTON, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - set_stage_flag(STAGEFLAG_PROGRAMMER_LOGGED_IN) - if_detected_chr(CHR_TARGET, /*goto*/ 0x2c) - speak(CHR_TARGET, L_AME_041, MP3_0302, CHANNEL_3, COLOR_03_RED) // "Okay, I'm in..." - goto_next(0x06) - label(0x2c) - speak(CHR_TARGET, L_AME_108, MP3_0305, CHANNEL_3, COLOR_03_RED) // "Right, I'm in..." - label(0x06) - speak(CHR_TARGET, -1, SFX_8117, -1, COLOR_00_GREEN) - - beginloop(0xaf) - if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) - if_chr_dead(CHR_SELF, /*goto*/ 0xb1) - if_timer_gt(1040, /*goto*/ 0x06) - endloop(0xaf) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ LABEL_PC_BROKEN) - set_stage_flag(STAGEFLAG_PERSONALITY_DELETED) - set_chr_maxdamage(CHR_SELF, 1) - chr_do_animation(ANIM_TALKING_003D, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - speak(CHR_TARGET, L_AME_042, MP3_0303, CHANNEL_3, COLOR_03_RED) // "Goodbye, Dr. Caroll." - if_stage_flag_eq(STAGEFLAG_DOWNLOAD_COMPLETE, TRUE, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_DELETED_WITHOUT_DOWNLOAD) - label(0x2c) - speak(CHR_TARGET, -1, SFX_TYPING_8118, -1, COLOR_00_GREEN) - - beginloop(0xb0) - endloop(0xb0) - - label(0xb1) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_PC_BROKEN) - set_self_flag_bankx(CHRFLAG0_CANT_ALERT_GROUP, BANK_0) - speak(CHR_TARGET, L_AME_098, MP3_SCI_YOU_VANDAL, CHANNEL_3, COLOR_03_RED) // "You vandal, you've broken it!" - do_preset_animation(PRESETANIM_TALKRANDOM) - - beginloop(0xc6) - if_sound_finished(CHANNEL_3, /*goto*/ 0x06) - endloop(0xc6) - - label(0x06) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * This function appears to be pointless considering you have control during the - * conversation anyway. Perhaps at one point during development there was a - * cutscene for the phone conversation? - */ -u8 func1005_give_control[] = { - beginloop(0x52) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_WALKING, TRUE, /*goto*/ 0x06) - endloop(0x52) - - label(0x06) - label(0x2c) - yield - grant_control(CHR_BOND) - grant_control(CHR_COOP) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func0415_set_idle[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func0413_c318[] = { - set_accuracy(10) - try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_squadron(SQUADRON_09) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) - set_alertness(255) - set_self_chrflag(CHRCFLAG_00000200) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) - endlist -}; - -u8 func100e_check_ecm_mines[] = { - yield -#if VERSION >= VERSION_NTSC_1_0 - yield - yield - yield - yield - yield - yield -#endif - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - give_object_to_chr(OBJ_ECMMINE_BOND, CHR_BOND) - give_object_to_chr(OBJ_ECMMINE_COOP, CHR_COOP) - label(0x06) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x00) - give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) - give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) - - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_SECURITYHUB_COMPLETE, TRUE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_SECURITYHUB_MINES_WASTED, TRUE, /*goto*/ 0x2c) - if_weapon_thrown_on_object(WEAPON_ECMMINE, OBJ_SECURITYHUB, /*goto*/ 0x08) - label(0x06) - if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_COMPLETE, TRUE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED, TRUE, /*goto*/ 0x2c) - if_weapon_thrown_on_object(WEAPON_ECMMINE, OBJ_EXTCOMMSHUB, /*goto*/ 0x0a) - label(0x06) - if_timer_gt(0, /*goto*/ 0x06) - if_weapon_thrown(WEAPON_ECMMINE, /*goto*/ 0x0b) - label(0x2c) - reloop(0x00) - - label(0x06) - if_timer_gt(240, /*goto*/ 0x53) - reloop(0x00) - - label(0x08) - reset_timer - show_hudmsg(CHR_BOND, L_AME_029) // "ECM Mine placed correctly." - yield - mute_channel(CHANNEL_0) - assign_sound(SFX_8113, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_SECURITYHUB, TRUE) - show_hudmsg(CHR_BOND, L_AME_076) // "Internal security system temporarily disabled." - set_stage_flag(STAGEFLAG_SECURITYHUB_COMPLETE) - reloop(0x00) - - label(0x0a) - reset_timer - show_hudmsg(CHR_BOND, L_AME_029) // "ECM Mine placed correctly." - yield - mute_channel(CHANNEL_1) - assign_sound(SFX_8113, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_EXTCOMMSHUB, TRUE) - show_hudmsg(CHR_BOND, L_AME_077) // "External communications hub disabled." - set_stage_flag(STAGEFLAG_EXTCOMMSHUB_COMPLETE) - reloop(0x00) - - label(0x0b) - restart_timer - reloop(0x00) - - // Check ECM mines wasted - label(0x53) - reset_timer - if_stage_flag_eq(STAGEFLAG_SECURITYHUB_COMPLETE, TRUE, /*goto*/ 0x88) - if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_COMPLETE, TRUE, /*goto*/ 0x89) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0xbe) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbe) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 2, /*goto*/ 0xbf) - reloop(0x00) - - label(0xbe) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xc0) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 2, /*goto*/ 0xc0) - reloop(0x00) - - label(0xbf) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xc0) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xc0) - reloop(0x00) - - label(0xc0) - goto_next(0x8d) - - // Security hub is complete - label(0x88) - if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_COMPLETE, TRUE, /*goto*/ 0x8a) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0xbe) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbe) - reloop(0x00) - - label(0xbe) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xbf) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbf) - reloop(0x00) - - label(0xbf) - goto_next(0x8b) - - // Comms hub is complete - label(0x89) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0xbe) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbe) - reloop(0x00) - - label(0xbe) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xbf) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0xbf) - reloop(0x00) - - // Mines wasted with security hub remaining - label(0xbf) - goto_next(0x06) - label(0x06) - set_stage_flag(STAGEFLAG_SECURITYHUB_MINES_WASTED) - goto_next(0x8c) - - // Mines wasted with comms hub remaining - label(0x8b) - set_stage_flag(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED) - - label(0x8c) - show_hudmsg(CHR_BOND, L_AME_028) // "Badly placed ECM Mine." - reloop(0x00) - - // Mines wasted with both hubs remaining - label(0x8d) - show_hudmsg(CHR_BOND, L_AME_028) // "Badly placed ECM Mine." - show_hudmsg(CHR_BOND, L_AME_032) // "CANNOT complete all objectives." - set_stage_flag(STAGEFLAG_SECURITYHUB_MINES_WASTED) - set_stage_flag(STAGEFLAG_EXTCOMMSHUB_MINES_WASTED) - reloop(0x00) - - // Both hubs are complete - label(0x8a) - endloop(0x00) - - beginloop(0x06) - endloop(0x06) - - endlist -}; - -u8 func1004_check_lab_lift_located[] = { - beginloop(0x52) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LABLIFTDOOR1, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LABLIFTDOOR2, /*goto*/ 0x2c) - if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x2c) - reloop(0x52) - - label(0x2c) - if_stage_flag_eq(STAGEFLAG_LAB_LIFT_LOCATED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_P1P2, L_AME_078) // "Laboratory lift located." - set_stage_flag(STAGEFLAG_LAB_LIFT_LOCATED) - label(0x2c) - yield - if_all_objectives_complete(/*goto*/ 0x2c) - endloop(0x52) - - label(0x2c) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func1006_check_programmer_dead[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - - beginloop(0x04) - if_chr_dead(CHR_PROGRAMMER, /*goto*/ 0x2c) - if_chr_knockedout(CHR_PROGRAMMER, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_LOGGED_IN, TRUE, /*goto*/ 0x06) - show_hudmsg(CHR_BOND, L_AME_057) // "Critical mission personnel killed." - set_stage_flag(STAGEFLAG_PROGRAMMER_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - label(0xac) - yield - goto_first(0x06) - - endlist -}; - -u8 func1007_uplinking[] = { - beginloop(0x04) - if_chr_activated_object(CHR_BOND, OBJ_PC, /*goto*/ 0xbe) - if_chr_activated_object(CHR_COOP, OBJ_PC, /*goto*/ 0xbf) - reloop(0x04) - - label(0xbe) - set_target_chr(CHR_BOND) - goto_next(0xc0) - - label(0xbf) - set_target_chr(CHR_COOP) - goto_next(0xc0) - - label(0xc0) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2c) - show_hudmsg(CHR_TARGET, L_AME_049) // "Unable to download - Data Uplink needed." - call_rng - if_rand_lt(60, /*goto*/ 0x0d) - if_rand_lt(120, /*goto*/ 0x0e) - if_rand_lt(180, /*goto*/ 0x0f) - - label(0x0c) - speak(CHR_TARGET, -1, SFX_8116, -1, COLOR_00_GREEN) - goto_next(0x06) - - label(0x0d) - speak(CHR_TARGET, -1, SFX_8117, -1, COLOR_00_GREEN) - goto_next(0x06) - - label(0x0e) - speak(CHR_TARGET, -1, SFX_TYPING_8118, -1, COLOR_00_GREEN) - goto_next(0x06) - - label(0x0f) - speak(CHR_TARGET, -1, SFX_TYPING_8118, -1, COLOR_00_GREEN) - - label(0x06) - restart_timer - - beginloop(0x10) - if_timer_gt(120, /*goto*/ 0x06) - goto_first(0x10) - - label(0x06) - reloop(0x04) - - label(0x2c) - if_stage_flag_eq(STAGEFLAG_PROGRAMMER_LOGGED_IN, TRUE, /*goto*/ 0xae) - restart_timer - show_hudmsg(CHR_TARGET, L_AME_046) // "ACCESS DENIED - password needed." - assign_sound(SFX_01C0, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_PC, FALSE) - - beginloop(0xaf) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0xaf) - - label(0x06) - mute_channel(CHANNEL_7) - goto_first(0x04) - - label(0xae) - show_hudmsg(CHR_TARGET, L_AME_044) // "File download initiated." - assign_sound(SFX_01BF, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_PC, TRUE) - restart_timer - - // @bug: Missing check for player still having uplink equipped - beginloop(0xac) - if_chr_distance_to_pad_gt(CHR_TARGET, 250, PAD_AME_01B6, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_DELETED_WITHOUT_DOWNLOAD, TRUE, /*goto*/ 0x12) - if_timer_gt(300, /*goto*/ 0xad) - endloop(0xac) - - label(0xad) - mute_channel(CHANNEL_7) - assign_sound(SFX_01C1, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_PC, TRUE) - show_hudmsg(CHR_TARGET, L_AME_045) // "File download completed." - yield - set_stage_flag(STAGEFLAG_DOWNLOAD_COMPLETE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - show_hudmsg(CHR_TARGET, L_AME_074) // "Datalink broken - connection terminated." - mute_channel(CHANNEL_7) - assign_sound(SFX_01C0, CHANNEL_6) - play_sound_from_object(CHANNEL_6, OBJ_PC, 1, 300, 400) - restart_timer - - beginloop(0x11) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x11) - - label(0x06) - mute_channel(CHANNEL_6) - reloop(0x04) - - label(0x12) - show_hudmsg(CHR_TARGET, L_AME_075) // "Datalink error - incomplete file download." - mute_channel(CHANNEL_7) - assign_sound(SFX_01C0, CHANNEL_6) - play_sound_from_object(CHANNEL_6, OBJ_PC, 1, 300, 400) - restart_timer - - beginloop(0x13) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x13) - - label(0x06) - mute_channel(CHANNEL_6) - endloop(0x04) - - endlist -}; - -u8 func1008_doorswitch[] = { - if_difficulty_gt(DIFF_SA, /*goto*/ 0x04) - - // A and SA - unlock_door(OBJ_OFFICEDOOR1, 0x01) - unlock_door(OBJ_OFFICEDOOR2, 0x01) - unset_object_flag2(OBJ_OFFICEDOOR1, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(OBJ_OFFICEDOOR2, OBJFLAG2_AICANNOTUSE) - set_stage_flag(STAGEFLAG_OFFICE_DOOR_UNLOCKED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // PA - beginloop(0x04) -#if VERSION >= VERSION_NTSC_1_0 - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_DOORSWITCH, /*goto*/ 0x2c) -#else - if_chr_activated_object(CHR_ANY, OBJ_DOORSWITCH, /*goto*/ 0x2c) -#endif - label(0x06) - endloop(0x04) - - label(0x2c) - play_sound(SFX_PRESS_SWITCH, -1) -#if VERSION >= VERSION_NTSC_1_0 - show_hudmsg(CHR_P1P2, L_AME_047) // "Door unlocked." -#else - show_hudmsg(CHR_BOND, L_AME_047) // "Door unlocked." -#endif - set_stage_flag(STAGEFLAG_OFFICE_DOOR_UNLOCKED) - unlock_door(OBJ_OFFICEDOOR1, 0x01) - unlock_door(OBJ_OFFICEDOOR2, 0x01) - unset_object_flag2(OBJ_OFFICEDOOR1, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(OBJ_OFFICEDOOR2, OBJFLAG2_AICANNOTUSE) - yield - restart_timer - - beginloop(0x08) - if_timer_gt(45, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - assign_sound(SFX_043B, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_OFFICEDOOR1, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_check_civilians_killed[] = { - beginloop(0x04) - if_chr_dead(CHR_SECRETARY, /*goto*/ 0x2c) - if_chr_dead(CHR_CASS, /*goto*/ 0x09) - label(0x06) - endloop(0x04) - - label(0x2c) - show_hudmsg(CHR_BOND, L_AME_055) // "Unacceptable civilian casualties." - set_stage_flag(STAGEFLAG_CIVILIANS_KILLED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x09) - show_hudmsg(CHR_BOND, L_AME_057) // "Critical mission personnel killed." - set_stage_flag(STAGEFLAG_CIVILIANS_KILLED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Wait for alarm while security is disabled, then set a flag on a CMP guard. - */ -u8 func100a_alarm_guard[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_SECURITY_DISABLED, FALSE, /*goto*/ 0x06) - if_alarm_active(/*goto*/ 0x2c) - label(0x06) - reloop(0x04) - - label(0x2c) - set_chr_flag_bankx(0x09, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - goto_next(0xb3) - - // Unreachable - label(0xac) - deactivate_alarm - reloop(0x04) - - label(0xb3) - label(0xb2) - endloop(0x04) - - endlist -}; - -u8 func100b_lightswitch[] = { - beginloop(0x04) - if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - play_sound(SFX_PRESS_SWITCH, -1) - if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x06) - - // Turning lights off - set_stage_flag(STAGEFLAG_LIGHTS_OFF) - set_lights_state(0x0044, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - reloop(0x04) - - // Turning lights on - label(0x06) - unset_stage_flag(STAGEFLAG_LIGHTS_OFF) - set_lights_state(0x0044, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - endloop(0x04) - - endlist -}; - -u8 func100c_noop2[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_PERSONALITY_DELETED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100d_check_objects_destroyed[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - // SA and PA - beginloop(0x04) - // Check security hub - if_stage_flag_eq(STAGEFLAG_SECURITYHUB_DESTROYED, TRUE, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_SECURITYHUB, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_SECURITYHUB_DESTROYED) - mute_channel(CHANNEL_0) - show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." - - // PA only - check door switch - label(0x2c) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_OFFICE_DOOR_UNLOCKED, TRUE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_DOORSWITCH_DESTROYED, TRUE, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_DOORSWITCH, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_DOORSWITCH_DESTROYED) - show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." - - // PA only - check PC - label(0x2c) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) - if_objective_complete(2, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_PC_DESTROYED, TRUE, /*goto*/ 0x2c) - if_objective_failed(2, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_PC, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_PC_DESTROYED) - show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." - - // Check comms hub - label(0x2c) - if_stage_flag_eq(STAGEFLAG_EXTCOMMSHUB_DESTROYED, TRUE, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_EXTCOMMSHUB, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_EXTCOMMSHUB_DESTROYED) - mute_channel(CHANNEL_1) - show_hudmsg(CHR_BOND, L_AME_054) // "Critical mission object destroyed." - label(0x2c) - endloop(0x04) - - // Agent - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_CASS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_SECRETARY, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PROGRAMMER, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -#define wait_for_camera_finished \ - beginloop(0x08) \ - if_camera_animating(/*goto*/ 0x2c) \ - goto_next(0x06) \ - label(0x2c) \ - if_controller_button_pressed(/*goto*/ 0x06) \ - endloop(0x08) - -u8 func041b_intro_041b[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_01) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP2) - set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_01, OBJ_JUMPSHIP2, 0x04, 0xffff) - enable_object(OBJ_POLICECAR) - set_object_flag3(OBJ_POLICECAR, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_01, OBJ_POLICECAR, 0x04, 0xffff) - enable_object(OBJ_HOVERCOP3) - set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_02, OBJ_HOVERCOP3, 0x04, 0xffff) - enable_object(OBJ_HOVERCAR3) - set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_03, OBJ_HOVERCAR3, 0x04, 0xffff) - enable_object(OBJ_HOVERMOTO3) - set_object_flag3(OBJ_HOVERMOTO3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_04, OBJ_HOVERMOTO3, 0x04, 0xffff) - enable_object(OBJ_HOVERCAB3) - set_object_flag3(OBJ_HOVERCAB3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_05, OBJ_HOVERCAB3, 0x04, 0xffff) - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP2) - disable_object(OBJ_POLICECAR) - disable_object(OBJ_HOVERCOP3) - disable_object(OBJ_HOVERCAR3) - disable_object(OBJ_HOVERMOTO3) - disable_object(OBJ_HOVERCAB3) - label(0x36) - return - endlist -}; - -u8 func041a_intro_041a[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_02) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP2) - set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_02, OBJ_JUMPSHIP2, 0x04, 0xffff) - enable_object(OBJ_HOVERTAXI2) - set_object_flag3(OBJ_HOVERTAXI2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_06, OBJ_HOVERTAXI2, 0x04, 0xffff) - enable_object(OBJ_HOVERCOP3) - set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_07, OBJ_HOVERCOP3, 0x04, 0xffff) - enable_object(OBJ_HOVERCAR3) - set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_08, OBJ_HOVERCAR3, 0x04, 0xffff) - enable_object(OBJ_HOVERMOTO3) - set_object_flag3(OBJ_HOVERMOTO3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_09, OBJ_HOVERMOTO3, 0x04, 0xffff) - enable_object(OBJ_HOVERCAB3) - set_object_flag3(OBJ_HOVERCAB3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_10, OBJ_HOVERCAB3, 0x04, 0xffff) - enable_object(OBJ_HOVERTRUCK3) - set_object_flag3(OBJ_HOVERTRUCK3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_11, OBJ_HOVERTRUCK3, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP2) - disable_object(OBJ_HOVERTAXI2) - disable_object(OBJ_HOVERCOP3) - disable_object(OBJ_HOVERCAR3) - disable_object(OBJ_HOVERMOTO3) - disable_object(OBJ_HOVERCAB3) - disable_object(OBJ_HOVERTRUCK3) - label(0x36) - return - endlist -}; - -u8 func0419_intro_0419[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_03) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP2) - set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_03, OBJ_JUMPSHIP2, 0x04, 0xffff) - enable_object(OBJ_HOVERTAXI1) - set_object_flag3(OBJ_HOVERTAXI1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_12, OBJ_HOVERTAXI1, 0x04, 0xffff) - enable_object(OBJ_HOVERCOP3) - set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_13, OBJ_HOVERCOP3, 0x04, 0xffff) - enable_object(OBJ_HOVERCAR3) - set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_14, OBJ_HOVERCAR3, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP2) - disable_object(OBJ_HOVERTAXI1) - disable_object(OBJ_HOVERCOP3) - disable_object(OBJ_HOVERCAR3) - label(0x36) - return - endlist -}; - -u8 func041c_intro_041c[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_04) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP2) - set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_04, OBJ_JUMPSHIP2, 0x04, 0xffff) - enable_object(OBJ_HOVERTAXI1) - set_object_flag3(OBJ_HOVERTAXI1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_15, OBJ_HOVERTAXI1, 0x04, 0xffff) - - // Invalid object - enable_object(0x1d) - set_object_flag3(0x1d, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_16, 0x1d, 0x04, 0xffff) - - enable_object(OBJ_HOVERCOP3) - set_object_flag3(OBJ_HOVERCOP3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_17, OBJ_HOVERCOP3, 0x04, 0xffff) - enable_object(OBJ_HOVERCAR3) - set_object_flag3(OBJ_HOVERCAR3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_18, OBJ_HOVERCAR3, 0x04, 0xffff) - enable_object(OBJ_HOVERMOTO3) - set_object_flag3(OBJ_HOVERMOTO3, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_19, OBJ_HOVERMOTO3, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP2) - disable_object(OBJ_HOVERTAXI1) - disable_object(0x1d) - disable_object(OBJ_HOVERCOP3) - disable_object(OBJ_HOVERCAR3) - disable_object(OBJ_HOVERMOTO3) - label(0x36) - return - endlist -}; - -/** - * Part of the intro cutscene. - */ -u8 func041d_intro_041d[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_05) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP2) - set_object_flag3(OBJ_JUMPSHIP2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_05, OBJ_JUMPSHIP2, 0x01, 0xffff) - enable_object(OBJ_HOVERTAXI1) - set_object_flag3(OBJ_HOVERTAXI1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_20, OBJ_HOVERTAXI1, 0x04, 0xffff) - enable_object(0x1d) - set_object_flag3(0x1d, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_VEHICLE_21, 0x1d, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP2) - disable_object(OBJ_HOVERTAXI1) - disable_object(0x1d) - label(0x36) - return - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function2[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO_041B) - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function3[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO_041A) - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function4[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO_0419) - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function5[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO_041C) - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function6[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO_041D) - endlist -}; - -/** - * This is the most ridiculous way of doing an intro cutscene. This is how all - * the ailists call each other: - * - * func0422_intro calls 041b with return to 041e - * 041e calls 041a with return to 041f - * 041f calls 0419 with return to 0420 - * 0420 calls 041c with return to 0421 - * 0421 calls 041d with return to 0428 - * 0428 does stuff then sets 0424 - * 0424 does stuff then sets 0425 - * 0425 does stuff then sets 0423 - * 0423 does stuff then sets 0426 - * 0426 does stuff then sets 0429 - * 0429 does stuff then sets 0427 - * 0427 does stuff then sets 042a - * 042a does stuff then sets 042b - * 042b does stuff then sets 042c - * 042c just sets 042d - * 042d finishes intro - */ -u8 func0422_intro[] = { -#if VERSION == VERSION_PAL_FINAL - yield - set_stage_flag(STAGEFLAG_TRIGGER_INTRO) - yield -#else - play_temporary_track(MUSIC_DEFECTION_INTRO_SFX) - - // No yield in this loop! - label(0x07) - if_music_event_queue_empty(16, /*goto*/ 0x2c) - configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) - goto_first(0x07) - - label(0x2c) -#if VERSION >= VERSION_NTSC_1_0 - yield -#endif - set_stage_flag(STAGEFLAG_TRIGGER_INTRO) - yield - play_cutscene_track(MUSIC_DEFECTION_INTRO) - - label(0x08) - if_music_event_queue_empty(1, /*goto*/ 0x2c) - configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) - goto_first(0x08) - - label(0x2c) -#endif - - set_returnlist(CHR_SELF, AILIST_INTRO_041E) - set_ailist(CHR_SELF, AILIST_INTRO_041B) - endlist -}; - -u8 func041e_intro_041e[] = { - set_returnlist(CHR_SELF, AILIST_INTRO_041F) - set_ailist(CHR_SELF, AILIST_INTRO_041A) - endlist -}; - -u8 func041f_intro_041f[] = { - set_returnlist(CHR_SELF, AILIST_INTRO_0420) - set_ailist(CHR_SELF, AILIST_INTRO_0419) - endlist -}; - -u8 func0420_intro_0420[] = { - set_returnlist(CHR_SELF, AILIST_INTRO_0421) - set_ailist(CHR_SELF, AILIST_INTRO_041C) - endlist -}; - -u8 func0421_intro_0421[] = { - set_returnlist(CHR_SELF, 0x0428) - set_ailist(CHR_SELF, AILIST_INTRO_041D) - endlist -}; - -u8 func0422_intro_0423[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_09) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_06, OBJ_JUMPSHIP1, 0x04, 0xffff) - set_tinted_glass_enabled(TRUE) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - set_tinted_glass_enabled(FALSE) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_0426) - endlist -}; - -u8 func0422_intro_0424[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_07) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_07, OBJ_JUMPSHIP1, 0x04, 0xffff) - set_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SECRETARY, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_SECRETARY, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_SECRETARY, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AME_INTRO_SEC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SECRETARY, 4) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_SECRETARY, CHRCFLAG_UNPLAYABLE) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_0425) - endlist -}; - -u8 func0422_intro_0425[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_08) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_08, OBJ_JUMPSHIP1, 0x04, 0xffff) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_01, OBJ_BANNER1, 0x04, 0xffff) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_01, OBJ_BANNER2, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - disable_object(OBJ_BANNER1) - disable_object(OBJ_BANNER2) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_0423) - endlist -}; - -u8 func0422_intro_0426[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_10) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_09, OBJ_JUMPSHIP1, 0x04, 0xffff) - enable_object(OBJ_BANNER1) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_02, OBJ_BANNER1, 0x04, 0xffff) - enable_object(OBJ_BANNER2) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_02, OBJ_BANNER2, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - disable_object(OBJ_BANNER1) - disable_object(OBJ_BANNER2) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_0429) - endlist -}; - -u8 func0422_intro_0427[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_12) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_10, OBJ_JUMPSHIP1, 0x04, 0xffff) - enable_object(OBJ_ROPE) - set_object_flag3(OBJ_ROPE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_ROPE_01, OBJ_ROPE, 0x04, 0xffff) - enable_object(OBJ_BANNER1) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_03, OBJ_BANNER1, 0x04, 0xffff) - enable_object(OBJ_BANNER2) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_03, OBJ_BANNER2, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - disable_object(OBJ_ROPE) - disable_object(OBJ_BANNER1) - disable_object(OBJ_BANNER2) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_042A) - endlist -}; - -u8 func0422_intro_0428[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_06) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_11, OBJ_JUMPSHIP1, 0x04, 0xffff) - set_object_flag2(OBJ_HOVERCOP1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERCOP2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERCAR1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERCAR2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERMOTO1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERMOTO2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERTRUCK1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERTRUCK2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERCAB1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_HOVERCAB2, OBJFLAG2_INVISIBLE) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - unset_object_flag2(OBJ_HOVERCOP1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERCOP2, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERCAR1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERCAR2, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERMOTO1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERMOTO2, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERTRUCK1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERTRUCK2, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERCAB1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_HOVERCAB2, OBJFLAG2_INVISIBLE) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_0424) - endlist -}; - -u8 func0422_intro_0429[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_11) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_12, OBJ_JUMPSHIP1, 0x04, 0xffff) - set_tinted_glass_enabled(TRUE) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - set_tinted_glass_enabled(FALSE) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_0427) - endlist -}; - -u8 func0422_intro_042a[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_13) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_13, OBJ_JUMPSHIP1, 0x04, 0xffff) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AME_INTRO_JO_09, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_hudpiece_visible(CHR_BOND, TRUE) - enable_object(OBJ_ROPE) - set_object_flag3(OBJ_ROPE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_ROPE_02, OBJ_ROPE, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - disable_object(OBJ_ROPE) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_042B) - endlist -}; - -u8 func0422_intro_042b[] = { - if_controller_button_pressed(/*goto*/ 0x36) - camera_movement(ANIM_CUT_AME_INTRO_CAM_14) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enable_object(OBJ_JUMPSHIP1) - set_object_flag3(OBJ_JUMPSHIP1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_DROPSHIP_14, OBJ_JUMPSHIP1, 0x04, 0xffff) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AME_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_hudpiece_visible(CHR_BOND, TRUE) - enable_object(OBJ_ROPE) - set_object_flag3(OBJ_ROPE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_ROPE_03, OBJ_ROPE, 0x04, 0xffff) - enable_object(OBJ_BANNER1) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_04, OBJ_BANNER1, 0x04, 0xffff) - enable_object(OBJ_BANNER2) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_04, OBJ_BANNER2, 0x04, 0xffff) - - wait_for_camera_finished - - label(0x06) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - disable_object(OBJ_JUMPSHIP1) - disable_object(OBJ_ROPE) - disable_object(OBJ_BANNER1) - disable_object(OBJ_BANNER2) - label(0x36) - set_ailist(CHR_SELF, AILIST_INTRO_042C) - endlist -}; - -u8 func0422_intro_042c[] = { - set_ailist(CHR_SELF, AILIST_INTRO_042D) - endlist -}; - -u8 func0422_intro_042d[] = { - camera_movement(ANIM_CUT_AME_INTRO_CAM_15) - cmd0175(60) - if_controller_button_pressed(/*goto*/ 0x36) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AME_INTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_hudpiece_visible(CHR_BOND, FALSE) - - wait_for_camera_finished - - label(0x06) - label(0x36) - enable_object(OBJ_BANNER1) - enable_object(OBJ_BANNER2) - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER1_05, OBJ_BANNER1, 0x08, 0xffff) - - // @bug: Copy/paste error - should be banner 2 - set_object_flag3(OBJ_BANNER1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AME_INTRO_BANNER2_05, OBJ_BANNER2, 0x08, 0xffff) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AME_INTRO_JO_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - set_chr_hudpiece_visible(CHR_BOND, FALSE) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - set_ailist(CHR_SECRETARY, AILIST_INIT_SECRETARY) - enter_firstperson - set_stage_flag(STAGEFLAG_STOP_INTRO) - restart_timer - - beginloop(0x09) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - stop_cutscene_track - stop_ambient_track - set_savefile_flag(GAMEFILEFLAG_CI_TOUR_DONE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0416_outro_from_menu[] = { - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func0416_outro[] = { - camera_movement(ANIM_CUT_AME_OUTRO_CAM) - play_cutscene_track(MUSIC_DEFECTION_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AME_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - restart_timer - unset_stage_flag(STAGEFLAG_LAB_ELEVATOR_CLOSED) - set_door_open(OBJ_LABLIFTDOOR1) - set_door_open(OBJ_LABLIFTDOOR2) - restart_timer - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_FALCON2_SILENCER, WEAPON_NONE) - show_nonessential_chrs(FALSE) - - beginloop(0xb6) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0xb6) - - label(0x06) - play_sound(SFX_0165, CHANNEL_10) - - beginloop(0xb7) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(110, /*goto*/ 0x06) - endloop(0xb7) - - label(0x06) - play_sound(SFX_0167, CHANNEL_10) - - beginloop(0xb8) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(123, /*goto*/ 0x06) - endloop(0xb8) - - label(0x06) - play_sound(SFX_01DC, CHANNEL_10) - - beginloop(0xb9) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(215, /*goto*/ 0x06) - endloop(0xb9) - - label(0x06) - play_sound(SFX_01D8, CHANNEL_10) - - beginloop(0xba) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(245, /*goto*/ 0x06) - endloop(0xba) - - label(0x06) - play_sound(SFX_01DA, CHANNEL_10) - - beginloop(0xbb) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(250, /*goto*/ 0x06) - endloop(0xbb) - - label(0x06) - play_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_10) - - beginloop(0xbc) - if_controller_button_pressed(/*goto*/ 0xbd) - if_timer_gt(285, /*goto*/ 0x06) - endloop(0xbc) - - label(0x06) - play_sound(SFX_01DB, CHANNEL_10) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0xbd) - - label(0x2c) - if_controller_button_pressed(/*goto*/ 0xbd) - if_stage_flag_eq(STAGEFLAG_LAB_ELEVATOR_CLOSED, TRUE, /*goto*/ 0x2c) - if_timer_lt(336, /*goto*/ 0x2c) - close_door(OBJ_LABLIFTDOOR1) - close_door(OBJ_LABLIFTDOOR2) - set_stage_flag(STAGEFLAG_LAB_ELEVATOR_CLOSED) - label(0x2c) - endloop(0x08) - - label(0xbd) - mute_channel(CHANNEL_10) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1000_rebuild_groups[] = { - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1401_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func100f_check_necklace_collected[] = { - beginloop(0x04) - if_chr_has_object(CHR_BOND, OBJ_NECKLACE, /*goto*/ 0x2c) - if_chr_has_object(CHR_COOP, OBJ_NECKLACE, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_start_intro[] = { - set_ailist(CHR_SELF, AILIST_INTRO) - endlist -}; - -u8 func1010_start_hub_humms[] = { - yield -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_0, OBJ_SECURITYHUB, SFX_8111, 0x0f, 0x02) - yield - play_sound_from_object2(CHANNEL_1, OBJ_EXTCOMMSHUB, SFX_8111, 0x0f, 0x02) -#else - play_sound_from_object2(CHANNEL_0, OBJ_SECURITYHUB, SFX_8111, 0x0f, 0x00) - yield - play_sound_from_object2(CHANNEL_1, OBJ_SECURITYHUB, SFX_0004, 0x0f, 0x00) -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_check_hubs_activated[] = { - beginloop(0x04) - if_chr_activated_object(CHR_ANY, OBJ_SECURITYHUB, /*goto*/ 0x08) - if_chr_activated_object(CHR_ANY, OBJ_EXTCOMMSHUB, /*goto*/ 0x0a) - reloop(0x04) - - label(0x08) - show_hudmsg(CHR_BOND, L_AME_080) // "ECM Mine needed to disable security hub." - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x0a) - show_hudmsg(CHR_BOND, L_AME_081) // "ECM Mine needed to disable comms hub." - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1012_trigger_x_music[] = { - // Wait until arriving at bottom floor - beginloop(0x04) - if_camera_animating(/*goto*/ 0x2c) - if_chr_y(CHR_BOND, -8000, OPERATOR_LESS_THAN, /*goto*/ 0x06) - if_chr_y(CHR_COOP, -8000, OPERATOR_LESS_THAN, /*goto*/ 0x06) - label(0x2c) - endloop(0x04) - - // This stage flag check seems a bit weird, but it makes sense if Rare were - // testing the outro in isolation of the rest of the stage. They obviously - // didn't want the X music playing during the outro while testing. Note that - // the flag is only set during the outro cutscene, not during gameplay. - label(0x06) - if_stage_flag_eq(STAGEFLAG_LAB_ELEVATOR_CLOSED, TRUE, /*goto*/ 0x2c) - play_x_track(XREASON_DEFAULT, 10, 60) - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_guard(accuracy, health) \ - set_chr_dodge_rating(2, 20) \ - set_unarmeddodgerating(0) \ - set_accuracy(accuracy) \ - set_reaction_speed(0) \ - set_chr_maxdamage(CHR_SELF, health) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) - -u8 func0417_init_dd_guard[] = { - init_guard(0, 40) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0418_init_shock_guard[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x2c) - - // Agent - init_guard(10, 40) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - // SA and PA - label(0x2c) - init_guard(20, 40) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0430_init_falcon_guard[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x2c) - - // Agent - init_guard(20, 40) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - // SA and PA - label(0x2c) - init_guard(30, 60) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1013_msg_commshubnearby[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - beginloop(0x04) - if_chr_y(CHR_BOND, -770, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0039, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - speak(CHR_BOND, L_AME_093, SFX_8170, CHANNEL_6, COLOR_09_BLUE) // "We're getting a positive reading - the internal co..." - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_msg_officefloor[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x0054, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0064, /*goto*/ 0x0d) - endloop(0x04) - - label(0x2c) - speak(CHR_BOND, L_AME_094, SFX_8171, CHANNEL_6, COLOR_09_BLUE) // "You're on the same floor as Cassandra's office." - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_msg_securityroom[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x0025, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - speak(CHR_BOND, L_AME_095, MP3_03A2, CHANNEL_6, COLOR_09_BLUE) // "The other hub has got to be in the Security Room." - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_msg_basementelevator[] = { - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x002c, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - speak(CHR_BOND, L_AME_096, SFX_8172, CHANNEL_6, COLOR_09_BLUE) // "The basement elevator must be around there somewhe..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_unlock_basement_door[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Agent only - unlock basement door (SA and PA requires necklace) - label(0x2c) - unlock_door(OBJ_SECRETDOOR, 0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Rare used stage flags to trigger the intro cutscene to restart. - */ -u8 func0422_intro_speaking[] = { - label(0xbe) - if_stage_flag_eq(STAGEFLAG_TRIGGER_INTRO, TRUE, /*goto*/ 0xbf) - yield - goto_first(0xbe) - - label(0xbf) - unset_stage_flag(STAGEFLAG_TRIGGER_INTRO) - restart_timer - -#if VERSION == VERSION_PAL_FINAL - beginloop(0xb7) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2c) - endloop(0xb7) - - label(0x2c) - play_temporary_track(MUSIC_DEFECTION_INTRO_SFX) - - // No yield in this loop! - label(0xb8) - if_music_event_queue_empty(16, /*goto*/ 0x2c) - configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) - goto_first(0xb8) - - label(0x2c) - play_cutscene_track(MUSIC_DEFECTION_INTRO) - - label(0xb9) - if_music_event_queue_empty(1, /*goto*/ 0x2c) - configure_environment(0x0000, AIENVCMD_TICKMUSICQUEUE, 0) - goto_first(0xb9) - - label(0x2c) -#endif - - beginloop(0xb6) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_timer_gt(700, /*goto*/ 0x2c) - endloop(0xb6) - - label(0x2c) - speak(CHR_BOND, L_AME_100, MP3_03E4, CHANNEL_6, COLOR_09_BLUE) // "Why the big hurry?" - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - speak(CHR_BOND, L_AME_101, MP3_03E5, CHANNEL_6, COLOR_06_WHITE) // "If Dr. Caroll is not extracted tonight, dataDyne w..." - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x09) - - label(0x2c) - speak(CHR_BOND, L_AME_102, MP3_03E6, CHANNEL_6, COLOR_09_BLUE) // "Are they all expendable?" - - beginloop(0x0a) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x0a) - - label(0x2c) - speak(CHR_BOND, L_AME_103, MP3_03E7, CHANNEL_6, COLOR_06_WHITE) // "Don't joke! You have to be careful, Joanna. Code k..." - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x0b) - - label(0x2c) - speak(CHR_BOND, L_AME_104, MP3_03E8, CHANNEL_6, COLOR_09_BLUE) // "What's the target location?" - - beginloop(0x0c) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x0c) - - label(0x2c) - speak(CHR_BOND, L_AME_105, MP3_03E9, CHANNEL_6, COLOR_06_WHITE) // "Work your way down the building to the ground leve..." - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x0d) - - label(0x2c) - speak(CHR_BOND, L_AME_106, MP3_03EA, CHANNEL_6, COLOR_09_BLUE) // "How will I recognize him?" - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x0e) - - label(0x2c) - speak(CHR_BOND, L_AME_107, MP3_03EB, CHANNEL_6, COLOR_06_WHITE) // "We don't have an image record, and we can't find a..." - - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_STOP_INTRO, TRUE, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x0f) - - label(0x2c) - label(0x06) - mute_channel(CHANNEL_6) - goto_first(0xbe) - - endlist -}; - -/** - * Hide guards, then unhide then once you pass below -2000. This is likely the - * first staircase between the light switch room and Cass's office floor. - */ -u8 func1019_toggle_guards[] = { - label(0x2c) - disable_chr(0x01) - disable_chr(0x02) - disable_chr(0x0e) - disable_chr(0x12) - disable_chr(0x0f) - disable_chr(0x10) - disable_chr(0x11) - disable_chr(0x13) - disable_chr(0x03) - disable_chr(0x04) - disable_chr(0x14) - disable_chr(0x15) - disable_chr(0x16) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -2000, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - enable_chr(0x01) - yield - enable_chr(0x02) - yield - enable_chr(0x0e) - yield - enable_chr(0x12) - yield - enable_chr(0x0f) - yield - enable_chr(0x10) - yield - enable_chr(0x11) - yield - enable_chr(0x13) - yield - enable_chr(0x03) - yield - enable_chr(0x04) - yield - enable_chr(0x14) - yield - enable_chr(0x15) - yield - enable_chr(0x16) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_noop[] = { - yield - yield - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func141c_start_lifts[] = { - activate_lift(2, OBJ_LIFT1) - activate_lift(1, OBJ_LIFT2) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_disable_cameras[] = { - // Check security hub objective - beginloop(0xc4) - if_objective_complete(0, /*goto*/ 0x2c) - endloop(0xc4) - - label(0x2c) - set_object_flag(OBJ_CAMERA1, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CAMERA2, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CAMERA3, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CAMERA4, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CAMERA5, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CAMERA6, OBJFLAG_DEACTIVATED) - set_stage_flag(STAGEFLAG_SECURITY_DISABLED) - restart_timer - - // @bug: If you disable the security (bottom floor), then activate the alarm - // before the 2 minute timer expires (eg. by getting Cass to activate it), - // then the first camera is never reactivated. The if_alarm_active check - // should go to 0x2c instead. - beginloop(0x08) - if_alarm_active(/*goto*/ 0x06) - if_timer_gt(7200, /*goto*/ 0x2c) - endloop(0x08) - - // 2 minutes elapsed - label(0x2c) - if_object_in_good_condition(OBJ_CAMERA1, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - unset_object_flag(OBJ_CAMERA1, OBJFLAG_DEACTIVATED) - - label(0x06) - if_object_in_good_condition(OBJ_CAMERA2, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - unset_object_flag(OBJ_CAMERA2, OBJFLAG_DEACTIVATED) - - label(0x06) - if_object_in_good_condition(OBJ_CAMERA3, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - unset_object_flag(OBJ_CAMERA3, OBJFLAG_DEACTIVATED) - - label(0x06) - if_object_in_good_condition(OBJ_CAMERA4, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - unset_object_flag(OBJ_CAMERA4, OBJFLAG_DEACTIVATED) - - label(0x06) - if_object_in_good_condition(OBJ_CAMERA5, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - unset_object_flag(OBJ_CAMERA5, OBJFLAG_DEACTIVATED) - - label(0x06) - if_object_in_good_condition(OBJ_CAMERA6, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - unset_object_flag(OBJ_CAMERA6, OBJFLAG_DEACTIVATED) - - label(0x06) - show_hudmsg(CHR_BOND, L_AME_097) // "Security system is now back online." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unregistered - */ -u8 unregistered_function7[] = { - show_hudmsg(CHR_BOND, L_AME_099) // "2023 AD, 2214 Hours Lucerne Tower - dataDyne HQ" - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_lift_door_sounds[] = { - beginloop(0xc4) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR1, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR2, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR3, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT1DOOR4, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR1, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR2, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR3, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT2DOOR4, /*goto*/ 0x2c) - reloop(0xc4) - - label(0x2c) - play_sound(SFX_DOOR_81B0, -1) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - endloop(0xc4) - - endlist -}; - -/** - * @unused - */ -u8 func042e_init_surrendering_guard[] = { - label(0xc4) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_SURRENDERING_GUARD) - endlist -}; - -/** - * @unused - */ -u8 func042f_surrendering_guard[] = { - // Wait for player detection - beginloop(0xc4) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x2c) - if_enemy_distance_lt_and_los(500, /*goto*/ 0x2c) - if_near_miss(/*goto*/ 0x2c) - if_saw_injury(0x00, /*goto*/ 0x2c) - endloop(0xc4) - - // Be surprised - label(0x2c) - say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) - - // Wait 1 second - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x54) - goto_next(0x55) - - label(0x54) - try_run_to_chr(CHR_PRESET, /*goto*/ 0x56) - - beginloop(0x56) - if_distance_to_target_gt(300, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x28) - label(0x06) - if_chr_death_animation_finished(CHR_PRESET, /*goto*/ 0x55) - if_chr_knockedout(CHR_PRESET, /*goto*/ 0x55) - if_detected_chr(CHR_PRESET, /*goto*/ 0x57) - if_chr_stopped(/*goto*/ 0x57) - endloop(0x56) - - // Warn - label(0x57) - say_quip(CHR_BOND, QUIP_WARNFRIENDS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - increase_squadron_alertness(100) - - // No chr in same group, or follow through from above - // Wait until player in range and then surrender. - beginloop(0x55) - if_distance_to_target_gt(300, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x28) - label(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x58) - endloop(0x55) - - label(0x58) - restart_timer - retreat(GOPOSFLAG_RUN, 2) - - beginloop(0x0a) - if_distance_to_target_gt(300, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x28) - label(0x06) - if_timer_gt(600, /*goto*/ 0x2c) - endloop(0x0a) - - label(0x2c) - stop_chr - goto_first(0x55) - - // Surrender - label(0x28) - surrender - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_setup_rtracker[] = { - yield - set_object_flag3(OBJ_FALCONSIL1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_FALCONSIL2, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_LAPTOPGUN, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1420_setup_portals[] = { - yield - set_portal_flag(0x008e, PORTALFLAG_SKIP) - set_portal_flag(0x008f, PORTALFLAG_SKIP) - set_portal_flag(0x0084, PORTALFLAG_SKIP) - set_portal_flag(0x0090, PORTALFLAG_SKIP) - set_portal_flag(0x0091, PORTALFLAG_SKIP) - set_portal_flag(0x0093, PORTALFLAG_SKIP) - set_portal_flag(0x0096, PORTALFLAG_SKIP) - set_portal_flag(0x0095, PORTALFLAG_SKIP) - set_portal_flag(0x0099, PORTALFLAG_SKIP) - set_portal_flag(0x00b6, PORTALFLAG_SKIP) - set_portal_flag(0x00bf, PORTALFLAG_SKIP) - set_portal_flag(0x00be, PORTALFLAG_SKIP) - set_portal_flag(0x00c0, PORTALFLAG_SKIP) - set_portal_flag(0x00c2, PORTALFLAG_SKIP) - set_portal_flag(0x00c4, PORTALFLAG_SKIP) - set_portal_flag(0x00c8, PORTALFLAG_SKIP) - set_portal_flag(0x00c7, PORTALFLAG_SKIP) - set_portal_flag(0x00c9, PORTALFLAG_SKIP) - set_portal_flag(0x00cd, PORTALFLAG_SKIP) - set_portal_flag(0x00ce, PORTALFLAG_SKIP) - set_portal_flag(0x00d2, PORTALFLAG_SKIP) - set_portal_flag(0x00e0, PORTALFLAG_SKIP) - set_portal_flag(0x00dc, PORTALFLAG_SKIP) - set_portal_flag(0x00de, PORTALFLAG_SKIP) - set_portal_flag(0x00e3, PORTALFLAG_SKIP) - set_portal_flag(0x00e5, PORTALFLAG_SKIP) - set_portal_flag(0x00e7, PORTALFLAG_SKIP) - set_portal_flag(0x00fb, PORTALFLAG_SKIP) - set_portal_flag(0x00fa, PORTALFLAG_SKIP) - set_portal_flag(0x00fc, PORTALFLAG_SKIP) - set_portal_flag(0x00ff, PORTALFLAG_SKIP) - set_portal_flag(0x0100, PORTALFLAG_SKIP) - set_portal_flag(0x0103, PORTALFLAG_SKIP) - set_portal_flag(0x0102, PORTALFLAG_SKIP) - set_portal_flag(0x0104, PORTALFLAG_SKIP) - set_portal_flag(0x0109, PORTALFLAG_SKIP) - set_portal_flag(0x010c, PORTALFLAG_SKIP) - set_portal_flag(0x0119, PORTALFLAG_SKIP) - set_portal_flag(0x0112, PORTALFLAG_SKIP) - set_portal_flag(0x0117, PORTALFLAG_SKIP) - set_portal_flag(0x0120, PORTALFLAG_SKIP) - set_portal_flag(0x011e, PORTALFLAG_SKIP) - set_portal_flag(0x011c, PORTALFLAG_SKIP) - set_portal_flag(0x0108, PORTALFLAG_SKIP) - set_portal_flag(0x006f, PORTALFLAG_SKIP) - set_portal_flag(0x007d, PORTALFLAG_SKIP) - set_portal_flag(0x0080, PORTALFLAG_SKIP) - set_portal_flag(0x0081, PORTALFLAG_SKIP) - set_portal_flag(0x0075, PORTALFLAG_SKIP) - set_portal_flag(0x0078, PORTALFLAG_SKIP) - set_portal_flag(0x0079, PORTALFLAG_SKIP) - set_portal_flag(0x0006, PORTALFLAG_SKIP) - set_portal_flag(0x0004, PORTALFLAG_SKIP) - set_portal_flag(0x0008, PORTALFLAG_SKIP) - set_portal_flag(0x000a, PORTALFLAG_SKIP) - set_portal_flag(0x0001, PORTALFLAG_SKIP) - set_portal_flag(0x0005, PORTALFLAG_SKIP) - set_portal_flag(0x0000, PORTALFLAG_SKIP) - set_portal_flag(0x0003, PORTALFLAG_SKIP) - set_portal_flag(0x0007, PORTALFLAG_SKIP) - set_portal_flag(0x0013, PORTALFLAG_SKIP) - set_portal_flag(0x0009, PORTALFLAG_SKIP) - set_portal_flag(0x00b1, PORTALFLAG_SKIP) - set_portal_flag(0x00ef, PORTALFLAG_SKIP) - set_portal_flag(0x00ee, PORTALFLAG_SKIP) - set_portal_flag(0x0121, PORTALFLAG_SKIP) - set_portal_flag(0x00e8, PORTALFLAG_SKIP) - set_portal_flag(0x00e9, PORTALFLAG_SKIP) - set_portal_flag(0x00ea, PORTALFLAG_SKIP) - set_portal_flag(0x00ec, PORTALFLAG_SKIP) - set_portal_flag(0x00eb, PORTALFLAG_SKIP) - set_portal_flag(0x00ed, PORTALFLAG_SKIP) - set_portal_flag(0x009d, PORTALFLAG_SKIP) - set_portal_flag(0x00af, PORTALFLAG_SKIP) - set_portal_flag(0x00a1, PORTALFLAG_SKIP) - set_portal_flag(0x005a, PORTALFLAG_SKIP) - set_portal_flag(0x005c, PORTALFLAG_SKIP) - set_portal_flag(0x005d, PORTALFLAG_SKIP) - set_portal_flag(0x0060, PORTALFLAG_SKIP) - set_portal_flag(0x0034, PORTALFLAG_SKIP) - set_portal_flag(0x0030, PORTALFLAG_SKIP) - set_portal_flag(0x002e, PORTALFLAG_SKIP) - set_portal_flag(0x002b, PORTALFLAG_SKIP) - set_portal_flag(0x0028, PORTALFLAG_SKIP) - set_portal_flag(0x0025, PORTALFLAG_SKIP) - set_portal_flag(0x0036, PORTALFLAG_SKIP) - set_portal_flag(0x0038, PORTALFLAG_SKIP) - set_portal_flag(0x004f, PORTALFLAG_SKIP) - set_portal_flag(0x0051, PORTALFLAG_SKIP) - set_portal_flag(0x0052, PORTALFLAG_SKIP) - set_portal_flag(0x0057, PORTALFLAG_SKIP) - set_portal_flag(0x0058, PORTALFLAG_SKIP) - set_portal_flag(0x0031, PORTALFLAG_SKIP) - set_portal_flag(0x002f, PORTALFLAG_SKIP) - set_portal_flag(0x0023, PORTALFLAG_SKIP) - set_portal_flag(0x00a6, PORTALFLAG_SKIP) - set_portal_flag(0x00a3, PORTALFLAG_SKIP) - set_portal_flag(0x00a2, PORTALFLAG_SKIP) - set_portal_flag(0x00a4, PORTALFLAG_SKIP) - set_portal_flag(0x0087, PORTALFLAG_SKIP) - set_portal_flag(0x00b9, PORTALFLAG_SKIP) - set_portal_flag(0x00b4, PORTALFLAG_SKIP) - set_portal_flag(0x00b2, PORTALFLAG_SKIP) - set_portal_flag(0x00b3, PORTALFLAG_SKIP) - set_portal_flag(0x00bd, PORTALFLAG_SKIP) - set_portal_flag(0x00f4, PORTALFLAG_SKIP) - set_portal_flag(0x00f2, PORTALFLAG_SKIP) - set_portal_flag(0x00f0, PORTALFLAG_SKIP) - set_portal_flag(0x00f8, PORTALFLAG_SKIP) - set_portal_flag(0x00f1, PORTALFLAG_SKIP) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1421_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, TRUE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function8[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_do_some_animation, 0x0401 }, - { func0402_guard_with_chrflag, 0x0402 }, - { func0403_shielded_guard, 0x0403 }, - { func0404_init_hovercar, 0x0404 }, - { func0405_start_path26, 0x0405 }, - { func0406_start_path27, 0x0406 }, - { func0407_start_path28, 0x0407 }, - { func0408_start_path29, 0x0408 }, - { func0409_start_path30, 0x0409 }, - { func040a_start_path31, 0x040a }, - { func040b_start_path32, 0x040b }, - { func040c_start_path33, 0x040c }, - { func040d_start_path34, 0x040d }, - { func040e_start_path35, 0x040e }, - { func040f_cass, 0x040f }, - { func0410_init_cass, 0x0410 }, - { func0411_secretary, 0x0411 }, - { func0412_init_secretary, 0x0412 }, - { func0413_c318, 0x0413 }, - { func0414_programmer, 0x0414 }, - { func0415_set_idle, 0x0415 }, - { func0419_intro_0419, 0x0419 }, - { func041a_intro_041a, 0x041a }, - { func041b_intro_041b, 0x041b }, - { func041c_intro_041c, 0x041c }, - { func041d_intro_041d, 0x041d }, - { func041e_intro_041e, 0x041e }, - { func041f_intro_041f, 0x041f }, - { func0420_intro_0420, 0x0420 }, - { func0421_intro_0421, 0x0421 }, - { func0422_intro, 0x0422 }, - { func0422_intro_0423, 0x0423 }, - { func0422_intro_0424, 0x0424 }, - { func0422_intro_0425, 0x0425 }, - { func0422_intro_0426, 0x0426 }, - { func0422_intro_0427, 0x0427 }, - { func0422_intro_0428, 0x0428 }, - { func0422_intro_0429, 0x0429 }, - { func0422_intro_042a, 0x042a }, - { func0422_intro_042b, 0x042b }, - { func0422_intro_042c, 0x042c }, - { func0422_intro_042d, 0x042d }, - { func042e_init_surrendering_guard, 0x042e }, - { func042f_surrendering_guard, 0x042f }, - { func0430_init_falcon_guard, 0x0430 }, - { func0416_outro, 0x0416 }, - { func0417_init_dd_guard, 0x0417 }, - { func0418_init_shock_guard, 0x0418 }, - { func1000_rebuild_groups, 0x1000 }, - { func1401_setup_counterop, 0x1401 }, - { func1002_objectives_failed_msg, 0x1002 }, - { func1003_start_intro, 0x1003 }, - { func1004_check_lab_lift_located, 0x1004 }, - { func1005_give_control, 0x1005 }, - { func1006_check_programmer_dead, 0x1006 }, - { func1007_uplinking, 0x1007 }, - { func1008_doorswitch, 0x1008 }, - { func1009_check_civilians_killed, 0x1009 }, - { func100a_alarm_guard, 0x100a }, - { func100b_lightswitch, 0x100b }, - { func100c_noop2, 0x100c }, - { func100d_check_objects_destroyed, 0x100d }, - { func100e_check_ecm_mines, 0x100e }, - { func100f_check_necklace_collected, 0x100f }, - { func1010_start_hub_humms, 0x1010 }, - { func1011_check_hubs_activated, 0x1011 }, - { func1012_trigger_x_music, 0x1012 }, - { func1013_msg_commshubnearby, 0x1013 }, - { func1014_msg_officefloor, 0x1014 }, - { func1015_msg_securityroom, 0x1015 }, - { func1016_msg_basementelevator, 0x1016 }, - { func1017_unlock_basement_door, 0x1017 }, - { func0422_intro_speaking, 0x1418 }, - { func1019_toggle_guards, 0x1019 }, - { func101a_noop, 0x101a }, - { func141c_start_lifts, 0x141c }, - { func101d_disable_cameras, 0x101d }, - { func101e_lift_door_sounds, 0x101e }, - { func101f_setup_rtracker, 0x101f }, - { func1420_setup_portals, 0x1420 }, - { func1421_setup_environment, 0x1421 }, - { func0422_intro, 0x0c00 }, - { func0416_outro_from_menu, 0x0c01 }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, PATHFLAG_FLYING }, diff --git a/src/setups/setuparch.c b/src/setups/setuparch.c index 57c09f01c..cd30aedaf 100644 --- a/src/setups/setuparch.c +++ b/src/setups/setuparch.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setuparec.c b/src/setups/setuparec.c index ac6775a81..a2e70c9bc 100644 --- a/src/setups/setuparec.c +++ b/src/setups/setuparec.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -25,16 +25,6 @@ u32 props[] = { endprops }; -u8 unregistered_func1[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_func2[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - s32 intro[] = { endintro }; @@ -42,7 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; diff --git a/src/setups/setupark.c b/src/setups/setupark.c index 9f69b2afd..693d28fa3 100644 --- a/src/setups/setupark.c +++ b/src/setups/setupark.c @@ -89,7 +89,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -555,2625 +555,3 @@ struct path paths[] = { { path02, 2, 0 }, { NULL, 0, 0 }, }; - -/** - * @unused - */ -u8 func0403_stop_and_idle[] = { - stop_chr - - beginloop(0x00) - endloop(0x00) - - endlist -}; - -u8 func0404_init_drcaroll[] = { - set_self_chrflag(CHRCFLAG_PUSHABLE) - set_shield(100) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_start_drcaroll[] = { - stop_chr - set_ailist(CHR_SELF, AILIST_DRCAROLL_FOLLOWING) - endlist -}; - -u8 func0401_drcaroll_following[] = { - set_shotlist(AILIST_DRCAROLL_FOLLOWING) - set_self_chrflag(CHRCFLAG_00040000) - stop_chr - set_target_chr(CHR_BOND) - try_jog_to_target(/*goto*/ 0x00) - label(0x00) - yield - set_target_chr(CHR_BOND) - if_chr_deadish(CHR_SELF, /*goto*/ 0x00) - goto_next(0x20) - - label(0x00) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x0b) - if_timer_gt(15, /*goto*/ 0x00) - endloop(0x0b) - - label(0x00) - say_quip(CHR_TARGET, 0x06, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - set_target_chr(CHR_BOND) - set_shield(100) - set_chr_maxdamage(CHR_SELF, 100) - label(0x20) - if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x00) - goto_next(0x02) - - label(0x00) - restart_timer - say_quip(CHR_TARGET, 0x04, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x0d) - if_num_times_shot_lt(1, /*goto*/ 0x00) - if_timer_lt(20, /*goto*/ 0x00) - label(0x00) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x0d) - - label(0x02) - stop_chr - restart_timer - - beginloop(0x03) - if_chr_y(CHR_TARGET, -1910, OPERATOR_LESS_THAN, /*goto*/ 0x20) - label(0x20) - if_can_see_target(/*goto*/ 0x00) - goto_next(0x04) - - label(0x00) - if_timer_gt(1250, /*goto*/ 0x20) - if_distance_to_target_gt(200, /*goto*/ 0x04) - endloop(0x03) - - label(0x20) - call_rng - if_rand_lt(64, /*goto*/ 0x20) - say_quip(CHR_TARGET, 0x02, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x02) - - label(0x20) - say_quip(CHR_TARGET, 0x03, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x02) - - label(0x00) - say_quip(CHR_TARGET, 0x07, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x02) - - label(0x04) - restart_timer - if_chr_y(CHR_DRCAROLL, -2100, OPERATOR_LESS_THAN, /*goto*/ 0x20) - try_run_to_target(/*goto*/ 0x05) - label(0x20) - if_distance_to_target_lt(200, /*goto*/ 0x20) - try_run_to_target(/*goto*/ 0x05) - label(0x20) - try_jog_to_target(/*goto*/ 0x05) - - beginloop(0x05) - if_chr_in_room(CHR_TARGET, 0x00, 0x0094, /*goto*/ 0x00) - goto_next(0x20) - - label(0x00) - label(0x20) - label(0x00) - if_distance_to_target_lt(200, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - if_timer_gt(360, /*goto*/ 0x20) - endloop(0x05) - - label(0x20) - say_quip(CHR_TARGET, 0x03, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x04) - - label(0x00) - say_quip(CHR_TARGET, 0x07, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x04) - - label(0x06) - goto_first(0x02) - - label(0x07) - try_run_to_target(/*goto*/ 0x08) - - beginloop(0x08) - endloop(0x08) - - label(0x09) - goto_first(0x02) - - // Unreachable - // Attempts to teleport Dr Caroll up the elevator shaft from foyer - label(0x5c) - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x20) - chr_move_to_pad(CHR_DRCAROLL, PAD_ARK_0079, 0x00, /*goto*/ 0x00) - label(0x00) - goto_first(0x02) - - label(0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Waiting at the door to the top room while you clear it out. - */ -u8 func0405_drcaroll_waiting[] = { - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x20) - goto_next(0x00) - - label(0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x00) - set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00100000) - chr_move_to_pad(CHR_DRCAROLL, PAD_ARK_01CA, 0x00, /*goto*/ 0x00) - label(0x00) - stop_chr - - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_TOP_BODYGUARDS_DEAD, TRUE, /*goto*/ 0x00) - endloop(0x1f) - - label(0x00) - set_ailist(CHR_SELF, AILIST_DRCAROLL_FOLLOWING) - endlist -}; - -u8 func100c_foyer_lights_timer[] = { - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_OFF, TRUE, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) - - // PA - set_countdown_timer(60) - start_countdown_timer - show_countdown_timer - goto_next(0x0e) - - // Agent - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - set_countdown_timer(60) - start_countdown_timer - show_countdown_timer - goto_next(0x0e) - - // SA - label(0x2f) - set_countdown_timer(90) - start_countdown_timer - show_countdown_timer - - beginloop(0x0e) - if_countdown_timer_lt(1, /*goto*/ 0x0f) - endloop(0x0e) - - label(0x0f) - set_stage_flag(STAGEFLAG_FOYER_LIGHTS_RESTORED) - hide_countdown_timer - stop_countdown_timer - set_lights_state(0x0019, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x001a, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x001b, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x001c, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x001d, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x001e, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x001f, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0020, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0021, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0017, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0018, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0016, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0022, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0023, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0024, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0025, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0026, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0027, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0028, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0029, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x002a, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x002b, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x002c, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x002d, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x002e, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x002f, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0030, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0031, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0032, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0033, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0034, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0035, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0036, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0015, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x000f, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x000e, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0010, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0011, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0012, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0013, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0014, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x000d, LIGHTOP_1, 0x64, 0x00, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0410_init_top_guard[] = { - set_shotlist(AILIST_TOP_GUARD) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x20) - - // SA and PA - set_chr_dodge_rating(2, 10) - set_accuracy(80) - set_reaction_speed(10) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - goto_next(0x00) - - // Agent - label(0x20) - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(10) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - - label(0x00) - beginloop(0x8d) - if_stage_flag_eq(STAGEFLAG_ENTERING_TOP_ROOM, TRUE, /*goto*/ 0x20) - endloop(0x8d) - - label(0x20) - set_ailist(CHR_SELF, AILIST_TOP_GUARD) - endlist -}; - -u8 func040f_top_guard[] = { - if_just_injured(CHR_SELF, /*goto*/ 0x20) - goto_next(0x00) - - label(0x20) - set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) - - beginloop(0x21) - if_chr_stopped(/*goto*/ 0x00) - endloop(0x21) - - label(0x00) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x1f) - - beginloop(0x1f) - if_distance_to_target_lt(200, /*goto*/ 0x20) - if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x00) - if_stage_flag_eq(STAGEFLAG_TOP_GUARDS_ATTACKING, TRUE, /*goto*/ 0x00) - set_target_chr(CHR_PRESET) - endloop(0x1f) - - label(0x00) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - - label(0x20) - set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - endlist -}; - -u8 func0411_top_guard_blinded[] = { - if_chr_deadish(CHR_SELF, /*goto*/ 0x20) - goto_next(0x00) - - label(0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x00) - chr_do_animation(ANIM_BLINDED, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - say_quip(CHR_BOND, 0x11, 0x64, 0x02, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x1f) - if_chr_stopped(/*goto*/ 0x00) - endloop(0x1f) - - label(0x00) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - endlist -}; - -u8 func0406_general_combat[] = { - set_self_chrflag(CHRCFLAG_00000040) - set_shotlist(AILIST_GENERAL_COMBAT) - if_has_gun(CHR_SELF, /*goto*/ 0x20) - - // No gun - set_shotlist(GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - // Has gun - label(0x20) - if_chr_deadish(CHR_SELF, /*goto*/ 0x00) - goto_next(0x20) - - // Dying - wait a few frames then say quip - label(0x00) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x0b) - if_timer_gt(15, /*goto*/ 0x00) - endloop(0x0b) - - label(0x00) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive with gun - label(0x20) - if_just_injured(CHR_SELF, /*goto*/ 0x00) - goto_next(0x21) - - // Just got injured - label(0x00) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED) - restart_timer - - beginloop(0x0c) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x00) - if_num_times_shot_lt(1, /*goto*/ 0x00) - if_timer_lt(20, /*goto*/ 0x00) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x00) - if_chr_stopped(/*goto*/ 0x21) - endloop(0x0c) - - // Not injured, or injury recovery finished - label(0x21) - set_self_chrflag(CHRCFLAG_00000040) - - label(0x14) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x00) - label(0x20) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x10) - label(0x00) - kneel - - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) - goto_next(0x20) - - // Lights restored - label(0x00) - set_view_distance(100) - - label(0x20) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) - if_target_in_sight(/*goto*/ 0x15) - goto_next(0x20) - - label(0x00) - if_can_see_target(/*goto*/ 0x15) - label(0x20) - if_near_miss(/*goto*/ 0x18) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) - if_enemy_distance_lt_and_los(500, /*goto*/ 0x20) - goto_next(0x5e) - - label(0x00) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x20) - goto_next(0x5e) - - label(0x20) - if_target_is_player(/*goto*/ 0x5e) - goto_next(0x15) - - label(0x5e) - set_target_chr(CHR_P1P2) - reloop(0x10) - - label(0x00) - if_target_in_sight(/*goto*/ 0x15) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) - if_enemy_distance_lt_and_los(500, /*goto*/ 0x20) - goto_next(0x5e) - - label(0x00) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x20) - goto_next(0x5e) - - label(0x20) - if_target_is_player(/*goto*/ 0x5e) - goto_next(0x15) - - label(0x5e) - set_target_chr(CHR_P1P2) - endloop(0x10) - - label(0x15) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED) - if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2a) - if_distance_to_target_lt(250, /*goto*/ 0x29) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x20) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) - say_quip(CHR_BOND, QUIP_SEARCHSUCCESS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - goto_next(0x20) - - label(0x00) - say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - label(0x20) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x17) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x12) - goto_next(0x13) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x13) - endloop(0x12) - - label(0x13) - if_chr_injured_target(CHR_SELF, /*goto*/ 0x20) - say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) - goto_next(0x00) - - label(0x20) - say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) - label(0x00) - goto_first(0x14) - - label(0x18) - restart_timer - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x1c) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x1c) - say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - - beginloop(0x1c) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - call_rng - if_target_in_sight(/*goto*/ 0x19) - if_timer_gt(60, /*goto*/ 0x1e) - if_rand_lt(4, /*goto*/ 0x1e) - endloop(0x1c) - - label(0x1e) - if_can_see_target(/*goto*/ 0x19) - goto_first(0x14) - - label(0x19) - goto_first(0x15) - - label(0x1a) - restart_timer - - beginloop(0x1b) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x19) - if_timer_gt(300, /*goto*/ 0x00) - endloop(0x1b) - - label(0x00) - goto_first(0x14) - - label(0x19) - goto_first(0x15) - - label(0x17) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x16) - label(0x16) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x00) - goto_next(0x20) - label(0x00) - goto_first(0x12) - - label(0x20) - goto_first(0x13) - - label(0x29) - try_jog_to_target(/*goto*/ 0x20) - label(0x20) - set_returnlist(CHR_SELF, AILIST_GENERAL_COMBAT) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - - label(0x2a) - label(0x20) - if_target_is_player(/*goto*/ 0x20) - set_shotlist(GAILIST_COMBAT_WITH_TARGET) - set_returnlist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - label(0x20) - set_shotlist(GAILIST_ALERTED) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func0408_hovercopter[] = { - set_target_chr(CHR_BOND) - chopper_arm_weapons - move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0199) - begin_hovercar_path(0x02) - restart_timer - set_chr_maxdamage(CHR_SELF, 42320) - - beginloop(0x1f) - if_timer_gt(120, /*goto*/ 0x42) - endloop(0x1f) - - label(0x42) - yield - if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x52) - if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x53) - goto_next(0x54) - - // Low combat (lowest floor) - label(0x21) - begin_hovercar_path(0x00) - - beginloop(0x22) - if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x00) - if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x53) - if_stage_flag_eq(STAGEFLAG_CHOPPER_GO_TO_ROOF, FALSE, /*goto*/ 0x00) - goto_next(0x54) - - label(0x00) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x43) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x20) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x43) - set_target_chr(CHR_BOND) - label(0x20) - endloop(0x22) - - // Mid combat (second floor and Cass's office floor) - label(0x23) - begin_hovercar_path(0x01) - - beginloop(0x24) - if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x52) - if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x00) - if_stage_flag_eq(STAGEFLAG_CHOPPER_GO_TO_ROOF, FALSE, /*goto*/ 0x00) - goto_next(0x54) - - label(0x00) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x48) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x20) - set_target_chr(CHR_COOP) - - // @bug: This should go to 0x48. Instead it goes to the low code path, - // which doesn't appear to have any side effects except that the - // hovercopter will say the low line ("surrender or die") on the mid - // level if Velvet is the first player it sees. - if_can_see_target(/*goto*/ 0x43) - set_target_chr(CHR_BOND) - label(0x20) - endloop(0x24) - - // High combat (roof) - label(0x25) - begin_hovercar_path(0x02) - - beginloop(0x26) - set_target_chr(CHR_BOND) - if_chr_y(CHR_TARGET, -1850, OPERATOR_LESS_THAN, /*goto*/ 0x52) - if_chr_y(CHR_TARGET, -1200, OPERATOR_LESS_THAN, /*goto*/ 0x53) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x4d) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x20) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x4d) - label(0x20) - set_target_chr(CHR_BOND) - label(0x00) - endloop(0x26) - - // Change to high - label(0x54) - label(0x27) - yield - goto_next(0x00) - label(0x00) - if_can_see_target(/*goto*/ 0x20) - move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0199) - label(0x20) - goto_first(0x25) - - // Change to low - label(0x52) - if_can_see_target(/*goto*/ 0x20) - move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0190) - label(0x20) - goto_first(0x21) - - // Change to mid - label(0x53) - if_can_see_target(/*goto*/ 0x20) - move_object_to_pad(OBJ_HOVERCOPTER, PAD_ARK_0195) - label(0x20) - goto_first(0x23) - - // Low shooting - label(0x43) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x44) - goto_first(0x22) - - beginloop(0x44) - if_can_see_target(/*goto*/ 0x47) - restart_timer - - beginloop(0x45) - if_timer_gt(480, /*goto*/ 0x46) - if_can_see_target(/*goto*/ 0x47) - endloop(0x45) - - label(0x46) - stop_chr - goto_first(0x22) - - label(0x47) - if_stage_flag_eq(STAGEFLAG_SAID_SURRENDER_OR_DIE, TRUE, /*goto*/ 0x20) - play_sound(MP3_030B, -1) - set_stage_flag(STAGEFLAG_SAID_SURRENDER_OR_DIE) - label(0x20) - endloop(0x44) - - // Mid shooting - label(0x48) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x49) - goto_first(0x24) - - beginloop(0x49) - if_can_see_target(/*goto*/ 0x4c) - restart_timer - - beginloop(0x4a) - if_timer_gt(180, /*goto*/ 0x4b) - if_can_see_target(/*goto*/ 0x4c) - endloop(0x4a) - - label(0x4b) - stop_chr - goto_first(0x24) - - label(0x4c) - if_stage_flag_eq(STAGEFLAG_SAID_GIVE_UP, TRUE, /*goto*/ 0x20) - play_sound(MP3_030D, -1) - set_stage_flag(STAGEFLAG_SAID_GIVE_UP) - label(0x20) - endloop(0x49) - - // High shooting (roof) - label(0x4d) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x00) - label(0x00) - set_stage_flag(STAGEFLAG_HOVERCOPTER_ON_ROOF) - if_stage_flag_eq(STAGEFLAG_SAID_FINAL_WARNING, TRUE, /*goto*/ 0x20) - play_sound(MP3_030C, -1) - set_stage_flag(STAGEFLAG_SAID_FINAL_WARNING) - label(0x20) - stop_chr - restart_timer - - beginloop(0x29) - if_timer_gt(180, /*goto*/ 0x00) - endloop(0x29) - - label(0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x00) - goto_first(0x26) - - label(0x00) - restart_timer - - beginloop(0x4e) - if_can_see_target(/*goto*/ 0x51) - restart_timer - - beginloop(0x4f) - if_timer_gt(480, /*goto*/ 0x50) - if_can_see_target(/*goto*/ 0x51) - endloop(0x4f) - - label(0x50) - stop_chr - goto_first(0x26) - - label(0x51) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x20) - if_timer_gt(500, /*goto*/ 0x27) - label(0x20) - endloop(0x4e) - - label(0x27) - restart_timer - hovercopter_fire_rocket(0) // left side - goto_first(0x4e) - - // Unreachable - the hovercopter only fires rockets from the left side - label(0x28) - restart_timer - hovercopter_fire_rocket(1) // right side - goto_first(0x4e) - - endlist -}; - -u8 func1002_check_accessed_foyer_elevator[] = { - beginloop(0x21) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_y(CHR_TARGET, -8155, OPERATOR_LESS_THAN, /*goto*/ 0x20) - if_chr_distance_to_pad_lt(CHR_TARGET, 300, PAD_ARK_021A, /*goto*/ 0x00) - label(0x20) - goto_first(0x21) - - label(0x00) - set_stage_flag(STAGEFLAG_ACCESSED_FOYER_ELEVATOR) - show_hudmsg(CHR_TARGET, L_ARK_033) // "Foyer elevator accessed." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_check_end_level[] = { - beginloop(0x21) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_ARK_0002, /*goto*/ 0x00) - reloop(0x21) - - label(0x00) - if_chr_y(CHR_P1P2, 30, OPERATOR_LESS_THAN, /*goto*/ 0x20) - goto_next(0x00) - label(0x20) - reloop(0x21) - - label(0x00) - set_stage_flag(STAGEFLAG_REACHED_HELIPAD) - yield - if_all_objectives_complete(/*goto*/ 0x20) - endloop(0x21) - - label(0x20) - if_chr_deadish(CHR_BOND, /*goto*/ 0x20) - goto_next(0x00) - - label(0x20) - if_chr_deadish(CHR_COOP, /*goto*/ 0x20) - goto_next(0x00) - - label(0x20) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x00) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func1004_elevator_unlocking[] = { - yield - if_difficulty_gt(DIFF_SA, /*goto*/ 0x1f) - unlock_door(0x02, 0x01) - unlock_door(0x03, 0x01) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x1f) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, 0x01, /*goto*/ 0x20) - if_object_in_good_condition(0x01, /*goto*/ 0x00) - goto_next(0x28) - label(0x00) - endloop(0x1f) - - // Computer destroyed - label(0x28) - if_stage_flag_eq(STAGEFLAG_ELEVATOR_UNLOCKED, TRUE, /*goto*/ 0x00) - set_stage_flag(STAGEFLAG_ELEVATOR_PC_DESTROYED) - show_hudmsg(CHR_BOND, L_ARK_045) // "Critical mission object destroyed." - label(0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Computer activated - label(0x20) - show_hudmsg(CHR_TARGET, L_ARK_014) // "Accessing elevator controls..." - assign_sound(SFX_8116, CHANNEL_6) - control_sound_from_object(CHANNEL_6, 0x01, TRUE) - restart_timer - - beginloop(0x22) - if_timer_gt(15, /*goto*/ 0x00) - endloop(0x22) - - label(0x00) - mute_channel(CHANNEL_6) - - beginloop(0x23) - if_timer_gt(40, /*goto*/ 0x00) - endloop(0x23) - - label(0x00) - - beginloop(0x24) - if_timer_gt(60, /*goto*/ 0x00) - endloop(0x24) - - label(0x00) - - beginloop(0x25) - if_timer_gt(80, /*goto*/ 0x00) - endloop(0x25) - - label(0x00) - restart_timer - - beginloop(0x21) - if_timer_gt(120, /*goto*/ 0x00) - endloop(0x21) - - label(0x00) - play_sound(SFX_DOOR_81B0, -1) - unlock_door(0x02, 0x01) - unlock_door(0x03, 0x01) - show_hudmsg(CHR_TARGET, L_ARK_034) // "Office elevator door has been unlocked." - set_stage_flag(STAGEFLAG_ELEVATOR_UNLOCKED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_check_bodyguards_dead[] = { - #define if_alive_goto_00(chr, goto) \ - if_chr_deadish(chr, goto) \ - goto_next(0x00) \ - label(goto) - - beginloop(0x1f) - if_alive_goto_00(CHR_TOPGUARD5, 0x21) - if_alive_goto_00(CHR_TOPGUARD4, 0x22) - if_alive_goto_00(CHR_TOPGUARD3, 0x23) - if_alive_goto_00(CHR_TOPGUARD2, 0x24) - if_alive_goto_00(CHR_TOPGUARD1, 0x20) - - set_stage_flag(STAGEFLAG_TOP_BODYGUARDS_DEAD) - unlock_door(OBJ_TOPROOMDOOR, 0x02) - unset_object_flag2(OBJ_TOPROOMDOOR, OBJFLAG2_AICANNOTUSE) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x26) - - if_alive_goto_00(0x16, 0x20) - if_alive_goto_00(0x17, 0x20) - if_alive_goto_00(0x18, 0x20) - if_alive_goto_00(0x19, 0x20) - if_alive_goto_00(0x1a, 0x20) - - if_chr_deadish(0x1b, /*goto*/ 0x20) - goto_next(0x00) - - label(0x00) - endloop(0x1f) - - label(0x20) - label(0x26) - show_hudmsg(CHR_BOND, L_ARK_036) // "Cassandra's bodyguards have been defeated." - set_stage_flag(STAGEFLAG_OBJECTIVE_BODYGUARDS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_check_hovercopter_destroyed[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x26) - - beginloop(0x1f) - if_object_in_good_condition(OBJ_HOVERCOPTER, /*goto*/ 0x00) - show_hudmsg(CHR_BOND, L_ARK_035) // "DataDyne Hovercopter eliminated." - set_stage_flag(STAGEFLAG_HOVERCOPTER_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x00) - endloop(0x1f) - - label(0x26) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_drcaroll_warnings[] = { - beginloop(0x1f) - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x21) - if_stage_flag_eq(STAGEFLAG_DRCAROLL_ATTACKED, TRUE, /*goto*/ 0x00) - if_chr_shield_lt(CHR_DRCAROLL, 100, /*goto*/ 0x30) - - // Attacked message already shown - label(0x00) - if_stage_flag_eq(STAGEFLAG_DRCAROLL_DAMAGED, TRUE, /*goto*/ 0x00) - if_just_injured(CHR_DRCAROLL, /*goto*/ 0x31) - - label(0x00) - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x00) - reloop(0x1f) - - // Dead - label(0x21) - label(0x00) - show_hudmsg(CHR_BOND, L_ARK_016) // "Dr. Caroll has been killed!" - set_stage_flag(STAGEFLAG_DRCAROLL_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Shield under 100 - label(0x30) - show_hudmsg(CHR_BOND, L_ARK_017) // "Dr. Caroll is under attack!" - set_stage_flag(STAGEFLAG_DRCAROLL_ATTACKED) - reloop(0x1f) - - label(0x31) - show_hudmsg(CHR_BOND, L_ARK_018) // "Dr. Caroll has been damaged!" - set_stage_flag(STAGEFLAG_DRCAROLL_DAMAGED) - endloop(0x1f) - - endlist -}; - -u8 func1007_noop[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_trigger_hovercopter_roof[] = { - // Wait until techs running, then wait 7 seconds, then set flag that allows - // the hovercopter to go to the roof. - beginloop(0x1f) - if_timer_gt(420, /*goto*/ 0x21) - if_timer_gt(0, /*goto*/ 0x20) - if_stage_flag_eq(STAGEFLAG_TECHS_RUNNING, TRUE, /*goto*/ 0x00) - label(0x20) - reloop(0x1f) - - label(0x00) - restart_timer - endloop(0x1f) - - label(0x21) - set_stage_flag(STAGEFLAG_CHOPPER_GO_TO_ROOF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_init_top_room[] = { - set_chr_chrflag(CHR_TOPGUARD1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TOPGUARD2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TOPGUARD3, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TOPGUARD4, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TOPGUARD5, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CASS, CHRCFLAG_INVINCIBLE) - - beginloop(0x1f) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0039, /*goto*/ 0x00) - if_chr_activated_object(CHR_P1P2, OBJ_TOPROOMDOOR, /*goto*/ 0x00) - endloop(0x1f) - - label(0x00) - set_object_flag(OBJ_TOPROOMDOOR, OBJFLAG_CANNOT_ACTIVATE) - set_chr_target_chr(CHR_CASS, CHR_P1P2) - set_chr_target_chr(CHR_TOPGUARD1, CHR_P1P2) - set_chr_target_chr(CHR_TOPGUARD2, CHR_P1P2) - set_chr_target_chr(CHR_TOPGUARD3, CHR_P1P2) - set_chr_target_chr(CHR_TOPGUARD4, CHR_P1P2) - set_chr_target_chr(CHR_TOPGUARD5, CHR_P1P2) - unset_chr_chrflag(CHR_TOPGUARD1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TOPGUARD2, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TOPGUARD3, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TOPGUARD4, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TOPGUARD5, CHRCFLAG_INVINCIBLE) - set_chr_team(CHR_CASS, TEAM_ENEMY) - set_chr_team(CHR_TOPGUARD1, TEAM_ENEMY) - set_chr_team(CHR_TOPGUARD2, TEAM_ENEMY) - set_chr_team(CHR_TOPGUARD3, TEAM_ENEMY) - set_chr_team(CHR_TOPGUARD4, TEAM_ENEMY) - set_chr_team(CHR_TOPGUARD5, TEAM_ENEMY) - set_stage_flag(STAGEFLAG_ENTERING_TOP_ROOM) - restart_timer - - beginloop(0x21) - if_timer_gt(60, /*goto*/ 0x00) - endloop(0x21) - - label(0x00) - beginloop(0x21) - if_chr_shield_lt(CHR_CASS, 100, /*goto*/ 0x20) - endloop(0x21) - - label(0x20) - set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040b_init_tech1[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, 0x0409) - endlist -}; - -u8 func0409_tech_conversation[] = { - set_shotlist(GAILIST_IDLE) - - beginloop(0x01) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, 0x11, /*goto*/ 0x00) - if_door_state(0x11, DOORSTATE_OPEN, /*goto*/ 0x00) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - set_chr_chrflag(CHR_TECH1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TECH2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_RLSHOCK, CHRCFLAG_INVINCIBLE) - endloop(0x01) - - // Player activated door or door is fully open - label(0x00) - set_chrpreset(CHR_TARGET) - set_chr_team(CHR_TECH1, TEAM_ENEMY) - set_chr_team(CHR_TECH2, TEAM_ENEMY) - set_chr_team(CHR_RLSHOCK, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - unset_chr_chrflag(CHR_TECH1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TECH2, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_RLSHOCK, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_RLSHOCK, GAILIST_UNALERTED) - restart_timer - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) - - beginloop(0x28) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - if_timer_gt(30, /*goto*/ 0x20) - endloop(0x28) - - label(0x20) - chr_do_animation(ANIM_TALKING_00A0, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - speak(CHR_PRESET, L_ARK_037, SFX_811D, CHANNEL_7, COLOR_06_WHITE) // "That's not how it goes." - restart_timer - - beginloop(0x21) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - if_target_in_sight(/*goto*/ 0x33) - pause_timer - if_sound_finished(CHANNEL_7, /*goto*/ 0x20) - reloop(0x21) - - label(0x20) - resume_timer - if_timer_gt(20, /*goto*/ 0x20) - goto_first(0x21) - - label(0x20) - chr_do_animation(ANIM_TWO_GUN_HOLD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - chr_do_animation(ANIM_TALKING_00A0, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) - speak(CHR_PRESET, L_ARK_038, SFX_8120, CHANNEL_7, COLOR_08_RED) // "Yes, it is." - - beginloop(0x22) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - if_target_in_sight(/*goto*/ 0x33) - pause_timer - if_sound_finished(CHANNEL_7, /*goto*/ 0x20) - reloop(0x22) - - label(0x20) - resume_timer - if_timer_gt(40, /*goto*/ 0x20) - endloop(0x22) - - label(0x20) - chr_do_animation(ANIM_TALKING_00A0, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) - speak(CHR_PRESET, L_ARK_039, SFX_811E, CHANNEL_7, COLOR_06_WHITE) // "Give it to me - you're doing it wrong." - - beginloop(0x23) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - if_target_in_sight(/*goto*/ 0x33) - pause_timer - if_sound_finished(CHANNEL_7, /*goto*/ 0x20) - reloop(0x23) - - label(0x20) - resume_timer - if_timer_gt(60, /*goto*/ 0x20) - endloop(0x23) - - label(0x20) - chr_do_animation(ANIM_TWO_GUN_HOLD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - chr_do_animation(ANIM_TALKING_00A0, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) - speak(CHR_PRESET, L_ARK_040, SFX_8121, CHANNEL_7, COLOR_08_RED) // "Stop annoying me." - - beginloop(0x24) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - if_target_in_sight(/*goto*/ 0x33) - pause_timer - if_sound_finished(CHANNEL_7, /*goto*/ 0x20) - reloop(0x24) - - label(0x20) - resume_timer - if_timer_gt(80, /*goto*/ 0x20) - endloop(0x24) - - label(0x20) - chr_do_animation(ANIM_TWO_GUN_HOLD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - chr_do_animation(ANIM_TALKING_00A0, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, CHR_RLSHOCK, 2) - chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 20, 0x10, 2) - speak(CHR_PRESET, L_ARK_041, SFX_8123, CHANNEL_7, COLOR_09_BLUE) // "Will you just hurry up!" - - beginloop(0x25) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - if_target_in_sight(/*goto*/ 0x33) - pause_timer - if_sound_finished(CHANNEL_7, /*goto*/ 0x20) - reloop(0x25) - - label(0x20) - resume_timer - if_timer_gt(100, /*goto*/ 0x20) - endloop(0x25) - - label(0x20) - set_stage_flag(STAGEFLAG_TECHS_FINISHED) - stop_chr - - beginloop(0x26) - if_saw_injury(0x00, /*goto*/ 0x33) - if_saw_death(0x00, /*goto*/ 0x33) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - if_can_see_target(/*goto*/ 0x20) - endloop(0x26) - - label(0x20) - label(0x33) - if_stage_flag_eq(STAGEFLAG_TECHS_RUNNING, TRUE, /*goto*/ 0x00) - set_stage_flag(STAGEFLAG_TECHS_RUNNING) - label(0x00) - increase_squadron_alertness(100) - open_door(0x04) - restart_timer - speak(CHR_TARGET, L_ARK_042, SFX_811F, CHANNEL_7, COLOR_06_WHITE) // "Oh, no...too late." - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x34) - if_timer_gt(60, /*goto*/ 0x35) - endloop(0x34) - - label(0x35) - jog_to_pad(PAD_ARK_01CD) - - beginloop(0x36) - if_chr_stopped(/*goto*/ 0x37) - endloop(0x36) - - label(0x37) - restart_timer - surrender - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x38) - if_chr_idle(/*goto*/ 0x5e) - goto_next(0x20) - - label(0x5e) - reloop(0x38) - - label(0x20) - restart_timer - endloop(0x38) - - label(0x00) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_cass_necklace[] = { - chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_init_tech2[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, 0x040a) - endlist -}; - -u8 func040a_tech2[] = { - set_shotlist(GAILIST_IDLE) - stop_chr - - beginloop(0x1f) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TECHS_FINISHED, TRUE, /*goto*/ 0x20) - if_target_in_sight(/*goto*/ 0x33) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - endloop(0x1f) - - label(0x20) - stop_chr - - beginloop(0x21) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x00) - reloop(0x21) - - label(0x00) - label(0x33) - if_stage_flag_eq(STAGEFLAG_TECHS_RUNNING, TRUE, /*goto*/ 0x00) - set_stage_flag(STAGEFLAG_TECHS_RUNNING) - label(0x00) - increase_squadron_alertness(100) - open_door(0x04) - yield - restart_timer - chr_do_animation(ANIM_OPERATE_0205, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - // @bug: Duplicate label. I suspect the goto first 0x21 below is - // supposed to go here. The only possible side effect is the tech may - // restart his animation repeatedly. - label(0x21) - yield - if_sound_finished(CHANNEL_7, /*goto*/ 0x20) - endloop(0x21) - - label(0x20) - chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - speak(CHR_TARGET, L_ARK_043, SFX_8122, CHANNEL_7, COLOR_08_RED) // "She's here..." - - beginloop(0x22) - if_sound_finished(CHANNEL_7, /*goto*/ 0x35) - endloop(0x22) - - label(0x35) - jog_to_pad(PAD_ARK_002A) - - beginloop(0x36) - if_chr_stopped(/*goto*/ 0x37) - endloop(0x36) - - label(0x37) - restart_timer - surrender - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x38) - if_chr_idle(/*goto*/ 0x5e) - goto_next(0x20) - - label(0x5e) - reloop(0x38) - - label(0x20) - restart_timer - endloop(0x38) - - label(0x00) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_cass[] = { - set_shield(100) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CASS, CHRCFLAG_UNEXPLODABLE) - set_target_chr(CHR_P1P2) - - beginloop(0x3b) - if_stage_flag_eq(STAGEFLAG_ENTERING_TOP_ROOM, TRUE, /*goto*/ 0x3a) - endloop(0x3b) - - label(0x3a) - open_door(OBJ_TOPROOMDOOR) - set_target_chr(CHR_PRESET) - if_num_human_players_lt(2, /*goto*/ 0x20) - goto_next(0x89) - - // 1 player - do force walk (enter room) - label(0x20) - revoke_control(CHR_BOND, 0) - force_walk(CHR_BOND, 0x0019, 40, 55, 0, 46) - - beginloop(0x23) - open_door(OBJ_TOPROOMDOOR) - if_force_walk_finished(CHR_BOND, /*goto*/ 0x24) - endloop(0x23) - - // Second force walk (turn to face Cass) - label(0x24) - force_walk(CHR_BOND, 0x0018, 0, 65, 65, 0) - open_door(OBJ_TOPROOMDOOR) - - beginloop(0x25) - if_force_walk_finished(CHR_BOND, /*goto*/ 0x26) - endloop(0x25) - - label(0x26) - unset_object_flag(OBJ_TOPROOMDOOR, OBJFLAG_CANNOT_ACTIVATE) - grant_control(CHR_BOND) - close_door(OBJ_TOPROOMDOOR) - if_chr_in_room(CHR_BOND, 0x00, 0x0045, /*goto*/ 0x20) - lock_door(OBJ_TOPROOMDOOR, 0x02) - - // 2 players, or force walk failed - label(0x20) - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x20) - set_ailist(CHR_DRCAROLL, 0x0405) - label(0x20) - goto_next(0x00) - - label(0x89) - unset_object_flag(OBJ_TOPROOMDOOR, OBJFLAG_CANNOT_ACTIVATE) - restart_timer - - beginloop(0x8a) - if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x5b) - if_timer_gt(120, /*goto*/ 0x00) - endloop(0x8a) - - label(0x00) - restart_timer - speak(CHR_TARGET, L_ARK_032, SFX_80FF, CHANNEL_6, COLOR_04_ORANGE) // "We meet again, girl!" - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x27) - if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x5b) - if_sound_finished(CHANNEL_6, /*goto*/ 0x00) - endloop(0x27) - - label(0x00) - restart_timer - speak(CHR_TARGET, L_ARK_020, SFX_80FE, CHANNEL_6, COLOR_04_ORANGE) // "You've become quite an annoyance..." - chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - - beginloop(0x28) - if_stage_flag_eq(STAGEFLAG_CASS_SHIELD_DAMAGED, TRUE, /*goto*/ 0x5b) - if_timer_gt(300, /*goto*/ 0x00) - endloop(0x28) - - label(0x5b) - restart_timer - - beginloop(0x29) - if_timer_gt(60, /*goto*/ 0x20) - endloop(0x29) - - label(0x20) - speak(CHR_TARGET, L_ARK_044, SFX_8101, CHANNEL_6, COLOR_04_ORANGE) // "Get her!" - chr_do_animation(ANIM_TALKING_00A3, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - goto_next(0x20) - - label(0x00) - restart_timer - speak(CHR_TARGET, L_ARK_021, SFX_8100, CHANNEL_6, COLOR_04_ORANGE) // "Good night, Ms. Dark." - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x2a) - if_timer_gt(150, /*goto*/ 0x20) - endloop(0x2a) - - label(0x20) - set_lights_state(0x0044, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_stage_flag(STAGEFLAG_TOP_LIGHTS_OFF) - set_stage_flag(STAGEFLAG_TOP_GUARDS_ATTACKING) - walk_to_pad(PAD_ARK_000F) - restart_timer - - beginloop(0x2b) - if_timer_gt(60, /*goto*/ 0x00) - endloop(0x2b) - - label(0x00) - play_sound(SFX_8102, CHANNEL_7) - - beginloop(0x2c) - if_timer_gt(120, /*goto*/ 0x00) - endloop(0x2c) - - label(0x00) - play_x_track(XREASON_DEFAULT, 10, 60) - - beginloop(0x3f) - if_timer_gt(180, /*goto*/ 0x00) - endloop(0x3f) - - label(0x00) - set_stage_flag(STAGEFLAG_TRIGGER_CANTLEAVEANY_MSG) - label(0x3d) - label(0x00) - label(0x00) - set_stage_flag(STAGEFLAG_TOP_GUARDS_ATTACKING) - - // Wait until Cass not in top room -#if VERSION >= VERSION_NTSC_1_0 - beginloop(0x2c) - if_chr_in_room(CHR_SELF, 0x00, 0x003a, /*goto*/ 0x20) - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ 0x20) - goto_next(0x00) - - label(0x20) - reloop(0x2c) - - // And not in sight - label(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_nearly_in_targets_sight(30, /*goto*/ 0x20) - set_target_chr(CHR_ANTI) - if_nearly_in_targets_sight(30, /*goto*/ 0x20) - goto_next(0x2d) - - label(0x20) - endloop(0x2c) -#else - beginloop(0x2c) - if_can_see_target(/*goto*/ 0x20) - goto_next(0x2d) - - label(0x20) - endloop(0x2c) -#endif - - label(0x2d) - set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00100000) - chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) - chr_move_to_pad(CHR_CASS, PAD_ARK_0205, 0x00, /*goto*/ 0x00) - label(0x00) -#if VERSION >= VERSION_NTSC_1_0 - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x20) - label(0x20) -#else - stop_chr -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_unlock_top_door[] = { - beginloop(0x1f) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x003b, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - unlock_door(OBJ_TOPROOMDOOR, 0x02) - unset_object_flag2(OBJ_TOPROOMDOOR, OBJFLAG2_AICANNOTUSE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func040e_noop2[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_lightswitch[] = { - beginloop(0x1f) - if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x20) - reloop(0x1f) - - label(0x20) - play_sound(SFX_PRESS_SWITCH, -1) - if_stage_flag_eq(STAGEFLAG_TOP_LIGHTS_OFF, TRUE, /*goto*/ 0x00) - set_lights_state(0x0044, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_TURNOFF, 0x00, 0x00, 0x00) - set_stage_flag(STAGEFLAG_TOP_LIGHTS_OFF) - reloop(0x1f) - - label(0x00) - unset_stage_flag(STAGEFLAG_TOP_LIGHTS_OFF) - set_lights_state(0x0044, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_TURNON, 0x00, 0x00, 0x00) - endloop(0x1f) - - endlist -}; - -u8 func100b_check_top_lights_on[] = { - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_TOP_GUARDS_ATTACKING, TRUE, /*goto*/ 0x00) - endloop(0x1f) - - label(0x00) - if_stage_flag_eq(STAGEFLAG_TOP_LIGHTS_OFF, TRUE, /*goto*/ 0x00) - goto_next(0x20) - - label(0x00) - endloop(0x1f) - - label(0x20) - set_stage_flag(STAGEFLAG_CASS_SHIELD_DAMAGED) - set_ailist(CHR_TOPGUARD1, AILIST_TOP_GUARD_BLINDED) - set_ailist(CHR_TOPGUARD2, AILIST_TOP_GUARD_BLINDED) - set_ailist(CHR_TOPGUARD3, AILIST_TOP_GUARD_BLINDED) - set_ailist(CHR_TOPGUARD4, AILIST_TOP_GUARD_BLINDED) - set_ailist(CHR_TOPGUARD5, AILIST_TOP_GUARD_BLINDED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_foyer_lights[] = { - restart_timer - beginloop(0x21) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_OFF, TRUE, /*goto*/ 0x00) - if_timer_gt(980, /*goto*/ 0x00) - endloop(0x21) - - label(0x00) - set_lights_state(0x0019, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x001a, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x001b, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x001c, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x001d, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x001e, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x001f, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0020, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0021, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0017, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0018, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0016, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0022, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0023, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0024, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0025, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0026, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0027, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0028, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0029, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x002a, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x002b, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x002c, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x002d, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x002e, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x002f, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0030, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0031, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0032, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0033, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0034, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0035, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0036, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x0015, LIGHTOP_3, 0x64, 0x02, 0x78) - set_lights_state(0x000f, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x000e, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x0010, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x0011, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x0012, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x0013, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x0014, LIGHTOP_3, 0x64, 0x02, 0xf0) - set_lights_state(0x000d, LIGHTOP_3, 0x64, 0x02, 0xf0) - restart_timer - - beginloop(0x22) - if_timer_gt(240, /*goto*/ 0x00) - endloop(0x22) - - label(0x00) - set_lights_state(0x0019, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x001a, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x001b, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x001c, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x001d, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x001e, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x001f, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0020, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0021, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0017, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0018, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0016, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0022, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0023, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0024, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0025, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0026, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0027, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0028, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0029, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x002a, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x002b, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x002c, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x002d, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x002e, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x002f, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0030, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0031, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0032, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0033, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0034, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0035, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0036, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0015, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x000f, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x000e, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0010, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0011, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0012, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0013, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x0014, LIGHTOP_1, 0x02, 0x00, 0x00) - set_lights_state(0x000d, LIGHTOP_1, 0x02, 0x00, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - give_object_to_chr(OBJ_NIGHTVISION, CHR_BOND) - give_object_to_chr(OBJ_NIGHTVISION, CHR_COOP) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func100d_intro[] = { - play_cutscene_track(MUSIC_EXTRACTION_INTRO) - camera_movement(ANIM_CUT_ARK_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(0x00, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(0x00, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_INTRO_DRC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 4) - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_INTRO_GUARD_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 4) - unset_stage_flag(STAGEFLAG_00800000) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - if_controller_button_pressed(/*goto*/ 0x00) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x5d) \ - if_timer_gt(time, /*goto*/ 0x00) \ - endloop(loopid) \ - label(0x00) - - wait_until(20, 0x61) - open_door(0x0c) - - wait_until(120, 0x60) - play_sound(SFX_0161, -1) - - wait_until(350, 0x62) - play_sound(SFX_042F, -1) - - wait_until(450, 0x63) - play_sound(SFX_0427, -1) - - wait_until(540, 0x64) - speak(CHR_BOND, L_ARK_060, MP3_03F3, CHANNEL_7, COLOR_06_WHITE) // "Sound the alarm - she's here!" - - wait_until(640, 0x65) - speak(CHR_BOND, L_ARK_061, MP3_03F4, CHANNEL_7, COLOR_09_BLUE) // "Lights out!" - - wait_until(690, 0x66) - play_sound(SFX_0428, -1) - - wait_until(720, 0x67) - play_sound(SFX_ARGH_DRCAROLL_0250, 10) - - wait_until(850, 0x68) - play_sound(SFX_0430, -1) - - wait_until(880, 0x69) - play_sound(SFX_0429, -1) - - wait_until(890, 0x6a) - close_door(0x0c) - - wait_until(1000, 0x6b) - speak(CHR_BOND, L_ARK_062, MP3_03F5, CHANNEL_7, COLOR_09_BLUE) // "What the...?" - - beginloop(0x21) - if_camera_animating(/*goto*/ 0x20) - goto_next(0x5d) - - label(0x20) - endloop(0x21) - - label(0x5d) - set_stage_flag(STAGEFLAG_FOYER_LIGHTS_OFF) - mute_channel(CHANNEL_10) - mute_channel(CHANNEL_7) - - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_INTRO_DRC, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) - - unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_INVINCIBLE) - set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_PERIMDISABLEDTMP) - chr_do_animation(ANIM_CUT_ARK_INTRO_GUARD_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) - - stop_cutscene_track - stop_ambient_track - enter_firstperson - yield - chr_do_animation(ANIM_CUT_ARK_INTRO_GUARD_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) - set_ailist(CHR_DRCAROLL, 0x0402) - yield - kill(CHR_INTRO_GUARD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_outro[] = { - play_cutscene_track(MUSIC_EXTRACTION_OUTRO) - play_temporary_track(MUSIC_EXTRACTION_OUTRO_SFX) - camera_movement(ANIM_CUT_ARK_OUTRO_CAM) - set_object_flag2(OBJ_HOVERCOPTER, OBJFLAG2_INVISIBLE) - disable_object(OBJ_HOVERCOPTER) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CASS, CHRCFLAG_INVINCIBLE) - chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) - set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_OUTRO_GUARD1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_OUTRO_GUARD2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_INVINCIBLE) - - set_ailist(CHR_DRCAROLL, GAILIST_IDLE) - set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_OUTRO_DRC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 4) - - set_ailist(CHR_CASS, AILIST_CASS_OUTRO) - set_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_OUTRO_CASS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 4) - - set_ailist(CHR_MRBLONDE, GAILIST_IDLE) - set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_OUTRO_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MRBLONDE, 4) - - set_ailist(CHR_OUTRO_GUARD1, GAILIST_IDLE) - set_chr_chrflag(CHR_OUTRO_GUARD1, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_OUTRO_GUARD1, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_OUTRO_GUARD1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_OUTRO_GUARD1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD1, 4) - - set_ailist(CHR_OUTRO_GUARD2, GAILIST_IDLE) - set_chr_chrflag(CHR_OUTRO_GUARD2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_OUTRO_GUARD2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_OUTRO_GUARD2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_OUTRO_GUARD2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD2, 4) - - enable_object(OBJ_JUMPSHIP) - set_object_flag3(OBJ_JUMPSHIP, OBJFLAG3_00000010) - set_object_flag2(OBJ_JUMPSHIP, OBJFLAG2_04000000) - object_do_animation(ANIM_CUT_ARK_OUTRO_DROPSHIP, OBJ_JUMPSHIP, 0x04, 0xffff) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ARK_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - show_nonessential_chrs(FALSE) - restart_timer - set_cutscene_weapon(CHR_P1P2, -1, -1) - yield - set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2_SCOPE) - - #define outro_wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x5d) \ - if_timer_gt(time, /*goto*/ 0x00) \ - endloop(loopid) \ - label(0x00) - - outro_wait_until(0, 0x5f) - outro_wait_until(20, 0x5f) - outro_wait_until(47, 0x7e) - outro_wait_until(90, 0x7f) - - outro_wait_until(120, 0x60) - speak(CHR_P1P2, L_ARK_063, MP3_03F6, CHANNEL_7, COLOR_04_ORANGE) // "Going somewhere?" - - outro_wait_until(188, 0x61) - play_sound(SFX_01D9, -1) - - outro_wait_until(350, 0x62) - speak(CHR_P1P2, L_ARK_064, MP3_03F7, CHANNEL_7, COLOR_09_BLUE) // "Something I can do for you, old woman?" - - outro_wait_until(500, 0x63) - speak(CHR_P1P2, L_ARK_065, MP3_03F8, CHANNEL_7, COLOR_04_ORANGE) // "Return our sapient immediately! You don't know wha..." - - outro_wait_until(720, 0x64) - play_sound(SFX_0424, -1) - - outro_wait_until(740, 0x65) - speak(CHR_P1P2, L_ARK_066, MP3_03F9, CHANNEL_7, COLOR_09_BLUE) // "Yes I do. I'm leaving." - - outro_wait_until(858, 0x73) - - outro_wait_until(980, 0x66) - speak(CHR_P1P2, L_ARK_067, MP3_03FA, CHANNEL_7, COLOR_04_ORANGE) // "One more chance! Give it back, and you could come ..." - - outro_wait_until(990, 0x68) - play_sound(SFX_RELOAD_DEFAULT, -1) - - outro_wait_until(1220, 0x69) - - outro_wait_until(1240, 0x6a) - - outro_wait_until(1348, 0x6b) - play_sound(SFX_FOOTSTEP_80C8, -1) - - outro_wait_until(1380, 0x80) - play_sound(SFX_FOOTSTEP_80C9, -1) - - outro_wait_until(1400, 0x81) - set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD1, TRUE) - - yield - yield - set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD1, FALSE) - - outro_wait_until(1420, 0x82) - set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD2, TRUE) - - yield - yield - set_chr_shooting_in_cutscene(CHR_OUTRO_GUARD2, FALSE) - - outro_wait_until(1425, 0x6c) - speak(CHR_P1P2, L_ARK_068, MP3_03FB, CHANNEL_7, COLOR_09_BLUE) // "Sorry! Gotta shoot." - - outro_wait_until(1447, 0x6d) - play_sound(SFX_FOOTSTEP_80CA, -1) - - outro_wait_until(1486, 0x83) - play_sound(SFX_FOOTSTEP_80CB, -1) - - outro_wait_until(1505, 0x6e) - play_sound(SFX_FIRE_SHOTGUN, CHANNEL_10) - - outro_wait_until(1520, 0x6f) - play_sound(SFX_FIRE_SHOTGUN, CHANNEL_10) - - outro_wait_until(1526, 0x70) - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - - yield - yield - set_chr_shooting_in_cutscene(CHR_BOND, FALSE) - - outro_wait_until(1538, 0x84) - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - - yield - yield - set_chr_shooting_in_cutscene(CHR_BOND, FALSE) - - outro_wait_until(1554, 0x71) - play_sound(SFX_ARGH_FEMALE_000D, CHANNEL_10) - - outro_wait_until(1600, 0x74) - play_sound(SFX_ARGH_FEMALE_000E, CHANNEL_10) - - outro_wait_until(1734, 0x72) - play_sound(SFX_THUD_808D, CHANNEL_10) - - outro_wait_until(1890, 0x75) - play_sound(SFX_0425, -1) - - outro_wait_until(1940, 0x77) - speak(CHR_P1P2, L_ARK_069, MP3_03FC, CHANNEL_7, COLOR_03_RED) // "You must get the sapient back. We cannot proceed w..." - - outro_wait_until(1944, 0x76) - play_sound(SFX_FOOTSTEP_80C4, -1) - - outro_wait_until(1970, 0x85) - play_sound(SFX_FOOTSTEP_80C5, -1) - - outro_wait_until(2008, 0x86) - play_sound(SFX_FOOTSTEP_80C6, -1) - - outro_wait_until(2190, 0x78) - speak(CHR_P1P2, L_ARK_070, MP3_03FD, CHANNEL_7, COLOR_04_ORANGE) // "I know that!" - - outro_wait_until(2300, 0x79) - play_sound(SFX_FOOTSTEP_80C7, -1) - - outro_wait_until(2317, 0x87) - play_sound(SFX_DISGUISE_ON, -1) - - outro_wait_until(2324, 0x88) - play_sound(SFX_FOOTSTEP_80C4, -1) - - outro_wait_until(2340, 0x7a) - play_sound(SFX_FOOTSTEP_80C7, -1) - - outro_wait_until(2344, 0x7b) - - outro_wait_until(2393, 0x7c) - speak(CHR_P1P2, L_ARK_071, MP3_03FE, CHANNEL_7, COLOR_04_ORANGE) // "I also know who to talk to... Mr. Carrington." - - outro_wait_until(2497, 0x7d) - - beginloop(0x21) - if_camera_animating(/*goto*/ 0x20) - goto_next(0x5d) - label(0x20) - if_controller_button_pressed(/*goto*/ 0x5d) - endloop(0x21) - - label(0x5d) - disable_object(OBJ_JUMPSHIP) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0413_defend_pad[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(10) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_shotlist(AILIST_GENERAL_COMBAT) - - beginloop(0x1f) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x21) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x21) - if_distance_from_target_to_pad_lt(200, PAD_PRESET, /*goto*/ 0x22) - endloop(0x1f) - - label(0x21) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - - label(0x22) - go_to_target_pad(GOPOSFLAG_RUN) - - beginloop(0x23) - if_chr_stopped(/*goto*/ 0x00) - if_can_see_target(/*goto*/ 0x00) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x00) - endloop(0x23) - - label(0x00) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - endlist -}; - -u8 func100f_move_rocket_ammo[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Agent only - label(0x00) - move_object_to_pad(OBJ_ROCKETAMMO1, PAD_ARK_000F) - move_object_to_pad(OBJ_ROCKETAMMO2, PAD_ARK_000D) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_cass_outro[] = { - set_shield(0) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_TECH1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_TECH2, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func0414_init_shock[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(10) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(10) - set_shield(0) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - endlist -}; - -/** - * @unused - */ -u8 func0415_init_10hp[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(10) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_GENERAL_COMBAT) - endlist -}; - -u8 func1012_msg_lockeddown[] = { - beginloop(0x1f) - if_chr_in_room(CHR_BOND, 0x00, 0x0023, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - speak(CHR_BOND, L_ARK_051, SFX_8176, CHANNEL_6, COLOR_09_BLUE) // "They've locked down the ground floor - get to the ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_msg_thatcopter[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x26) - - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_SAID_SURRENDER_OR_DIE, TRUE, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - restart_timer - - beginloop(0x21) - if_timer_gt(300, /*goto*/ 0x20) - endloop(0x21) - - label(0x20) - speak(CHR_BOND, L_ARK_052, SFX_8177, CHANNEL_6, COLOR_09_BLUE) // "That copter needs to be taken out, or the jumpship..." - - label(0x26) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_msg_cantleaveany[] = { - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CANTLEAVEANY_MSG, TRUE, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - if_chr_deadish(CHR_BOND, /*goto*/ 0x26) - restart_timer - - beginloop(0x21) - if_timer_gt(120, /*goto*/ 0x20) - endloop(0x21) - - label(0x20) - if_chr_deadish(CHR_BOND, /*goto*/ 0x26) - speak(CHR_BOND, L_ARK_053, MP3_03AA, CHANNEL_6, COLOR_09_BLUE) // "I can't leave any bodyguards standing." - - label(0x26) - if_chr_deadish(CHR_BOND, /*goto*/ 0x27) - - beginloop(0x5f) - if_chr_deadish(CHR_BOND, /*goto*/ 0x27) - if_sound_finished(CHANNEL_6, /*goto*/ 0x20) - endloop(0x5f) - - label(0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x27) - mute_channel(CHANNEL_6) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_msg_jumpshipwaiting[] = { - beginloop(0x1f) - if_objective_failed(0, /*goto*/ 0x00) - if_objective_failed(1, /*goto*/ 0x00) - if_objective_failed(2, /*goto*/ 0x00) - if_objective_failed(3, /*goto*/ 0x00) - if_objective_failed(4, /*goto*/ 0x00) - if_chr_in_room(CHR_BOND, 0x00, 0x0002, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - speak(CHR_BOND, L_ARK_054, SFX_8178, CHANNEL_6, COLOR_09_BLUE) // "Don't keep the jumpship waiting - get back to the ..." - - label(0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_msg_make_foyer_guards_alerted[] = { - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_ACCESSED_FOYER_ELEVATOR, TRUE, /*goto*/ 0x20) - endloop(0x1f) - - #define if_alive_set_alerted(chr) \ - if_chr_deadish(chr, /*goto*/ 0x20) \ - set_ailist(chr, GAILIST_ALERTED) \ - increase_chr_alertness(100, chr) \ - label(0x20) - - label(0x20) - if_alive_set_alerted(0x01) - if_alive_set_alerted(0x02) - if_alive_set_alerted(0x03) - if_alive_set_alerted(0x04) - if_alive_set_alerted(0x05) - if_alive_set_alerted(0x06) - if_alive_set_alerted(0x07) - if_alive_set_alerted(0x08) - if_alive_set_alerted(0x09) - if_alive_set_alerted(0x0a) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_remove_special_shock[] = { - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_DRCAROLL_ATTACKED, TRUE, /*goto*/ 0x00) - if_stage_flag_eq(STAGEFLAG_FOYER_LIGHTS_RESTORED, TRUE, /*goto*/ 0x00) - - if_chr_deadish(0x01, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x02, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x03, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x04, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x05, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x06, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x07, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x08, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x09, /*goto*/ 0x20) - reloop(0x1f) - label(0x20) - - if_chr_deadish(0x0a, /*goto*/ 0x20) - endloop(0x1f) - - label(0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x00) - remove_chr(CHR_SPECIAL_SHOCK) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_give_magnum[] = { - beginloop(0x1f) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED, /*goto*/ 0x00) - endloop(0x1f) - - // Player has been seen - remove Dy357 from shock trooper - label(0x00) - give_object_to_chr(OBJ_DY357, CHR_MRBLONDE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1419_start_lifts[] = { - activate_lift(2, 0x1d) - activate_lift(1, 0x1e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_set_rocketlauncher_flag[] = { - yield - if_difficulty_lt(DIFF_SA, /*goto*/ 0x20) - - // SA and PA - set_object_flag2(OBJ_ROCKETLAUNCHER, OBJFLAG2_AICANNOTUSE) - - label(0x20) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101b_lift_door_sounds[] = { - beginloop(0x8d) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x23, /*goto*/ 0x20) - if_chr_activated_object(CHR_P1P2, 0x27, /*goto*/ 0x5e) - if_chr_activated_object(CHR_P1P2, 0x20, /*goto*/ 0x20) - if_chr_activated_object(CHR_P1P2, 0x24, /*goto*/ 0x25) - if_chr_activated_object(CHR_P1P2, 0x21, /*goto*/ 0x5e) - if_chr_activated_object(CHR_P1P2, 0x25, /*goto*/ 0x26) - if_chr_activated_object(CHR_P1P2, 0x22, /*goto*/ 0x5e) - if_chr_activated_object(CHR_P1P2, 0x26, /*goto*/ 0x5e) - reloop(0x8d) - - label(0x25) - if_door_locked(0x24, 0x01, /*goto*/ 0x5e) - goto_next(0x20) - - label(0x26) - if_door_locked(0x25, 0x01, /*goto*/ 0x5e) - goto_next(0x20) - - label(0x20) - play_sound(SFX_DOOR_81B0, -1) - goto_next(0x00) - - label(0x5e) - play_sound(SFX_MENU_SELECT, -1) - label(0x00) - restart_timer - - beginloop(0x21) - if_timer_gt(120, /*goto*/ 0x00) - endloop(0x21) - - label(0x00) - endloop(0x8d) - - endlist -}; - -u8 func141c_setup_portals[] = { - yield - set_portal_flag(0x008e, PORTALFLAG_SKIP) - set_portal_flag(0x008f, PORTALFLAG_SKIP) - set_portal_flag(0x0084, PORTALFLAG_SKIP) - set_portal_flag(0x0090, PORTALFLAG_SKIP) - set_portal_flag(0x0091, PORTALFLAG_SKIP) - set_portal_flag(0x0093, PORTALFLAG_SKIP) - set_portal_flag(0x0096, PORTALFLAG_SKIP) - set_portal_flag(0x0095, PORTALFLAG_SKIP) - set_portal_flag(0x0099, PORTALFLAG_SKIP) - set_portal_flag(0x00b6, PORTALFLAG_SKIP) - set_portal_flag(0x00bf, PORTALFLAG_SKIP) - set_portal_flag(0x00be, PORTALFLAG_SKIP) - set_portal_flag(0x00c0, PORTALFLAG_SKIP) - set_portal_flag(0x00c2, PORTALFLAG_SKIP) - set_portal_flag(0x00c4, PORTALFLAG_SKIP) - set_portal_flag(0x00c8, PORTALFLAG_SKIP) - set_portal_flag(0x00c7, PORTALFLAG_SKIP) - set_portal_flag(0x00c9, PORTALFLAG_SKIP) - set_portal_flag(0x00cd, PORTALFLAG_SKIP) - set_portal_flag(0x00ce, PORTALFLAG_SKIP) - set_portal_flag(0x00d2, PORTALFLAG_SKIP) - set_portal_flag(0x00e0, PORTALFLAG_SKIP) - set_portal_flag(0x00dc, PORTALFLAG_SKIP) - set_portal_flag(0x00de, PORTALFLAG_SKIP) - set_portal_flag(0x00e3, PORTALFLAG_SKIP) - set_portal_flag(0x00e5, PORTALFLAG_SKIP) - set_portal_flag(0x00e7, PORTALFLAG_SKIP) - set_portal_flag(0x00fb, PORTALFLAG_SKIP) - set_portal_flag(0x00fa, PORTALFLAG_SKIP) - set_portal_flag(0x00fc, PORTALFLAG_SKIP) - set_portal_flag(0x00ff, PORTALFLAG_SKIP) - set_portal_flag(0x0100, PORTALFLAG_SKIP) - set_portal_flag(0x0103, PORTALFLAG_SKIP) - set_portal_flag(0x0102, PORTALFLAG_SKIP) - set_portal_flag(0x0104, PORTALFLAG_SKIP) - set_portal_flag(0x0109, PORTALFLAG_SKIP) - set_portal_flag(0x010c, PORTALFLAG_SKIP) - set_portal_flag(0x0119, PORTALFLAG_SKIP) - set_portal_flag(0x0112, PORTALFLAG_SKIP) - set_portal_flag(0x0117, PORTALFLAG_SKIP) - set_portal_flag(0x0120, PORTALFLAG_SKIP) - set_portal_flag(0x011e, PORTALFLAG_SKIP) - set_portal_flag(0x011c, PORTALFLAG_SKIP) - set_portal_flag(0x0108, PORTALFLAG_SKIP) - set_portal_flag(0x006f, PORTALFLAG_SKIP) - set_portal_flag(0x007d, PORTALFLAG_SKIP) - set_portal_flag(0x0080, PORTALFLAG_SKIP) - set_portal_flag(0x0081, PORTALFLAG_SKIP) - set_portal_flag(0x0075, PORTALFLAG_SKIP) - set_portal_flag(0x0078, PORTALFLAG_SKIP) - set_portal_flag(0x0079, PORTALFLAG_SKIP) - set_portal_flag(0x0006, PORTALFLAG_SKIP) - set_portal_flag(0x0004, PORTALFLAG_SKIP) - set_portal_flag(0x0008, PORTALFLAG_SKIP) - set_portal_flag(0x000a, PORTALFLAG_SKIP) - set_portal_flag(0x0001, PORTALFLAG_SKIP) - set_portal_flag(0x0005, PORTALFLAG_SKIP) - set_portal_flag(0x0000, PORTALFLAG_SKIP) - set_portal_flag(0x0003, PORTALFLAG_SKIP) - set_portal_flag(0x0007, PORTALFLAG_SKIP) - set_portal_flag(0x0013, PORTALFLAG_SKIP) - set_portal_flag(0x0009, PORTALFLAG_SKIP) - set_portal_flag(0x00b1, PORTALFLAG_SKIP) - set_portal_flag(0x00ef, PORTALFLAG_SKIP) - set_portal_flag(0x00ee, PORTALFLAG_SKIP) - set_portal_flag(0x0121, PORTALFLAG_SKIP) - set_portal_flag(0x00e8, PORTALFLAG_SKIP) - set_portal_flag(0x00e9, PORTALFLAG_SKIP) - set_portal_flag(0x00ea, PORTALFLAG_SKIP) - set_portal_flag(0x00ec, PORTALFLAG_SKIP) - set_portal_flag(0x00eb, PORTALFLAG_SKIP) - set_portal_flag(0x00ed, PORTALFLAG_SKIP) - set_portal_flag(0x009d, PORTALFLAG_SKIP) - set_portal_flag(0x00af, PORTALFLAG_SKIP) - set_portal_flag(0x00a1, PORTALFLAG_SKIP) - set_portal_flag(0x005a, PORTALFLAG_SKIP) - set_portal_flag(0x005c, PORTALFLAG_SKIP) - set_portal_flag(0x005d, PORTALFLAG_SKIP) - set_portal_flag(0x0060, PORTALFLAG_SKIP) - set_portal_flag(0x0034, PORTALFLAG_SKIP) - set_portal_flag(0x0030, PORTALFLAG_SKIP) - set_portal_flag(0x002e, PORTALFLAG_SKIP) - set_portal_flag(0x002b, PORTALFLAG_SKIP) - set_portal_flag(0x0028, PORTALFLAG_SKIP) - set_portal_flag(0x0025, PORTALFLAG_SKIP) - set_portal_flag(0x0036, PORTALFLAG_SKIP) - set_portal_flag(0x0038, PORTALFLAG_SKIP) - set_portal_flag(0x004f, PORTALFLAG_SKIP) - set_portal_flag(0x0051, PORTALFLAG_SKIP) - set_portal_flag(0x0052, PORTALFLAG_SKIP) - set_portal_flag(0x0057, PORTALFLAG_SKIP) - set_portal_flag(0x0058, PORTALFLAG_SKIP) - set_portal_flag(0x0031, PORTALFLAG_SKIP) - set_portal_flag(0x002f, PORTALFLAG_SKIP) - set_portal_flag(0x0023, PORTALFLAG_SKIP) - set_portal_flag(0x00a6, PORTALFLAG_SKIP) - set_portal_flag(0x00a3, PORTALFLAG_SKIP) - set_portal_flag(0x00a2, PORTALFLAG_SKIP) - set_portal_flag(0x00a4, PORTALFLAG_SKIP) - set_portal_flag(0x0087, PORTALFLAG_SKIP) - set_portal_flag(0x00b9, PORTALFLAG_SKIP) - set_portal_flag(0x00b4, PORTALFLAG_SKIP) - set_portal_flag(0x00b2, PORTALFLAG_SKIP) - set_portal_flag(0x00b3, PORTALFLAG_SKIP) - set_portal_flag(0x00bd, PORTALFLAG_SKIP) - set_portal_flag(0x00f4, PORTALFLAG_SKIP) - set_portal_flag(0x00f2, PORTALFLAG_SKIP) - set_portal_flag(0x00f0, PORTALFLAG_SKIP) - set_portal_flag(0x00f8, PORTALFLAG_SKIP) - set_portal_flag(0x00f1, PORTALFLAG_SKIP) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func141e_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, TRUE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_setup_rtracker[] = { - yield - set_object_flag3(OBJ_GRENADE, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_DRAGON, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_drcaroll_following, 0x0401 }, - { func0402_start_drcaroll, 0x0402 }, - { func0403_stop_and_idle, 0x0403 }, - { func0404_init_drcaroll, 0x0404 }, - { func0409_tech_conversation, 0x0409 }, - { func040a_tech2, 0x040a }, - { func040b_init_tech1, 0x040b }, - { func040c_init_tech2, 0x040c }, - { func040d_cass, 0x040d }, - { func040e_noop2, 0x040e }, - { func0405_drcaroll_waiting, 0x0405 }, - { func0411_top_guard_blinded, 0x0411 }, - { func0412_outro, 0x0412 }, - { func0414_init_shock, 0x0414 }, - { func0415_init_10hp, 0x0415 }, - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_check_accessed_foyer_elevator, 0x1002 }, - { func1003_check_end_level, 0x1003 }, - { func1004_elevator_unlocking, 0x1004 }, - { func1005_check_bodyguards_dead, 0x1005 }, - { func1006_check_hovercopter_destroyed, 0x1006 }, - { func1007_noop, 0x1007 }, - { func1008_trigger_hovercopter_roof, 0x1008 }, - { func1009_init_top_room, 0x1009 }, - { func100a_lightswitch, 0x100a }, - { func100b_check_top_lights_on, 0x100b }, - { func100c_foyer_lights, 0x100c }, - { func100d_intro, 0x100d }, - { func100e_drcaroll_warnings, 0x100e }, - { func100f_move_rocket_ammo, 0x100f }, - { func100c_foyer_lights_timer, 0x1010 }, - { func040d_cass_necklace, 0x1011 }, - { func1012_msg_lockeddown, 0x1012 }, - { func1013_msg_thatcopter, 0x1013 }, - { func1014_msg_cantleaveany, 0x1014 }, - { func1015_msg_jumpshipwaiting, 0x1015 }, - { func1016_msg_make_foyer_guards_alerted, 0x1016 }, - { func1017_remove_special_shock, 0x1017 }, - { func1018_give_magnum, 0x1018 }, - { func1419_start_lifts, 0x1419 }, - { func101a_set_rocketlauncher_flag, 0x101a }, - { func101b_lift_door_sounds, 0x101b }, - { func141c_setup_portals, 0x141c }, - { func101d_setup_rtracker, 0x101d }, - { func141e_setup_environment, 0x141e }, - { func101f_unlock_top_door, 0x101f }, - { func040d_cass_outro, 0x0407 }, - { func0406_general_combat, 0x0406 }, - { func040f_top_guard, 0x040f }, - { func0410_init_top_guard, 0x0410 }, - { func0413_defend_pad, 0x0413 }, - { func0408_hovercopter, 0x0408 }, - { func100d_intro, 0x0c00 }, - { func0412_outro, 0x0c01 }, - { NULL, 0 }, -}; diff --git a/src/setups/setupash.c b/src/setups/setupash.c index db9d59704..fb98ec562 100644 --- a/src/setups/setupash.c +++ b/src/setups/setupash.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupate.c b/src/setups/setupate.c index 7803d9f56..b7a32cde4 100644 --- a/src/setups/setupate.c +++ b/src/setups/setupate.c @@ -37,7 +37,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -81,504 +81,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_counterop_setup[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1001_objectives_failed[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1002_first_walk[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - camera_movement(ANIM_CUT_ATE_INTRO_CAM) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - show_hudmsg_middle(0x00, COLOR_02_WHITE, L_ATE_007) // "THE DUEL" - chr_do_animation(ANIM_RELOAD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_GUARD, 2) - label(0x2d) - show_hudmsg(CHR_BOND, L_ATE_012) // "Opponent skill level: AGENT" - - // Wait for camera to stop animating - restart_timer - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x06) - label(0x2d) - endloop(0x08) - - // Start walking - label(0x06) - remove_hudmsgs - revoke_control(CHR_BOND, 0) - enter_firstperson - force_walk(CHR_BOND, 0x0275, 40, 5, 0, 100) - chr_move_to_pad(CHR_GUARD, PAD_ATE_0274, 0x01, /*goto*/ 0x0b) - - // Wait for walk to finish - beginloop(0x0b) - if_force_walk_finished(CHR_BOND, /*goto*/ 0x0c) - endloop(0x0b) - - label(0x0c) - grant_control(CHR_BOND) - set_ailist(CHR_GUARD, AILIST_GUARD_COMBAT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_second_walk[] = { - // Wait until SA walk trigger - beginloop(0x58) - if_chr_dead(CHR_BOND, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_SA_WALK_TRIGGER, TRUE, /*goto*/ 0x06) - endloop(0x58) - - // Begin cutscene - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x06) - revoke_control(CHR_BOND, 0) - camera_movement(ANIM_CUT_ATE_INTRO_CAM) - - // Place chrs - label(0x8f) - set_ailist(CHR_P1P2, AILIST_MOVE_TO_PAD) - chr_move_to_pad(CHR_JONATHAN, PAD_ATE_0279, 0x01, /*goto*/ 0x2d) - yield - goto_first(0x8f) - - label(0x2d) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNEXPLODABLE) - yield - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_GRAB_CROTCH, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 2) - - label(0x2d) - show_hudmsg(CHR_BOND, L_ATE_013) // "Opponent skill level: SPECIAL AGENT" - restart_timer - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x06) - label(0x2d) - endloop(0x08) - - // Start force walk - label(0x06) - label(0x2d) - remove_hudmsgs - revoke_control(CHR_BOND, 0) - enter_firstperson - yield - force_walk(CHR_BOND, 0x0275, 40, 5, 0, 100) - - // Place Jon - call_rng - if_rand_lt(128, /*goto*/ 0x8f) - chr_move_to_pad(CHR_JONATHAN, PAD_ATE_0271, 0x01, /*goto*/ 0x0b) - label(0x8f) - chr_move_to_pad(CHR_JONATHAN, PAD_ATE_0270, 0x01, /*goto*/ 0x0b) - - // Wait for force walk to finish - beginloop(0x0b) - if_force_walk_finished(CHR_BOND, /*goto*/ 0x0c) - endloop(0x0b) - - // Give control back to Jo - label(0x0c) - grant_control(CHR_BOND) - set_ailist(CHR_JONATHAN, AILIST_JON_COMBAT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0401_move_to_pad[] = { - chr_move_to_pad(CHR_SELF, PAD_ATE_027A, 0x01, /*goto*/ 0x06) - label(0x06) - yield - stop_chr - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_third_walk[] = { - // Wait for flag or Jo dying - beginloop(0x58) - if_chr_dead(CHR_BOND, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_PA_WALK_TRIGGER, TRUE, /*goto*/ 0x06) - endloop(0x58) - - // Jo dead - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Do cutscene - label(0x06) - revoke_control(CHR_BOND, 0) - camera_movement(ANIM_CUT_ATE_INTRO_CAM) - - label(0x8f) - set_ailist(CHR_P1P2, AILIST_MOVE_TO_PAD) - chr_move_to_pad(CHR_TRENT, PAD_ATE_0279, 0x01, /*goto*/ 0x2d) - yield - goto_first(0x8f) - - label(0x2d) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_UNEXPLODABLE) - yield - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_HEAD_ROLL, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 2) - label(0x2d) - show_hudmsg(CHR_BOND, L_ATE_014) // "Opponent skill level: PERFECT AGENT" - - // Wait for cutscene to finish - restart_timer - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x06) - label(0x2d) - endloop(0x08) - - // Begin force walk - label(0x06) - remove_hudmsgs - revoke_control(CHR_BOND, 0) - enter_firstperson - force_walk(CHR_BOND, 0x0275, 40, 5, 0, 100) - chr_move_to_pad(CHR_TRENT, PAD_ATE_0272, 0x01, /*goto*/ 0x0b) - - beginloop(0x0b) - if_force_walk_finished(CHR_BOND, /*goto*/ 0x0c) - endloop(0x0b) - - label(0x0c) - set_ailist(CHR_TRENT, AILIST_TRENT_COMBAT) - grant_control(CHR_BOND) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_revoke_control[] = { - yield - revoke_control(CHR_BOND, 0) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_main[] = { - // Wait until guard dead - beginloop(0x04) - if_chr_deadish(CHR_GUARD, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - show_hudmsg(CHR_BOND, L_ATE_009) // "Well done! You were too quick for him!" - set_stage_flag(STAGEFLAG_GUARD_DEAD) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x08) - - // If Agent, return - label(0x2d) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_stage_flag(STAGEFLAG_SA_WALK_TRIGGER) - - // Wait until Jonathan dead - beginloop(0x09) - if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - show_hudmsg(CHR_BOND, L_ATE_010) // "Well done! You were too quick for him!" - set_stage_flag(STAGEFLAG_JONATHAN_DEAD) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x0b) - - // If Special Agent, return - label(0x2d) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_stage_flag(STAGEFLAG_PA_WALK_TRIGGER) - - // Wait until Trent dead - beginloop(0x0c) - if_chr_deadish(CHR_TRENT, /*goto*/ 0x2d) - endloop(0x0c) - - label(0x2d) - show_hudmsg(CHR_BOND, L_ATE_011) // "Well done! You were too quick for him!" - set_stage_flag(STAGEFLAG_TRENT_DEAD) - restart_timer - - beginloop(0x0d) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x0d) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_init_audio[] = { - stop_cutscene_track - stop_ambient_track - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_check_objectives_complete[] = { - // Wait for all objectives complete - beginloop(0x04) - if_all_objectives_complete(/*goto*/ 0x2d) - endloop(0x04) - - // Wait 3 seconds - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x08) - - // End level - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_guard_combat[] = { - set_shotlist(AILIST_GUARD_COMBAT) - if_just_injured(CHR_SELF, /*goto*/ 0x03) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PERFECTACCURACY) - - // Wait 2 seconds or for guard to come into view - restart_timer - - beginloop(0x04) - if_timer_gt(120, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x2d) - endloop(0x04) - - // Guard has come into view. Jump sideways. - label(0x2d) - try_sidestep(/*goto*/ 0x08) - - beginloop(0x08) - if_distance_to_target_lt(250, /*goto*/ 0x0e) - if_chr_stopped(/*goto*/ 0x03) - endloop(0x08) - - // Guard has been shot, or finished jump - beginloop(0x03) - if_distance_to_target_lt(250, /*goto*/ 0x0e) - if_can_see_target(/*goto*/ 0x06) - reloop(0x03) - - // 2 seconds have passed without seeing guard, or guard has been shot - label(0x06) - if_chr_dead(CHR_TARGET, /*goto*/ 0x2e) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2d) - label(0x2d) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - // Finished shooting - label(0x06) - endloop(0x03) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Hand combat - label(0x0e) - set_returnlist(CHR_SELF, AILIST_TRENT_COMBAT) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - endlist -}; - -u8 func0403_jon_combat[] = { - set_shotlist(AILIST_JON_COMBAT) - if_just_injured(CHR_SELF, /*goto*/ 0x58) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PERFECTACCURACY) - restart_timer - - beginloop(0x04) - if_timer_gt(240, /*goto*/ 0x58) - if_nearly_in_targets_sight(30, /*goto*/ 0x58) - endloop(0x04) - - label(0x58) - try_run_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_distance_to_target_lt(250, /*goto*/ 0x0e) - if_can_see_attack_target(/*goto*/ 0x06) - reloop(0x08) - - label(0x06) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2d) - label(0x2d) - try_attack_roll(/*goto*/ 0x0c) - try_attack_kneel(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - endloop(0x58) - - label(0x0e) - set_returnlist(CHR_SELF, AILIST_JON_COMBAT) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0404_trent_combat[] = { - set_shotlist(AILIST_TRENT_COMBAT) - if_just_injured(CHR_SELF, /*goto*/ 0x03) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_PERFECTACCURACY) - restart_timer - - beginloop(0x04) - if_timer_gt(120, /*goto*/ 0x03) - if_chr_in_view(/*goto*/ 0x03) - endloop(0x04) - - // Wait until player in sight or in close range - beginloop(0x03) - if_distance_to_target_lt(250, /*goto*/ 0x0e) - if_can_see_target(/*goto*/ 0x06) - reloop(0x03) - - // Attack - label(0x06) - if_chr_dead(CHR_TARGET, /*goto*/ 0x2e) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2d) - label(0x2d) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - endloop(0x03) - - // Hand combat - label(0x0e) - set_returnlist(CHR_SELF, AILIST_TRENT_COMBAT) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0405_guard_init[] = { - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - // @bug: The value for set_accuracy is interpreted as a signed byte, - // so 200 is interpreted as -56 which reduces the chr's accuracy. - // However this isn't an issue because the chr has CHRHFLAG_PERFECTACCURACY. - // This bug is repeated for Jon and Trent below. - set_accuracy(200) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 20) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0406_jon_init[] = { - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - set_accuracy(200) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0407_trent_init[] = { - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - set_accuracy(200) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_counterop_setup, 0x1000 }, - { func1001_objectives_failed, 0x1001 }, - { func1002_first_walk, 0x1002 }, - { func1003_init_audio, 0x1003 }, - { func1004_revoke_control, 0x1004 }, - { func1005_main, 0x1005 }, - { func1006_check_objectives_complete, 0x1006 }, - { func1007_second_walk, 0x1007 }, - { func1008_third_walk, 0x1008 }, - { func0401_move_to_pad, 0x0401 }, - { func0402_guard_combat, 0x0402 }, - { func0403_jon_combat, 0x0403 }, - { func0404_trent_combat, 0x0404 }, - { func0405_guard_init, 0x0405 }, - { func0406_jon_init, 0x0406 }, - { func0407_trent_init, 0x0407 }, - { NULL, 0 }, -}; diff --git a/src/setups/setupazt.c b/src/setups/setupazt.c index bdf8bd9c7..5d7a228af 100644 --- a/src/setups/setupazt.c +++ b/src/setups/setupazt.c @@ -118,7 +118,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -446,1700 +446,3 @@ struct path paths[] = { { path12, 12, 0 }, { NULL, 0, 0 }, }; - -u8 func1001_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_PRES_CLONE, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1011_setup_snow[] = { - enable_snow(TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_CRASHSITE_INTRO) - camera_movement(ANIM_CUT_AZT_INTRO_CAM) - cmd0175(60) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_hudpiece_visible(CHR_BOND, TRUE) - - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 300) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x65) \ - if_timer_gt(time, /*goto*/ 0x08) \ - endloop(loopid) \ - label(0x08) - - wait_until(724, 0x69) - speak(CHR_BOND, L_AZT_032, MP3_0759, CHANNEL_10, COLOR_09_BLUE) // "Ahhh... uuhhhh..." - - wait_until(830, 0x6a) - speak(CHR_BOND, L_AZT_034, MP3_0457, CHANNEL_10, COLOR_06_WHITE) // "Agent Dark! Please report!" - - wait_until(980, 0x6b) - speak(CHR_BOND, L_AZT_033, MP3_075A, CHANNEL_10, COLOR_09_BLUE) // "Ahhh... uhh... owww..." - - wait_until(1030, 0x6c) - speak(CHR_BOND, L_AZT_035, MP3_0458, CHANNEL_10, COLOR_06_WHITE) // "Perfect Dark, come in!" - - wait_until(1152, 0x6e) - speak(CHR_BOND, L_AZT_036, MP3_0459, CHANNEL_10, COLOR_09_BLUE) // "A-agent Dark reporting in..." - - wait_until(1372, 0x6f) - speak(CHR_BOND, L_AZT_037, MP3_045A, CHANNEL_10, COLOR_06_WHITE) // "Agent Dark! Please reply!" - - wait_until(1610, 0x6d) - speak(CHR_BOND, L_AZT_038, MP3_045B, CHANNEL_10, COLOR_09_BLUE) // "Something's jamming my transmissions... It's comin..." - - wait_until(1875, 0x70) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_10, COLOR_00_GREEN) - - wait_until(1900, 0x71) - speak(CHR_BOND, -1, SFX_FOOTSTEP_818A, CHANNEL_10, COLOR_00_GREEN) - - wait_until(1926, 0x72) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8188, CHANNEL_7, COLOR_00_GREEN) - - wait_until(1958, 0x73) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_10, COLOR_00_GREEN) - - wait_until(2000, 0x74) - speak(CHR_BOND, L_AZT_039, MP3_045C, CHANNEL_10, COLOR_09_BLUE) // "I'd better find the jamming device and check that ..." - - wait_until(2116, 0x75) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8188, CHANNEL_7, COLOR_00_GREEN) - - wait_until(2168, 0x76) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8187, CHANNEL_6, COLOR_00_GREEN) - - wait_until(2224, 0x78) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - - wait_until(2305, 0x79) - speak(CHR_BOND, -1, SFX_01DB, CHANNEL_5, COLOR_00_GREEN) - - wait_until(2392, 0x7a) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_7, COLOR_00_GREEN) - - wait_until(2412, 0x7b) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8187, CHANNEL_6, COLOR_00_GREEN) - - wait_until(2460, 0x7c) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8188, CHANNEL_7, COLOR_00_GREEN) - - wait_until(2513, 0x7d) - speak(CHR_BOND, -1, SFX_FOOTSTEP_8189, CHANNEL_6, COLOR_00_GREEN) - - wait_until(2685, 0x7e) - speak(CHR_BOND, -1, SFX_FOOTSTEP_818A, CHANNEL_7, COLOR_00_GREEN) - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x31) - goto_next(0x65) - - label(0x31) - if_controller_button_pressed(/*goto*/ 0x65) - label(0x31) - endloop(0x0a) - - label(0x65) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_10) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - stop_cutscene_track - stop_ambient_track - set_chr_hudpiece_visible(CHR_BOND, FALSE) - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_outro_from_menu[] = { - set_ailist(CHR_PRESIDENT_OUTRO, GAILIST_IDLE) - set_ailist(CHR_MRBLONDE, GAILIST_IDLE) - set_ailist(CHR_SKEDAR, GAILIST_IDLE) - set_ailist(CHR_ELVIS_OUTRO, GAILIST_IDLE) -#if VERSION >= VERSION_NTSC_FINAL - set_ailist(CHR_TRENT_OUTRO, GAILIST_IDLE) -#endif - disable_chr(CHR_ROBOT1) - disable_chr(CHR_ROBOT2) - disable_chr(CHR_ROBOT3) - disable_chr(CHR_ROBOT4) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func0402_outro[] = { - set_stage_flag(STAGEFLAG_OUTRO_STARTED) - disable_object(OBJ_HOVERBIKE) - set_ailist(CHR_PRESIDENT, GAILIST_IDLE) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x31) - set_target_chr(CHR_BOND) - goto_next(0x08) - label(0x31) - set_target_chr(CHR_COOP) - label(0x08) - camera_movement(ANIM_CUT_AZT_OUTRO_CAM) - play_cutscene_track(MUSIC_CRASHSITE_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_ailist(CHR_TARGET, GAILIST_IDLE) - - remove_chr(CHR_ELVIS) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - - set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_PRESIDENT, GAILIST_IDLE) - - set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) - - set_chr_chrflag(CHR_SKEDAR, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_SKEDAR, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR, 4) - - set_chr_chrflag(CHR_ELVIS_OUTRO, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_ELVIS_OUTRO, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS_OUTRO, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS_OUTRO, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS_OUTRO, 4) - -#if VERSION >= VERSION_NTSC_1_0 - set_chr_chrflag(CHR_TRENT_OUTRO, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TRENT_OUTRO, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TRENT_OUTRO, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TRENT_OUTRO, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT_OUTRO, 4) -#else - set_chr_chrflag(CHR_TRENT, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TRENT, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 4) -#endif - - set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_MRBLONDE, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MRBLONDE, 4) - - set_chr_chrflag(CHR_PRESIDENT_OUTRO, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_PRESIDENT_OUTRO, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_PRESIDENT_OUTRO, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_PRESIDENT_OUTRO, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_AZT_OUTRO_PRES, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_PRESIDENT_OUTRO, 4) - - enable_object(0x00) - set_object_flag2(OBJ_CRATE, OBJFLAG2_04000000) - set_object_flag3(OBJ_CRATE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_AZT_OUTRO_CRATE, OBJ_CRATE, 0x04, 0xffff) - restart_timer - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - set_cutscene_weapon(CHR_ELVIS_OUTRO, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS_OUTRO, WEAPON_HAMMER, WEAPON_NONE) - show_nonessential_chrs(FALSE) - - wait_until(146, 0x69) - play_sound(SFX_0594, CHANNEL_7) - - wait_until(200, 0x6a) - play_sound(SFX_0595, CHANNEL_6) - - wait_until(248, 0x6b) - speak(CHR_BOND, L_AZT_040, MP3_045D, CHANNEL_10, COLOR_09_BLUE) // "How are you feeling, Mr. President?" - - wait_until(414, 0x6c) - speak(CHR_BOND, L_AZT_041, MP3_045E, CHANNEL_10, COLOR_08_RED) // "Better now, young lady. Today, I think, will take ..." - - wait_until(490, 0x6e) - play_sound(SFX_0596, CHANNEL_5) - - wait_until(526, 0x6f) - play_sound(SFX_0597, CHANNEL_7) - - wait_until(578, 0x6d) - play_sound(SFX_0427, CHANNEL_6) - - wait_until(1078, 0x71) - play_sound(SFX_0596, CHANNEL_5) - - wait_until(1116, 0x72) - play_sound(SFX_0597, CHANNEL_7) - - wait_until(1200, 0x70) - speak(CHR_BOND, L_AZT_042, MP3_045F, CHANNEL_10, COLOR_09_BLUE) // "Just one thing, sir? What is the Pelagic II that T..." - - wait_until(1474, 0x74) - play_sound(SFX_ELVIS_HEHE, CHANNEL_5) - play_sound(SFX_00F8, CHANNEL_10) - - wait_until(1490, 0x75) - play_sound(SFX_0596, CHANNEL_7) - - wait_until(1492, 0x76) - play_sound(SFX_0594, CHANNEL_6) - - wait_until(1556, 0x77) - play_sound(SFX_00F8, CHANNEL_10) - - wait_until(1626, 0x73) - speak(CHR_BOND, L_AZT_043, MP3_0460, CHANNEL_10, COLOR_08_RED) // "It's a U.S. government deep sea research vessel, o..." - - wait_until(1807, 0x79) - play_sound(SFX_0595, CHANNEL_7) - - wait_until(1850, 0x7a) - play_sound(SFX_0597, CHANNEL_6) - - wait_until(1872, 0x7c) - play_sound(SFX_0595, CHANNEL_7) - - wait_until(2074, 0x7d) - play_sound(SFX_0594, CHANNEL_6) - - wait_until(2270, 0x7e) - play_sound(SFX_0596, CHANNEL_5) - - wait_until(2286, 0x7f) - play_sound(SFX_FOOTSTEP_818A, CHANNEL_7) - - wait_until(2296, 0x80) - play_sound(SFX_FOOTSTEP_8189, CHANNEL_6) - - wait_until(2316, 0x81) - play_sound(SFX_FOOTSTEP_8187, CHANNEL_5) - - wait_until(2335, 0x82) - play_sound(SFX_FOOTSTEP_8188, CHANNEL_7) - - wait_until(2450, 0x7b) - speak(CHR_BOND, L_AZT_044, MP3_0461, CHANNEL_10, COLOR_09_BLUE) // "Trent has a lot to answer for, but I don't think w..." - - wait_until(3150, 0x83) - speak(CHR_BOND, L_AZT_045, MP3_0462, CHANNEL_10, COLOR_03_RED) // "You have failed, Easton. You are a flawed device, ..." - - wait_until(3380, 0x88) - play_sound(SFX_FOOTSTEP_818A, CHANNEL_7) - - wait_until(3580, 0x87) - speak(CHR_BOND, L_AZT_046, MP3_0463, CHANNEL_10, COLOR_05_GREEN) // "Just try it, you Scandinavian freak!" - - wait_until(3747, 0x84) - play_sound(SFX_FOOTSTEP_8189, CHANNEL_5) - - wait_until(3875, 0x85) - play_sound(SFX_FOOTSTEP_8188, CHANNEL_7) - - wait_until(4054, 0x86) - play_sound(SFX_05A0, CHANNEL_5) - play_sound(SFX_CLOAK_OFF, CHANNEL_10) - set_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_CLOAKED) - - wait_until(4100, 0x95) - unset_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_CLOAKED) - play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) - - wait_until(4200, 0x78) - speak(CHR_BOND, L_AZT_047, MP3_0464, CHANNEL_10, COLOR_05_GREEN) // "Noooooooo!!!" - - wait_until(4240, 0x93) - play_sound(SFX_05C0, CHANNEL_10) - - wait_until(4296, 0x89) - play_sound(SFX_007D, CHANNEL_6) - - wait_until(4444, 0x8a) - play_sound(SFX_05A0, CHANNEL_5) - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until(4506, 0x8b) - play_sound(SFX_05A1, CHANNEL_7) - - wait_until(4544, 0x96) - set_chr_hiddenflag(CHR_SKEDAR, CHRHFLAG_CLOAKED) - - wait_until(4566, 0x8c) - play_sound(SFX_CLOAK_ON, CHANNEL_10) - unset_chr_hiddenflag(CHR_MRBLONDE, CHRHFLAG_CLOAKED) - - wait_until(4576, 0x8d) - - wait_until(4622, 0x8e) - play_sound(SFX_FOOTSTEP_8187, CHANNEL_7) - - wait_until(4678, 0x8f) - play_sound(SFX_FOOTSTEP_8188, CHANNEL_7) - - wait_until(4752, 0x90) - play_sound(SFX_FOOTSTEP_8189, CHANNEL_7) - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x31) - goto_next(0x65) - - label(0x31) - if_controller_button_pressed(/*goto*/ 0x65) - label(0x31) - endloop(0x0a) - - label(0x65) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0407_init_blonde[] = { - set_accuracy(20) - set_reaction_speed(55) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(60) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0406_init_stripes[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(16) - set_reaction_speed(55) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1003_msg_therestheescapepod[] = { - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 1000, PAD_AZT_01D8, /*goto*/ 0x31) - endloop(0x06) - - label(0x31) - speak(CHR_P1P2, L_AZT_010, MP3_03CC, CHANNEL_6, COLOR_09_BLUE) // "There's the escape pod." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_msg_maybetheresabeacon[] = { - restart_timer - beginloop(0x06) - endloop(0x06) - - // Unreachable - label(0x31) - speak(CHR_BOND, L_AZT_011, MP3_03CD, CHANNEL_6, COLOR_09_BLUE) // "Maybe there's a beacon in there." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_msg_thejamming[] = { -#if VERSION >= VERSION_NTSC_1_0 - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0f) -#endif - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) -#if VERSION >= VERSION_NTSC_1_0 - if_objective_complete(2, /*goto*/ 0x0f) -#endif - if_chr_in_room(CHR_P1P2, 0x00, 0x0029, /*goto*/ 0x31) - endloop(0x06) - - label(0x31) - speak(CHR_P1P2, L_AZT_012, MP3_03CE, CHANNEL_6, COLOR_09_BLUE) // "The jamming... It's coming from that ship." -#if VERSION >= VERSION_NTSC_1_0 - label(0x0f) -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_msg_elvisbeable[] = { - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 1000, PAD_AZT_0105, /*goto*/ 0x31) - endloop(0x06) - - label(0x31) - speak(CHR_P1P2, L_AZT_013, MP3_03CF, CHANNEL_6, COLOR_09_BLUE) // "Elvis... He'll be able to protect the President." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_path(pathid, function) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(16) \ - set_reaction_speed(55) \ - set_chr_maxdamage(CHR_SELF, 60) \ - add_health_or_armor(0) \ - set_recovery_speed(30) \ - set_shield(0) \ - set_returnlist(CHR_SELF, function) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - -u8 func0408_start_path00[] = { - init_path(0, 0x0408) - endlist -}; - -u8 func0409_start_path01[] = { - init_path(1, 0x0409) - endlist -}; - -u8 func040a_start_path02[] = { - init_path(2, 0x040a) - endlist -}; - -u8 func040b_start_path03[] = { - init_path(3, 0x040b) - endlist -}; - -u8 func040c_start_path04[] = { - init_path(4, 0x040c) - endlist -}; - -u8 func040d_start_path05[] = { - init_path(5, 0x040d) - endlist -}; - -u8 func040e_start_path06[] = { - init_path(6, 0x040e) - endlist -}; - -u8 func040f_start_path07[] = { - init_path(7, 0x040f) - endlist -}; - -u8 func0410_start_path08[] = { - init_path(8, 0x0410) - endlist -}; - -u8 func0411_start_path09[] = { - init_path(9, 0x0411) - endlist -}; - -u8 func0412_start_path10[] = { - init_path(10, 0x0412) - endlist -}; - -u8 func0413_start_path11[] = { - init_path(11, 0x0413) - endlist -}; - -/** - * This function is unfinished. Target labels don't exist. - * - * Looks like it was intended to be a spawning function. - */ -u8 unregistered_function1[] = { - label(0x66) - restart_timer - - beginloop(0x67) - if_timer_lt(1800, /*goto*/ 0x98) - label(0x31) - if_num_chrs_in_squadron_gt(1, 0x0f, /*goto*/ 0x98) - call_rng - if_rand_gt(64, /*goto*/ 0x69) - if_rand_gt(128, /*goto*/ 0x6a) - if_rand_gt(196, /*goto*/ 0x6b) - label(0x98) - endloop(0x67) - - label(0x68) - yield - rebuild_teams - rebuild_squadrons - goto_first(0x66) - - endlist -}; - -u8 func0415_unused[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(16) - set_reaction_speed(55) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x00000000, /*goto*/ 0x08) - label(0x08) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_squadron(SQUADRON_0F) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -u8 func100c_spawn_dd_guards[] = { - label(0x66) - restart_timer - - beginloop(0x67) - if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) - if_stage_flag_eq(STAGEFLAG_ELVIS_GAVE_PROXYMINE, TRUE, /*goto*/ 0x31) - if_objective_complete(0, /*goto*/ 0x31) - if_objective_complete(1, /*goto*/ 0x31) - if_objective_complete(2, /*goto*/ 0x31) - if_objective_complete(3, /*goto*/ 0x31) - if_objective_complete(4, /*goto*/ 0x31) - endloop(0x67) - - label(0x31) - if_timer_lt(3600, /*goto*/ 0x98) - label(0x31) - if_num_chrs_in_squadron_gt(1, 0x0e, /*goto*/ 0x98) - call_rng - if_rand_gt(64, /*goto*/ 0x69) - if_rand_gt(128, /*goto*/ 0x6a) - if_rand_gt(196, /*goto*/ 0x6b) - - // 1 - if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) - try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_0126, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) - goto_next(0x98) - - // 2 - label(0x69) - if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) - try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_00E5, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) - goto_next(0x98) - - // 3 - label(0x6a) - if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) - try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_0130, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) - goto_next(0x98) - - // 4 - label(0x6b) - if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) - try_spawn_chr_at_pad(BODY_DD_GUARD, HEAD_RANDOM, PAD_AZT_00FD, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x68) - goto_next(0x98) - - // Spawn failed - label(0x98) - goto_first(0x67) - - // Spawn worked - label(0x68) - if_stage_flag_eq(STAGEFLAG_OUTRO_STARTED, TRUE, /*goto*/ 0x0f) - yield - rebuild_teams - rebuild_squadrons - goto_first(0x66) - - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0416_spawned_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(16) - set_reaction_speed(55) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x00000000, /*goto*/ 0x08) - label(0x08) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_squadron(SQUADRON_0E) - rebuild_teams - rebuild_squadrons - // Pad is next to UFO - run_to_pad(PAD_AZT_0105) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1008_escapepod[] = { - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_ESCAPEPOD, /*goto*/ 0x31) - - // Pod destroyed - mute_channel(CHANNEL_0) - show_hudmsg(CHR_BOND, L_AZT_015) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_ESCAPEPOD_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Pod healthy - label(0x31) - if_stage_flag_eq(STAGEFLAG_BEACON_ACTIVATED, TRUE, /*goto*/ 0x08) - if_chr_activated_object(CHR_P1P2, OBJ_ESCAPEPOD, /*goto*/ 0x31) - label(0x08) - reloop(0x06) - - label(0x31) - assign_sound(SFX_8115, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_ESCAPEPOD, 1, 800, 1600) - show_hudmsg(CHR_P1P2, L_AZT_014) // "Distress beacon has been activated." - set_stage_flag(STAGEFLAG_BEACON_ACTIVATED) - endloop(0x06) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_check_shuttle_destroyed[] = { - yield - yield - yield - yield - yield - - beginloop(0x06) - if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x31) - show_hudmsg(CHR_BOND, L_AZT_021) // "Jamming device has been shut down." - set_stage_flag(STAGEFLAG_SKEDAR_SHUTTLE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x31) - endloop(0x06) - - endlist -}; - -u8 func100a_check_president_dead[] = { - beginloop(0x06) - if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x31) - endloop(0x06) - - label(0x31) - show_hudmsg(CHR_BOND, L_AZT_022) // "President has been killed." - set_stage_flag(STAGEFLAG_PRESIDENT_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_clone_dead[] = { - beginloop(0x06) - if_chr_deadish(CHR_PRES_CLONE, /*goto*/ 0x31) - endloop(0x06) - - label(0x31) - show_hudmsg(CHR_BOND, L_AZT_023) // "Presidential clone has been eliminated." - set_stage_flag(STAGEFLAG_CLONE_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_init_elvis[] = { - set_shield(100) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_accuracy(100) - set_reaction_speed(100) - add_health_or_armor(1000) - set_chr_maxdamage(CHR_SELF, 1000) - set_self_chrflag(CHRCFLAG_RUNFASTER) - assign_path(12) - start_patrol - set_ailist(CHR_SELF, AILIST_ELVIS) - endlist -}; - -u8 func0404_elvis[] = { - set_shotlist(AILIST_ELVIS) - label(0x04) - restart_timer - - beginloop(0x06) - if_chr_idle(/*goto*/ 0x31) - if_patrolling(/*goto*/ 0x31) - restart_timer - start_patrol - label(0x31) - set_target_chr(CHR_BOND) - set_chrpreset(CHR_BOND) - if_stage_flag_eq(STAGEFLAG_ELVIS_GAVE_PROXYMINE, TRUE, /*goto*/ 0x31) - if_objective_complete(0, /*goto*/ 0x31) - if_objective_complete(1, /*goto*/ 0x31) - if_objective_complete(2, /*goto*/ 0x31) - if_objective_complete(3, /*goto*/ 0x31) - if_objective_complete(4, /*goto*/ 0x31) - if_can_see_target(/*goto*/ 0xa5) - set_target_chr(CHR_COOP) - set_chrpreset(CHR_COOP) - if_can_see_target(/*goto*/ 0xa5) - label(0x31) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - if_timer_gt(600, /*goto*/ 0x0b) - endloop(0x06) - - // 10 seconds passed - label(0x0b) - call_rng - if_rand_gt(128, /*goto*/ 0x31) - - // 50% chance of doing look around animation - call_rng - if_rand_lt(64, /*goto*/ 0x99) - if_rand_lt(128, /*goto*/ 0x9a) - if_rand_lt(196, /*goto*/ 0x9b) - - set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - chr_do_animation(ANIM_LOOK_AROUND_025B, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x31) - - label(0x99) - chr_do_animation(ANIM_LOOK_AROUND_025C, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x31) - - label(0x9a) - chr_do_animation(ANIM_LOOK_AROUND_025D, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x31) - - label(0x9b) - chr_do_animation(ANIM_LOOK_AROUND_025E, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - label(0x31) - goto_first(0x04) - - // Detected enemy - label(0x0a) - set_returnlist(CHR_SELF, AILIST_INIT_ELVIS) - set_shotlist(AILIST_INIT_ELVIS) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // Sees player - label(0xa5) - set_target_chr(CHR_PRESET) - try_run_to_target(/*goto*/ 0x12) - - beginloop(0x12) - if_distance_to_target_lt(300, /*goto*/ 0x13) - if_timer_gt(180, /*goto*/ 0x08) - endloop(0x12) - - // Running towards player for 3 seconds - check if can still see player - label(0x08) - if_can_see_target(/*goto*/ 0x31) - goto_first(0x04) - - label(0x31) - goto_first(0xa5) - - // Close to player - label(0x13) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_AZT_031, MP3_02E2, CHANNEL_6, COLOR_04_ORANGE) // "Take this; you should find it useful!" - give_object_to_chr(OBJ_PROXYMINE, CHR_TARGET) - - beginloop(0x14) - if_sound_finished(CHANNEL_6, /*goto*/ 0x31) - endloop(0x14) - - label(0x31) - stop_chr - set_stage_flag(STAGEFLAG_ELVIS_GAVE_PROXYMINE) - goto_first(0x04) - - endlist -}; - -u8 func0405_unused[] = { - jog_to_pad(PAD_AZT_0107) - beginloop(0x06) - endloop(0x06) - - endlist -}; - -u8 func0417_init_robot[] = { - set_accuracy(40) - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_chr_maxdamage(CHR_SELF, 250) - set_ailist(CHR_SELF, AILIST_ROBOT) - endlist -}; - -u8 func0418_robot[] = { - set_shotlist(AILIST_ROBOT) - label(0x66) - set_self_chrflag(CHRCFLAG_00040000) - if_chr_dead(CHR_SELF, /*goto*/ 0x11) - if_chr_death_animation_finished(CHR_SELF, /*goto*/ 0x11) - if_chr_knockedout(CHR_SELF, /*goto*/ 0x08) - goto_next(0x04) - label(0x08) - yield - damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) - goto_first(0x66) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0d) - if_target_in_sight(/*goto*/ 0x0d) - call_rng - if_rand_gt(5, /*goto*/ 0x31) - if_sound_finished(CHANNEL_5, /*goto*/ 0x08) - goto_next(0x31) - - // Make random noise - label(0x08) - call_rng - if_rand_lt(86, /*goto*/ 0x0b) - if_rand_lt(172, /*goto*/ 0x0c) - assign_sound(SFX_046A, CHANNEL_5) - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) - goto_next(0x31) - label(0x0b) - assign_sound(SFX_046B, CHANNEL_5) - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) - goto_next(0x31) - label(0x0c) - assign_sound(SFX_046C, CHANNEL_5) - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) - label(0x31) - endloop(0x04) - - // Alerted - label(0x0d) - increase_squadron_alertness(100) - restart_timer - if_distance_to_target_lt(300, /*goto*/ 0x31) - if_distance_to_target_gt(1000, /*goto*/ 0x15) - if_target_in_sight(/*goto*/ 0x13) - - // Distance > 1000 or not in sight - label(0x15) - try_jog_to_target(/*goto*/ 0x08) - - // Distance < 300 - label(0x31) - stop_chr - - label(0x08) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x0a) - say_quip(CHR_BOND, 0x1f, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - - beginloop(0x0a) - if_timer_gt(180, /*goto*/ 0x08) - if_distance_to_target_gt(1000, /*goto*/ 0x15) - if_target_in_sight(/*goto*/ 0x13) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x13) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - label(0x15) - endloop(0x0a) - - // Player in sight - label(0x13) - set_target_chr(CHR_P1P2) - restart_timer - try_attack_stand(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0e) - goto_first(0x04) - - beginloop(0x0e) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x0e) - - label(0x08) - goto_first(0x0d) - - label(0x11) - assign_sound(MP3_ROBOT_ALERT_UNDER_ATTACK, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to two stripes guards. - */ -u8 func0414_spawner[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x0a) - // Room 0x0029 is the skedar shuttle area - if_chr_in_room(CHR_P1P2, 0x00, 0x0029, /*goto*/ 0x0a) - reloop(0x06) - - label(0x0a) - label(0x31) - if_never_been_onscreen(/*goto*/ 0x52) - if_can_see_target(/*goto*/ 0x0a) - endloop(0x06) - - label(0x0a) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(0x52) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x52) - set_ailist(CHR_SELF, AILIST_SPAWNER) - - label(0x52) - try_spawn_clone2(CHR_SELF, GAILIST_ALERTED, 0, /*goto*/ 0x31) - set_ailist(CHR_SELF, AILIST_SPAWNER) - - label(0x31) - yield - set_ailist(CHR_SELF, AILIST_SPAWNER) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0419_unused[] = { - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0422_hide[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041a_pres_clone[] = { - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_self_chrflag(CHRCFLAG_RUNFASTER) - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x31) - if_target_outside_my_yvisang(/*goto*/ 0x08) - if_target_in_sight(/*goto*/ 0x31) - label(0x08) - endloop(0x06) - - // Alert, or player in sight and looking at clone - label(0x31) - run_to_pad(PAD_AZT_002C) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x31) - endloop(0x0a) - - label(0x31) - stop_chr - - label(0xa5) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x31) - endloop(0x10) - - label(0x31) - goto_first(0xa5) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041b_init_president[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_chr_maxdamage(CHR_SELF, 300) - set_shield(0) - set_ailist(CHR_SELF, AILIST_PRESIDENT_WAITING) - endlist -}; - -u8 func041c_president_waiting[] = { - set_shotlist(AILIST_PRESIDENT_WAITING) - if_chr_deadish(CHR_SELF, /*goto*/ 0x08) - goto_next(0x31) - - // Dying - label(0x08) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x31) - stop_chr - yield - - // Wait until trigger and can see player - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_PRESIDENT_RUNNING, TRUE, /*goto*/ 0x31) - goto_first(0x06) - - label(0x31) - if_can_see_target(/*goto*/ 0x31) - endloop(0x06) - - label(0x31) - set_shotlist(AILIST_PRESIDENT_RUNNING) - set_ailist(CHR_SELF, AILIST_PRESIDENT_RUNNING) - endlist -}; - -u8 func041d_president_running[] = { - set_self_chrflag(CHRCFLAG_PUSHABLE) - set_alertness(100) - set_shotlist(AILIST_PRESIDENT_RUNNING) - yield - if_chr_deadish(CHR_SELF, /*goto*/ 0x08) - goto_next(0x31) - - // Dying - label(0x08) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x9c) - if_timer_gt(15, /*goto*/ 0x08) - endloop(0x9c) - - label(0x08) - assign_sound(MP3_02BF, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x31) - if_just_injured(CHR_SELF, /*goto*/ 0x08) - goto_next(0x9d) - - // Injured - label(0x08) - restart_timer - assign_sound(MP3_02C2, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - - beginloop(0x9e) - if_num_times_shot_lt(1, /*goto*/ 0x08) - if_timer_lt(20, /*goto*/ 0x08) - label(0x08) - if_chr_stopped(/*goto*/ 0x9d) - endloop(0x9e) - - // Main logic - label(0x9d) - stop_chr - restart_timer - - beginloop(0x9f) - // Room 0x0014 = UFO area - // Yes, checking this 5 times is unnecessary - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_can_see_target(/*goto*/ 0x08) - goto_next(0xa0) - - label(0x08) - if_timer_gt(1250, /*goto*/ 0x31) - if_distance_to_target_gt(200, /*goto*/ 0xa0) - endloop(0x9f) - - // 20.8 seconds passed - // Pointless RNG check - label(0x31) - call_rng - if_rand_lt(64, /*goto*/ 0x31) - goto_first(0x9d) - label(0x31) - goto_first(0x9d) - - // Sees player - label(0x08) - goto_first(0x9d) - - // Can't see player, or distance > 200 - label(0xa0) - restart_timer - label(0x31) - if_distance_to_target_gt(300, /*goto*/ 0x31) - try_jog_to_target(/*goto*/ 0xa1) - label(0x31) - try_run_to_target(/*goto*/ 0xa1) - - beginloop(0xa1) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_distance_to_target_lt(100, /*goto*/ 0xa2) - if_chr_stopped(/*goto*/ 0xa2) - if_timer_gt(360, /*goto*/ 0x31) - endloop(0xa1) - - // 6 seconds passed while running - label(0x31) - goto_first(0xa0) - - // Unreachable - label(0x08) - goto_first(0xa0) - - // Next to player - label(0xa2) - goto_first(0x9d) - - // Unreachable - label(0xa3) - try_run_to_target(/*goto*/ 0xa4) - - // Unreachable - beginloop(0xa4) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - if_chr_in_room(CHR_SELF, 0x00, 0x0014, /*goto*/ 0xa5) - endloop(0xa4) - - // Unreachable - label(0xa6) - goto_first(0x9d) - - // Jo is near UFO - label(0xa5) - run_to_pad(PAD_AZT_0105) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - stop_chr -#if VERSION >= VERSION_NTSC_1_0 - set_chr_team(CHR_SELF, TEAM_NONCOMBAT) - rebuild_teams - rebuild_squadrons -#endif - if_stage_flag_eq(STAGEFLAG_PRESIDENT_RESCUED, TRUE, /*goto*/ 0x31) - show_hudmsg(CHR_TARGET, L_AZT_025) // "President has been rescued." - set_stage_flag(STAGEFLAG_PRESIDENT_RESCUED) - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_check_robots_left[] = { - beginloop(0x06) - if_chr_deadish(CHR_ROBOT1, /*goto*/ 0x31) - if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT1, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) - goto_next(0x31) - label(0x08) - reloop(0x06) - - label(0x31) - if_chr_deadish(CHR_ROBOT2, /*goto*/ 0x31) - if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT2, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) - goto_next(0x31) - label(0x08) - reloop(0x06) - - label(0x31) - if_chr_deadish(CHR_ROBOT3, /*goto*/ 0x31) - if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT3, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) - goto_next(0x31) - label(0x08) - reloop(0x06) - - label(0x31) - if_chr_deadish(CHR_ROBOT4, /*goto*/ 0x31) - if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004A, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004B, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004C, /*goto*/ 0x08) - if_chr_in_room(CHR_ROBOT4, 0x00, ROOM_AZT_004D, /*goto*/ 0x08) - goto_next(0x31) - label(0x08) - reloop(0x06) - - label(0x31) - if_stage_flag_eq(STAGEFLAG_TRENT_RUNNING, TRUE, /*goto*/ 0x31) - goto_first(0x06) - - label(0x31) - set_stage_flag(STAGEFLAG_TRIGGER_PRESIDENT_RUNNING) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041e_trent_waiting[] = { - set_accuracy(0) - set_self_chrflag(CHRCFLAG_00000040) - set_shield(100) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x08) - endloop(0x06) - - label(0x08) - restart_timer - speak(CHR_P1P2, L_AZT_024, MP3_02CA, CHANNEL_6, COLOR_05_GREEN) // "You'll never save him now!" - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - set_ailist(CHR_SELF, AILIST_TRENT_SHOOTING) - endlist -}; - -u8 func041f_trent_shooting[] = { - label(0x04) - stop_chr - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x31) - if_target_in_sight(/*goto*/ 0x08) - endloop(0x06) - - label(0x31) - set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) - - label(0x08) - label(0xa8) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0xa7) - label(0xa7) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) - goto_next(0x31) - - // Shoot worked - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - goto_next(0x0b) - - // Unreachable - if_chr_dead(CHR_TARGET, /*goto*/ 0x0b) - goto_first(0x04) - - // Shoot failed - label(0x31) - goto_first(0x04) - - label(0x0b) - restart_timer - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0c) - if_timer_gt(120, /*goto*/ 0x08) - endloop(0x0c) - - label(0x08) - set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) - endlist -}; - -u8 func0420_trent_running[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_stage_flag(STAGEFLAG_TRENT_RUNNING) - restart_timer - run_to_pad(PAD_AZT_0027) - - beginloop(0x0a) - if_timer_gt(300, /*goto*/ 0x31) - endloop(0x0a) - - label(0x31) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x31) - goto_next(0x08) - - label(0x31) - if_chr_stopped(/*goto*/ 0x08) - goto_first(0x0a) - - // Player not in sight, or Trent has reached his destination - label(0x08) - if_nearly_in_targets_sight(30, /*goto*/ 0x31) - goto_next(0x08) - - label(0x31) - goto_first(0x0a) - - // Player definitely not in sight - label(0x08) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_check_end_level[] = { - beginloop(0x0a) - if_all_objectives_complete(/*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x31) - endloop(0x0b) - - label(0x31) - if_chr_deadish(CHR_BOND, /*goto*/ 0x31) - goto_next(0x08) - - label(0x31) - if_chr_deadish(CHR_COOP, /*goto*/ 0x31) - - // Jo or Velvet alive - label(0x08) - if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x32) - set_ailist(CHR_PRESIDENT, GAILIST_STOP_AND_IDLE) - - if_chr_deadish(CHR_BOND, /*goto*/ 0x31) - goto_next(0x08) - - // Both players dead - label(0x31) - if_chr_deadish(CHR_COOP, /*goto*/ 0x31) - goto_next(0x08) - - label(0x31) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x08) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - - // President dead - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to 4 stripes and 2 blondes near the starting area. - */ -u8 func0421_starting_area_guard[] = { - label(0x0a) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -u8 func1010_set_cave_lights[] = { - yield - set_lights_state(ROOM_AZT_0064, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0063, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0062, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0061, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0060, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_005F, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_005E, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_005D, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_005C, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_005B, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_005A, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0059, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0053, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0058, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(ROOM_AZT_0056, LIGHTOP_1, 0x06, 0x00, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_give_medicalscanner[] = { - yield - if_difficulty_gt(DIFF_A, /*goto*/ 0x31) - give_object_to_chr(OBJ_MEDICALSCANNER, CHR_BOND) - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_setup_rtracker[] = { - yield - set_object_flag3(OBJ_PROXYMINE, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_hide_hoverbike[] = { - yield - if_savefile_flag_is_set(GAMEFILEFLAG_CRASHSITE_BIKE, /*goto*/ 0x08) - disable_object(OBJ_HOVERBIKE) - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_setup_skedar_shuttle[] = { - yield - enable_object(OBJ_SKEDAR_SHUTTLE) - set_object_flag3(OBJ_SKEDAR_SHUTTLE, OBJFLAG3_00000010) - object_set_modelpart_visible(OBJ_SKEDAR_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - object_do_animation(ANIM_0486, OBJ_SKEDAR_SHUTTLE, 0x01, 0xffff) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1415_setup_environment[] = { - yield - configure_environment(ROOM_AZT_0001, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0001, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0009, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_000A, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_000A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_000B, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_000B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_000C, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_000C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_000D, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_000D, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_000E, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_000E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_000F, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_000F, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0016, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0018, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0019, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_001A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_001B, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_001B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_001C, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_001C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_001D, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_001E, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_001E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0025, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0026, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0028, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0029, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_002A, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_002A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_002B, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_002B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_002C, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_002C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_002E, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_002E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_002F, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_002F, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0030, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0031, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0032, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0033, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0035, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0036, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0038, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_003A, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_003A, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_003B, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_003B, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_003C, AIENVCMD_ROOM_SETAMBIENT, TRUE) -#if VERSION >= VERSION_NTSC_1_0 - configure_environment(ROOM_AZT_003C, AIENVCMD_ROOM_SETOUTDOORS, TRUE) -#else - configure_environment(ROOM_AZT_003C_2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_003C_2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) -#endif - configure_environment(ROOM_AZT_003D, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_003D, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_003E, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(ROOM_AZT_003F, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(ROOM_AZT_0065, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_msg_therestheescapepod, 0x1003 }, - { func1004_msg_maybetheresabeacon, 0x1004 }, - { func1005_msg_thejamming, 0x1005 }, - { func1006_msg_elvisbeable, 0x1006 }, - { func1008_escapepod, 0x1008 }, - { func1009_check_shuttle_destroyed, 0x1009 }, - { func100a_check_president_dead, 0x100a }, - { func100b_check_clone_dead, 0x100b }, - { func100c_spawn_dd_guards, 0x100c }, - { func100e_check_robots_left, 0x100e }, - { func100f_check_end_level, 0x100f }, - { func1010_set_cave_lights, 0x1010 }, - { func1011_setup_snow, 0x1011 }, - { func1012_give_medicalscanner, 0x1012 }, - { func1013_setup_rtracker, 0x1013 }, - { func1014_setup_skedar_shuttle, 0x1014 }, - { func1415_setup_environment, 0x1415 }, - { func1016_hide_hoverbike, 0x1016 }, - { func1002_intro, 0x0401 }, - { func0402_outro, 0x0402 }, - { func0403_init_elvis, 0x0403 }, - { func0404_elvis, 0x0404 }, - { func0405_unused, 0x0405 }, - { func1002_intro, 0x0c00 }, - { func0402_outro_from_menu, 0x0c01 }, - { func0406_init_stripes, 0x0406 }, - { func0407_init_blonde, 0x0407 }, - { func0408_start_path00, 0x0408 }, - { func0409_start_path01, 0x0409 }, - { func040a_start_path02, 0x040a }, - { func040b_start_path03, 0x040b }, - { func040c_start_path04, 0x040c }, - { func040d_start_path05, 0x040d }, - { func040e_start_path06, 0x040e }, - { func040f_start_path07, 0x040f }, - { func0410_start_path08, 0x0410 }, - { func0411_start_path09, 0x0411 }, - { func0412_start_path10, 0x0412 }, - { func0413_start_path11, 0x0413 }, - { func0414_spawner, 0x0414 }, - { func0415_unused, 0x0415 }, - { func0416_spawned_guard, 0x0416 }, - { func0417_init_robot, 0x0417 }, - { func0418_robot, 0x0418 }, - { func0419_unused, 0x0419 }, - { func041a_pres_clone, 0x041a }, - { func041c_president_waiting, 0x041c }, - { func041b_init_president, 0x041b }, - { func041d_president_running, 0x041d }, - { func041e_trent_waiting, 0x041e }, - { func041f_trent_shooting, 0x041f }, - { func0420_trent_running, 0x0420 }, - { func0421_starting_area_guard, 0x0421 }, - { func0422_hide, 0x0422 }, - { NULL, 0 }, -}; diff --git a/src/setups/setupcat.c b/src/setups/setupcat.c index d4be4efe4..257c10f89 100644 --- a/src/setups/setupcat.c +++ b/src/setups/setupcat.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupcave.c b/src/setups/setupcave.c index 1fcddaad7..60dbb5db0 100644 --- a/src/setups/setupcave.c +++ b/src/setups/setupcave.c @@ -90,7 +90,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -734,3672 +734,3 @@ struct path paths[] = { { path05, 5, 0 }, { NULL, 0, 0 }, }; - -u8 func1002_objectives_failed_msg[] = { - yield - give_object_to_chr(OBJ_UNIFORM, CHR_STEWARDESS) - set_chr_chrflag(0x00, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x01, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x02, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x03, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x04, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x05, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x06, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x07, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x08, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x09, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0a, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0b, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0c, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0d, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0e, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0f, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_SECRETARY, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x3a, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x3b, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_OFFICE1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_OFFICE2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x44, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x45, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x46, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1000_rebuild_groups[] = { - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1401_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_04) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 unregistered_function1[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, 0x0401) - endlist -}; - -/** - * @unused - */ -u8 func0401_unused_cutscene[] = { - chr_draw_weapon_in_cutscene(CHR_BOND, WEAPON_FALCON2) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_AIRBASE_OUTRO_LONG) - camera_movement(ANIM_CUT_CAVE_BETA_CAM) - cmd0175(60) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_BETA_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_hudpiece_visible(CHR_BOND, TRUE) - set_chr_chrflag(0x00, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x00, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x00, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_BETA_GUARD1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x00, 4) - set_chr_chrflag(0x01, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x01, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x01, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_BETA_GUARD2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x01, 4) - set_chr_chrflag(0x02, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x02, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x02, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_BETA_GUARD3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x02, 4) - set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_STEWARDESS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_BETA_STEWARDESS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_STEWARDESS, 4) - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - beginloop(0x04) - if_camera_animating(/*goto*/ 0x31) - goto_next(0x48) - - label(0x31) - if_controller_button_pressed(/*goto*/ 0x48) - label(0x31) - endloop(0x04) - - label(0x48) - label(0x02) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_ailist(0x00, 0x0405) - set_ailist(0x01, 0x0405) - remove_chr(0x02) - set_ailist(CHR_STEWARDESS, 0x040b) - stop_cutscene_track - stop_ambient_track - set_ailist(CHR_SELF, GAILIST_END_CINEMA) - endlist -}; - -u8 func0425_outro[] = { - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - camera_movement(ANIM_CUT_CAVE_OUTRO_CAM) - play_cutscene_track(MUSIC_AIRBASE_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - - set_chr_chrflag(CHR_OUTRO_NSA, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_OUTRO_NSA, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_OUTRO_NSA, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_NSA, 4) - - enable_object(OBJ_PLANE) - set_object_flag2(OBJ_PLANE, OBJFLAG2_04000000) - set_object_flag3(OBJ_PLANE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_CAVE_OUTRO_PLANE, OBJ_PLANE, 0x04, 0xffff) - - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - show_nonessential_chrs(FALSE) - restart_timer - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x48) \ - if_timer_gt(time, /*goto*/ 0x02) \ - endloop(loopid) \ - label(0x02) - - wait_until(38, 0x92) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_10) - - wait_until(84, 0x93) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_10) - - wait_until(130, 0x94) - play_sound(SFX_FOOTSTEP_80C6, CHANNEL_10) - - wait_until(176, 0x95) - play_sound(SFX_FOOTSTEP_80C7, CHANNEL_10) - - wait_until(220, 0x96) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_10) - - wait_until(274, 0x97) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_10) - - wait_until(320, 0x98) - play_sound(SFX_FOOTSTEP_80C6, CHANNEL_10) - - wait_until(365, 0x99) - play_sound(SFX_FOOTSTEP_80C7, CHANNEL_10) - - beginloop(0x04) - if_camera_animating(/*goto*/ 0x31) - goto_next(0x48) - - label(0x31) - if_controller_button_pressed(/*goto*/ 0x48) - label(0x31) - endloop(0x04) - - label(0x48) - mute_channel(CHANNEL_10) - label(0x02) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) -#if VERSION < VERSION_PAL_FINAL - disable_object(OBJ_PLANE) -#endif - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_init_stripes[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_guard_activation[] = { - set_object_flag(0x29, OBJFLAG_INVINCIBLE) - set_object_flag2(0x29, OBJFLAG2_INVISIBLE) - unset_object_flag(0x29, OBJFLAG_00000100) - set_object_flag(0x2a, OBJFLAG_INVINCIBLE) - set_object_flag2(0x2a, OBJFLAG2_INVISIBLE) - unset_object_flag(0x2a, OBJFLAG_00000100) - set_object_flag2(OBJ_REMOTEMINE, OBJFLAG2_00020000) - set_object_flag(OBJ_REMOTEMINE, OBJFLAG_INVINCIBLE) - set_object_flag2(OBJ_REMOTEMINE, OBJFLAG2_INVISIBLE) - yield - yield - disable_chr(0x13) - disable_chr(0x15) - disable_chr(0x17) - disable_chr(0x19) - disable_chr(0x1b) - disable_chr(0x1d) - disable_chr(0x1f) - disable_chr(0x21) - disable_chr(0x23) - disable_chr(0x25) - disable_chr(0x27) - disable_chr(0x2a) - disable_chr(0x2c) - disable_chr(0x2e) - disable_chr(0x30) - disable_chr(0x32) - disable_chr(0x34) - disable_chr(0x36) - disable_chr(0x42) - disable_chr(0x43) - disable_chr(0x14) - disable_chr(0x16) - disable_chr(0x18) - disable_chr(0x1a) - disable_chr(0x1c) - disable_chr(0x1e) - disable_chr(0x20) - disable_chr(0x22) - disable_chr(0x24) - disable_chr(0x26) - disable_chr(0x28) - disable_chr(0x2b) - disable_chr(0x2d) - disable_chr(0x2f) - disable_chr(0x31) - disable_chr(0x33) - disable_chr(0x35) - disable_chr(0x37) - - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - disable_object(0x27) - disable_object(0x28) - unset_object_flag(0x29, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x29, OBJFLAG2_INVISIBLE) - set_object_flag(0x29, OBJFLAG_00000100) - unset_object_flag(0x2a, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x2a, OBJFLAG2_INVISIBLE) - set_object_flag(0x2a, OBJFLAG_00000100) - - #define remove_alaskan_guard(chr) \ - set_chr_flag_bankx(chr, CHRFLAG1_PREWARNED, BANK_1) \ - set_ailist(chr, AILIST_REMOVE_OR_UNALERT) \ - set_chr_flag_bankx(chr, CHRFLAG0_AIVSAI, BANK_0) \ - yield - - remove_alaskan_guard(0x00) - remove_alaskan_guard(0x01) - remove_alaskan_guard(0x02) - remove_alaskan_guard(0x03) - remove_alaskan_guard(0x04) - remove_alaskan_guard(0x05) - remove_alaskan_guard(0x06) - remove_alaskan_guard(0x07) - remove_alaskan_guard(0x08) - remove_alaskan_guard(0x09) - remove_alaskan_guard(0x0a) - remove_alaskan_guard(0x0b) - remove_alaskan_guard(0x0d) - remove_alaskan_guard(0x0e) - remove_alaskan_guard(0x0f) - - set_ailist(CHR_SECRETARY, AILIST_REMOVE_OR_COWER) - set_ailist(CHR_STEWARDESS, AILIST_REMOVE_OR_COWER) - set_ailist(CHR_OFFICE1, AILIST_REMOVE_OR_COWER) - set_ailist(CHR_OFFICE2, AILIST_REMOVE_OR_COWER) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - set_ailist(0x10, AILIST_INIT_POSTTAKEOVER_GUARD) - set_ailist(0x11, AILIST_INIT_POSTTAKEOVER_GUARD) - - #define enable_takeover_guard2(chr, function) \ - enable_chr(chr) \ - set_ailist(chr, function) \ - unset_chr_hiddenflag(chr, CHRHFLAG_ANTINONINTERACTABLE) \ - unset_chr_chrflag(chr, CHRCFLAG_HIDDEN) \ - yield - - enable_takeover_guard2(0x15, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x17, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x21, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x23, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x25, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x27, 0x0423) - enable_takeover_guard2(0x2a, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x2c, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x2e, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x30, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x32, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x34, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x36, AILIST_INIT_POSTTAKEOVER_GUARD) - - enable_chr(0x42) - set_ailist(0x42, AILIST_FOYER_SPAWNER) - yield - - enable_chr(0x43) - set_ailist(0x43, AILIST_FOYER_SPAWNER) - yield - - enable_takeover_guard2(0x22, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x24, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x26, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x28, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x2b, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x2d, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x2f, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x31, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x33, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x35, AILIST_INIT_POSTTAKEOVER_GUARD) - enable_takeover_guard2(0x37, AILIST_INIT_POSTTAKEOVER_GUARD) - - set_ailist(0x10, AILIST_DRAW_MAGNUM) - set_ailist(0x11, AILIST_DRAW_MAGNUM) - unset_object_flag(0x2b, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x2b, OBJFLAG2_INVISIBLE) - - beginloop(0x6d) - if_chr_y(CHR_P1P2, -2000, OPERATOR_LESS_THAN, /*goto*/ 0x02) - endloop(0x6d) - - #define enable_bottom_guard(chr) \ - enable_chr(chr) \ - set_ailist(chr, AILIST_INIT_POSTTAKEOVER_GUARD) \ - unset_chr_hiddenflag(chr, CHRHFLAG_ANTINONINTERACTABLE) \ - unset_chr_chrflag(chr, CHRCFLAG_HIDDEN) \ - yield - - label(0x02) - enable_bottom_guard(0x13) - enable_bottom_guard(0x14) - enable_bottom_guard(0x16) - enable_bottom_guard(0x18) - enable_bottom_guard(0x1a) - enable_bottom_guard(0x1c) - enable_bottom_guard(0x1f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0405_start_path15[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - restart_timer - - beginloop(0x05) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - assign_path(15) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Assigned to the stewardess from another unused function. - */ -u8 func040b_unused[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, 0x040b) - endlist -}; - -u8 func0407_stewardess[] = { - set_shotlist(AILIST_STEWARDESS) - if_chr_dead(CHR_SELF, /*goto*/ 0x02) - if_chr_knockedout(CHR_SELF, /*goto*/ 0x02) - goto_next(0x31) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x31) - if_just_injured(CHR_SELF, /*goto*/ 0x02) - goto_next(0x4c) - - // Injured - label(0x02) - restart_timer - - beginloop(0x4d) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) - if_distance_to_target_gt(200, /*goto*/ 0x75) - set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) - label(0x75) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x02) - if_num_times_shot_lt(1, /*goto*/ 0x02) - if_timer_lt(20, /*goto*/ 0x02) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x02) - if_chr_stopped(/*goto*/ 0x4c) - endloop(0x4d) - - // Not injured, or recovered - label(0x4c) - if_chr_knockedout(CHR_SELF, /*goto*/ 0x02) - goto_next(0x16) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - restart_timer - - beginloop(0x11) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) - if_distance_to_target_gt(200, /*goto*/ 0x75) - set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) - label(0x75) - if_self_flag_bankx_eq(CHRFLAG0_CAN_EXAMINE_BODY, FALSE, BANK_0, /*goto*/ 0x31) - if_saw_death(0x00, /*goto*/ 0x0f) - label(0x31) - if_distance_to_target_gt(500, /*goto*/ 0x31) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - label(0x31) - if_target_outside_my_yvisang(/*goto*/ 0x02) - if_target_in_sight(/*goto*/ 0x04) - label(0x02) - if_timer_gt(120, /*goto*/ 0x16) - endloop(0x11) - - // Loaded - label(0x16) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x31) - walk_to_pad(PAD_CAVE_0012) // outside front door - goto_next(0x00) - - label(0x31) - walk_to_pad(PAD_CAVE_0026) // top of escalators - - // Walking - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) - if_distance_to_target_gt(200, /*goto*/ 0x75) - set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) - label(0x75) - if_self_flag_bankx_eq(CHRFLAG0_CAN_EXAMINE_BODY, FALSE, BANK_0, /*goto*/ 0x31) - if_saw_death(0x00, /*goto*/ 0x0f) - label(0x31) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - if_target_outside_my_yvisang(/*goto*/ 0x02) - if_target_in_sight(/*goto*/ 0x04) - label(0x02) - if_chr_stopped(/*goto*/ 0x0b) - endloop(0x00) - - // Saw player - label(0x04) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) - - beginloop(0x05) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(60, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - speak(CHR_TARGET, L_CAVE_025, MP3_02DC, CHANNEL_4, COLOR_07_RED) // "Look out - it's an intruder..." - increase_squadron_alertness(100) - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x06) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x06) - - label(0x02) - jog_to_pad(PAD_CAVE_001D) // alcove in foyer - - beginloop(0x07) - if_chr_stopped(/*goto*/ 0x0b) - endloop(0x07) - - label(0x0b) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x31) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - chr_do_animation(ANIM_SNEEZE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x69) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x69) - - label(0x02) - goto_first(0x16) - - label(0x31) - set_stage_flag(STAGEFLAG_STEWARDESS_ENTERED_BASE) - - label(0x62) - set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) - chr_do_animation(ANIM_COWER_0229, -1, 190, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x63) - if_chr_stopped(/*goto*/ 0x31) - endloop(0x63) - - label(0x31) - goto_first(0x62) - - label(0x0f) - try_jog_to_chr(CHR_SEEDIE, /*goto*/ 0x49) - - beginloop(0x49) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) - if_distance_to_target_gt(200, /*goto*/ 0x75) - set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) - label(0x75) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e) - if_target_outside_my_yvisang(/*goto*/ 0x31) - if_target_in_sight(/*goto*/ 0x02) - label(0x31) - if_distance_to_chr_lt(200, 0xfb, /*goto*/ 0x4a) - if_chr_stopped(/*goto*/ 0x4a) - endloop(0x49) - - label(0x4a) - unset_self_flag_bankx(CHRFLAG0_CAN_EXAMINE_BODY, BANK_0) - speak(CHR_TARGET, L_CAVE_027, MP3_02DD, CHANNEL_4, COLOR_07_RED) // "Is he OK?" - stop_chr - restart_timer - - beginloop(0x4b) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) - if_distance_to_target_gt(200, /*goto*/ 0x75) - set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) - label(0x75) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e) - if_timer_gt(240, /*goto*/ 0x02) - endloop(0x4b) - - label(0x02) - speak(CHR_TARGET, L_CAVE_028, MP3_02DE, CHANNEL_4, COLOR_07_RED) // "I'll go and get some help." - restart_timer - stop_chr - - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x75) - if_distance_to_target_gt(200, /*goto*/ 0x75) - set_stage_flag(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE) - label(0x75) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x4e) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x10) - - label(0x02) - unset_self_flag_bankx(CHRFLAG0_CAN_EXAMINE_BODY, BANK_0) - jog_to_pad(PAD_CAVE_0026) - goto_first(0x00) - - label(0x4e) - goto_first(0x04) - - endlist -}; - -u8 func0406_become_unalerted[] = { - set_self_chrflag(CHRCFLAG_00000040) - label(0x00) - yield - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x02) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - label(0x02) - if_target_is_player(/*goto*/ 0x02) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x02) - set_shotlist(AILIST_BECOME_UNALERTED) - set_returnlist(CHR_SELF, AILIST_BECOME_UNALERTED) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1005_check_civilians_killed[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) - if_chr_dead(CHR_STEWARDESS, /*goto*/ 0x31) - if_chr_dead(CHR_SECRETARY, /*goto*/ 0x31) - if_chr_dead(CHR_OFFICE1, /*goto*/ 0x31) - if_chr_dead(CHR_OFFICE2, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - show_hudmsg(CHR_BOND, L_CAVE_026) // "Innocent civilians have been killed." - set_stage_flag(STAGEFLAG_CIVILIANS_KILLED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_path(reaction, health, armor, recovery, pathid) \ - set_accuracy(12) \ - set_reaction_speed(reaction) \ - set_chr_maxdamage(CHR_SELF, health) \ - add_health_or_armor(armor) \ - set_recovery_speed(recovery) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED) - -u8 func041b_start_path06[] = { - init_path(70, 40, 0, 0, 0x06) - endlist -}; - -u8 func041c_start_path07[] = { - init_path(70, 40, 0, 0, 0x07) - endlist -}; - -u8 func041d_start_path08[] = { - init_path(70, 40, 0, 0, 0x08) - endlist -}; - -u8 func041e_start_path09[] = { - init_path(70, 40, 0, 0, 0x09) - endlist -}; - -u8 func041f_start_path10[] = { - init_path(70, 40, 0, 0, 0x0a) - endlist -}; - -u8 func0420_start_path11[] = { - init_path(45, 60, 40, 30, 0x0b) - endlist -}; - -u8 func0421_start_path12[] = { - init_path(45, 60, 40, 30, 0x0c) - endlist -}; - -/** - * Assigned to a stripes guard near the plane. - */ -u8 func0422_start_path13[] = { - set_chr_team(CHR_SELF, TEAM_04) - set_accuracy(12) - set_reaction_speed(45) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(30) - set_shield(0) - rebuild_teams - rebuild_squadrons - assign_path(13) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0423_start_path14[] = { - set_chr_team(CHR_SELF, TEAM_04) - set_accuracy(12) - set_reaction_speed(45) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(30) - set_shield(0) - rebuild_teams - rebuild_squadrons - assign_path(14) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0424_start_path15_unused[] = { - set_accuracy(12) - set_reaction_speed(45) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(30) - set_shield(0) - assign_path(15) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040c_init_secretary[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_SECRETARY) - endlist -}; - -/** - * The secretary uses morale to track things. - * - * 0 = Not done anything - * 1 = Not used - * 2 = Said "good afternoon" - * 3 = Said "you'll have to check that weapon" - * 4 = Said "weapons are not allowed" - */ -u8 func0408_secretary[] = { - set_shotlist(AILIST_SECRETARY) - set_morale(0) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x00) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) -#define LABEL_MAIN_LOOP 0x00 -#define LABEL_BECOME_ALERT1 0x66 -#define LABEL_BECOME_ALERT2 0x68 - - // - // MAIN LOOP - // - beginloop(LABEL_MAIN_LOOP) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - set_view_distance(100) - if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT1) - if_saw_death(0x00, /*goto*/ LABEL_BECOME_ALERT1) - set_view_distance(14) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT1) - if_target_in_sight(/*goto*/ 0x02) - if_can_hear_alarm(/*goto*/ 0x67) - endloop(LABEL_MAIN_LOOP) - - // Joanna within 14 units (?) of distance - label(0x02) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) - - beginloop(0x05) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(60, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - if_stage_flag_eq(STAGEFLAG_DISGUISED, TRUE, /*goto*/ 0x07) - - // - // BECOMING ALERT - // - label(LABEL_BECOME_ALERT1) - mute_channel(CHANNEL_4) - yield - label(0x02) - speak(CHR_TARGET, L_CAVE_032, SFX_8162, CHANNEL_4, COLOR_06_WHITE) // "Oh, my God!" - - label(0x67) - increase_squadron_alertness(100) - restart_timer - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x06) - if_chr_stopped(/*goto*/ 0x4f) - endloop(0x06) - - label(0x4f) - set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x31) - endloop(0x0f) - - label(0x31) - if_stage_flag_eq(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY, TRUE, /*goto*/ 0x31) - goto_next(0x77) - - label(0x31) - goto_first(0x4f) - - // Unreachable - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Seen Jo while disguised - label(0x07) - if_morale_lt(2, /*goto*/ 0x32) - goto_next(0x02) - - // - // FIRST TALK - // - label(0x32) - speak(CHR_TARGET, L_CAVE_029, SFX_8161, CHANNEL_4, COLOR_06_WHITE) // "Good afternoon." - chr_do_animation(ANIM_TALKING_0231, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - restart_timer - set_morale(2) - - beginloop(0x08) - if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) - if_timer_gt(60, /*goto*/ 0x02) - if_can_see_target(/*goto*/ 0x31) - goto_first(LABEL_MAIN_LOOP) - - label(0x31) - endloop(0x08) - - // - // SECOND TALK/WEAPON CHECK - // - label(0x02) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x0c) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x0c) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x0c) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x0c) - if_morale_lt(3, /*goto*/ 0x32) - goto_next(0x02) - - // - // WEAPON TALK 1 - // - label(0x32) - speak(CHR_TARGET, L_CAVE_031, MP3_0273, CHANNEL_4, COLOR_06_WHITE) // "You'll have to check that weapon in here." - restart_timer - chr_do_animation(ANIM_TALKING_0232, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - set_morale(3) - - beginloop(0x09) - if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) - if_timer_gt(400, /*goto*/ 0x02) - if_can_see_target(/*goto*/ 0x31) - goto_first(LABEL_MAIN_LOOP) - - label(0x31) - endloop(0x09) - - // 6.66 seconds since weapon talk - label(0x02) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) - if_morale_lt(4, /*goto*/ 0x32) - goto_next(0x02) - - label(0x32) - speak(CHR_TARGET, L_CAVE_033, MP3_0274, CHANNEL_4, COLOR_06_WHITE) // "Weapons are not allowed in the base." - restart_timer - chr_do_animation(ANIM_TALKING_0233, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - set_morale(4) - - beginloop(0x0a) - if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) - if_timer_gt(400, /*goto*/ 0x0c) - if_can_see_target(/*goto*/ 0x31) - goto_first(LABEL_MAIN_LOOP) - - label(0x31) - endloop(0x0a) - - // Wait 1.5 seconds, check weapon equipped and call security if so - label(0x0c) - restart_timer - - beginloop(0x0d) - if_timer_gt(90, /*goto*/ 0x31) - endloop(0x0d) - - label(0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) - - // Calling security - label(0x77) - speak(CHR_TARGET, L_CAVE_034, MP3_0276, CHANNEL_4, COLOR_06_WHITE) // "Right, I'm calling security." - set_stage_flag(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY) - activate_alarm - restart_timer - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0b) - if_timer_gt(180, /*goto*/ 0x02) - endloop(0x0b) - - label(0x02) - goto_first(0x4f) - - // Unreachable - set_ailist(CHR_SELF, GAILIST_IDLE) - - // - // TALK 2 - // - label(0x31) - speak(CHR_TARGET, L_CAVE_030, MP3_0272, CHANNEL_4, COLOR_06_WHITE) // "OK, you know the way from here." - chr_do_animation(ANIM_TALKING_0232, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - unlock_door(0x18, 0x02) - - beginloop(0x0e) - if_saw_injury(0x00, /*goto*/ LABEL_BECOME_ALERT2) - if_saw_death(0x00, /*goto*/ LABEL_BECOME_ALERT2) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_BECOME_ALERT2) - endloop(0x0e) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_BECOME_ALERT2) - goto_first(LABEL_BECOME_ALERT1) - - endlist -}; - -u8 unregistered_function2[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ 0x02) - if_stage_flag_eq(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY, TRUE, /*goto*/ 0x02) - set_stage_flag(STAGEFLAG_DISGUISED) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_console_activation[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x0c) - - label(0x31) - if_chr_activated_object(CHR_P1P2, OBJ_CONSOLE, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - set_stage_flag(STAGEFLAG_CONSOLE_ACTIVATED) - set_object_image(OBJ_CONSOLE, 0, TVCMDLIST_0F) - set_object_image(OBJ_CONSOLE, 1, TVCMDLIST_0F) - set_chr_flag_bankx(0x12, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - show_hudmsg(CHR_P1P2, L_CAVE_035) // "System shutdown initiated..." - mute_channel(CHANNEL_1) - assign_sound(SFX_01B9, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_CONSOLE, TRUE) - restart_timer - - beginloop(0x04) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x0c) - - label(0x31) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x04) - - label(0x02) - set_object_image(OBJ_CONSOLE, 0, TVCMDLIST_14) - mute_channel(CHANNEL_1) - assign_sound(SFX_0479, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_CONSOLE, TRUE) - show_hudmsg(CHR_P1P2, L_CAVE_036) // "Security systems have been shut down." - set_stage_flag(STAGEFLAG_SECURITY_SHUT_DOWN) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - restart_timer - - beginloop(0x05) - if_timer_gt(120, /*goto*/ 0x31) - endloop(0x05) - - label(0x31) - set_object_image(OBJ_CONSOLE, 1, TVCMDLIST_14) - play_x_track(XREASON_DEFAULT, 88, 88) - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -2000, OPERATOR_LESS_THAN, /*goto*/ 0x02) - endloop(0x06) - - label(0x02) - stop_x_track(XREASON_DEFAULT) - - label(0x0c) - mute_channel(CHANNEL_1) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define weapon_detection_logic(chr) \ - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) \ - \ - label(0x00) \ - yield \ - mute_channel(CHANNEL_6) \ - set_lights_state(0x0039, LIGHTOP_3, 0x78, 0xff, 0x3c) \ - set_lights_state(0x003a, LIGHTOP_3, 0x78, 0xff, 0x3c) \ - set_lights_state(0x003b, LIGHTOP_3, 0x78, 0xff, 0x3c) \ - set_lights_state(0x0041, LIGHTOP_3, 0x78, 0xff, 0x3c) \ - set_lights_state(0x0042, LIGHTOP_3, 0x78, 0xff, 0x3c) \ - set_lights_state(0x0043, LIGHTOP_3, 0x78, 0xff, 0x3c) \ - \ - beginloop(0x65) \ - if_stage_flag_eq(STAGEFLAG_SUITCASE_DEPOSITED, TRUE, /*goto*/ 0x08) \ - if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ - endloop(0x65) \ - \ - /* In hallway with weapons */ \ - label(0x31) \ - set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x3c) \ - set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x3c) \ - set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x3c) \ - set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x3c) \ - set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x3c) \ - set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x3c) \ - play_sound(SFX_ALARM_INFILTRATION, CHANNEL_6) \ - restart_timer \ - \ - beginloop(0x04) \ - if_timer_gt(60, /*goto*/ 0x02) \ - if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ - goto_first(0x00) \ - \ - label(0x31) \ - endloop(0x04) \ - \ - /* In hallway with weapons for over 60 frames */ \ - label(0x02) \ - restart_timer \ - set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x32) \ - set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x32) \ - set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x32) \ - set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x32) \ - set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x32) \ - set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x32) \ - \ - beginloop(0x05) \ - if_timer_gt(40, /*goto*/ 0x02) \ - if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ - goto_first(0x00) \ - \ - label(0x31) \ - endloop(0x05) \ - \ - /* In hallway with weapons for over 100 frames */ \ - label(0x02) \ - restart_timer \ - set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x28) \ - set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x28) \ - set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x28) \ - set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x28) \ - set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x28) \ - set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x28) \ - \ - beginloop(0x06) \ - if_timer_gt(1, /*goto*/ 0x02) \ - if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ - goto_first(0x00) \ - \ - label(0x31) \ - endloop(0x06) \ - \ - /* In hallway with weapons for over 101 frames */ \ - label(0x02) \ - restart_timer \ - set_lights_state(0x0039, LIGHTOP_4, 0x00, 0xff, 0x1e) \ - set_lights_state(0x003a, LIGHTOP_4, 0x00, 0xff, 0x1e) \ - set_lights_state(0x003b, LIGHTOP_4, 0x00, 0xff, 0x1e) \ - set_lights_state(0x0041, LIGHTOP_4, 0x00, 0xff, 0x1e) \ - set_lights_state(0x0042, LIGHTOP_4, 0x00, 0xff, 0x1e) \ - set_lights_state(0x0043, LIGHTOP_4, 0x00, 0xff, 0x1e) \ - \ - beginloop(0x07) \ - yield \ - yield \ - yield \ - yield \ - yield \ - yield \ - yield \ - yield \ - yield \ - if_timer_gt(30, /*goto*/ 0x02) \ - if_chr_in_room(chr, 0x00, 0x0039, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003a, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x003b, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0041, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0042, /*goto*/ 0x31) \ - if_chr_in_room(chr, 0x00, 0x0043, /*goto*/ 0x31) \ - goto_first(0x00) \ - \ - label(0x31) \ - endloop(0x07) \ - \ - label(0x02) \ - show_hudmsg(chr, 0x0e25) /* "Weapons have been detected." */ \ - set_stage_flag(STAGEFLAG_WEAPONS_DETECTED) \ - label(0x31) \ - mute_channel(CHANNEL_6) \ - yield \ - activate_alarm \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - /* Agent, or suitcase deposited */ \ - label(0x08) \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 func1020_weapon_scanning_bond[] = { - yield - weapon_detection_logic(CHR_BOND) - endlist -}; - -u8 func1021_weapon_scanning_coop[] = { - yield - set_target_chr(CHR_COOP) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) - goto_next(0x02) - - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x02) - weapon_detection_logic(CHR_COOP) - endlist -}; - -u8 func1009_carousel_activation[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_BAGGAGE_CARRIER, /*goto*/ 0x02) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x31) - reloop(0x00) - - // Shut down without depositing - label(0x31) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) - show_hudmsg(CHR_BOND, L_CAVE_066) // "Hover trolley has been shut down." - set_stage_flag(STAGEFLAG_TROLLEY_SHUT_DOWN_WITHOUT_BRIEFCASE) - yield - show_hudmsg(CHR_BOND, L_CAVE_067) // "Equipment cannot be checked in." - label(0x09) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Carrier activated - label(0x02) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_SUITCASE, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - show_hudmsg(CHR_P1P2, L_CAVE_038) // "Suitcase has been deposited." - chr_draw_weapon_in_cutscene(CHR_P1P2, WEAPON_UNARMED) - set_stage_flag(STAGEFLAG_SUITCASE_DEPOSITED) - play_sound(SFX_80AA, CHANNEL_7) - unset_object_flag2(OBJ_BRIEFCASE2, OBJFLAG2_INVISIBLE) - move_object_to_pad(OBJ_BRIEFCASE2, PAD_CAVE_00DE) - yield - restart_timer - - beginloop(0x05) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - clear_inventory(CHR_BOND) - unset_object_flag(OBJ_BAGGAGE_CARRIER, OBJFLAG_DEACTIVATED) - open_door(0x23) - restart_timer - - beginloop(0x04) - if_timer_gt(400, /*goto*/ 0x02) - endloop(0x04) - - label(0x02) - set_object_flag(OBJ_BAGGAGE_CARRIER, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_suitcase_scanning[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_SUITCASE_DEPOSITED, TRUE, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - restart_timer - if_difficulty_lt(DIFF_SA, /*goto*/ 0x07) - if_difficulty_lt(DIFF_PA, /*goto*/ 0xb7) - - // PA - set_countdown_timer(30) - show_countdown_timer - start_countdown_timer - - beginloop(0x06) - if_stage_flag_eq(STAGEFLAG_CONSOLE_ACTIVATED, TRUE, /*goto*/ 0x07) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) - if_countdown_timer_lt(1, /*goto*/ 0x02) - endloop(0x06) - - // SA - label(0xb7) - set_countdown_timer(45) - show_countdown_timer - start_countdown_timer - - beginloop(0x05) - if_stage_flag_eq(STAGEFLAG_CONSOLE_ACTIVATED, TRUE, /*goto*/ 0x07) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) - if_countdown_timer_lt(1, /*goto*/ 0x02) - endloop(0x05) - - // Scanned - label(0x02) - show_hudmsg(CHR_BOND, L_CAVE_039) // "Suitcase has been scanned." - set_stage_flag(STAGEFLAG_SUITCASE_SCANNED) - - // Agent - label(0x07) - stop_countdown_timer - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_init_office1[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_OFFICE1) - endlist -}; - -u8 func0409_office1[] = { -#define LABEL_RUN_TO_FOYER 0x4f - - set_self_chrflag(CHRCFLAG_00040000) - set_morale(0) - set_shotlist(AILIST_OFFICE1) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x42) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x42) - chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x02) - if_saw_injury(0x00, /*goto*/ LABEL_RUN_TO_FOYER) - if_stage_flag_eq(STAGEFLAG_OFFICE2_DEAD, TRUE, /*goto*/ LABEL_RUN_TO_FOYER) - if_object_in_good_condition(0x45, /*goto*/ 0x33) - goto_next(LABEL_RUN_TO_FOYER) - - label(0x33) - if_chr_idle(/*goto*/ 0x31) - goto_first(0x42) - - label(0x31) - endloop(0x00) - - // Jo in sight - label(0x02) - if_stage_flag_eq(STAGEFLAG_DISGUISED, FALSE, /*goto*/ 0x07) - - // Disguised - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) - goto_next(0x07) - - // Disguised and unarmed-ish - label(0x31) - chr_do_animation(ANIM_SITTING_0265, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - speak(CHR_TARGET, L_CAVE_041, MP3_02E6, CHANNEL_4, COLOR_08_RED) // "Are you new around here?" - - beginloop(0x09) - if_saw_injury(0x00, /*goto*/ LABEL_RUN_TO_FOYER) - if_stage_flag_eq(STAGEFLAG_OFFICE2_DEAD, TRUE, /*goto*/ LABEL_RUN_TO_FOYER) - if_chr_has_object(CHR_TARGET, OBJ_BRIEFCASE1, /*goto*/ 0x02) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_HORIZONSCANNER, /*goto*/ 0x31) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_SUITCASE, /*goto*/ 0x31) - goto_next(0x07) - - label(0x31) - if_chr_idle(/*goto*/ 0x31) - goto_next(0x7b) - - label(0x31) - reloop(0x09) - - label(0x7b) - chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - endloop(0x09) - - // Picked up briefcase - label(0x02) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - beginloop(0x0b) - if_sound_finished(CHANNEL_4, /*goto*/ 0x31) - reloop(0x0b) - - label(0x31) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(60, /*goto*/ 0x02) - endloop(0x0b) - - label(0x02) - speak(CHR_TARGET, L_CAVE_042, MP3_02E7, CHANNEL_4, COLOR_08_RED) // "Hey - give me back my case." - restart_timer - increase_squadron_alertness(100) - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x0a) - - label(0x02) - goto_next(LABEL_RUN_TO_FOYER) - - // Not disguised, or disguised with weapon equipped - label(0x07) - object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) - - beginloop(0x05) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(60, /*goto*/ 0x02) - endloop(0x05) - - label(0x72) - label(0x02) - speak(CHR_TARGET, L_CAVE_040, MP3_02E5, CHANNEL_4, COLOR_08_RED) // "Hey, you - this is a restricted area." - increase_squadron_alertness(100) - restart_timer - chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x06) - if_timer_gt(180, /*goto*/ LABEL_RUN_TO_FOYER) - endloop(0x06) - - // Run to foyer - label(LABEL_RUN_TO_FOYER) - jog_to_pad(PAD_CAVE_001B) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x08) - - label(0x02) - speak(CHR_TARGET, L_CAVE_044, MP3_02E8, CHANNEL_4, COLOR_08_RED) // "Upstairs...there's an intruder." - increase_squadron_alertness(100) - set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) - activate_alarm - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040e_init_office2[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_OFFICE2) - endlist -}; - -u8 func040a_office2[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_morale(0) - set_shotlist(AILIST_OFFICE2) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x42) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x42) - chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x00) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x02) - if_saw_injury(0x00, /*goto*/ 0x72) - if_stage_flag_eq(STAGEFLAG_OFFICE1_DEAD, TRUE, /*goto*/ 0x72) - if_chr_idle(/*goto*/ 0x31) - goto_first(0x42) - - label(0x31) - endloop(0x00) - - // Alert - label(0x02) - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x02) - if_saw_injury(0x00, /*goto*/ 0x02) - if_stage_flag_eq(STAGEFLAG_OFFICE1_DEAD, TRUE, /*goto*/ 0x72) - endloop(0x09) - - label(0x72) - label(0x02) - object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x05) - - // Wait for other guy to finish talking - beginloop(0x05) - if_sound_finished(CHANNEL_4, /*goto*/ 0x31) - reloop(0x05) - - label(0x31) - yield - yield - yield - yield - yield - if_sound_finished(CHANNEL_4, /*goto*/ 0x31) - reloop(0x05) - - label(0x31) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(60, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - if_chr_deadish(CHR_OFFICE1, /*goto*/ 0x02) - speak(CHR_TARGET, L_CAVE_043, MP3_02E9, CHANNEL_4, COLOR_09_BLUE) // "You get security - I'll deal with her..." - increase_squadron_alertness(100) - restart_timer - - beginloop(0x06) - if_chr_stopped(/*goto*/ 0x02) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x06) - - // Attack player - label(0x02) - set_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - // Unreachable - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_check_end_level[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_objective_complete(0, /*goto*/ 0x31) - goto_first(0x00) - - label(0x31) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x31) - if_objective_complete(1, /*goto*/ 0x31) - goto_first(0x00) - - label(0x31) - if_objective_complete(2, /*goto*/ 0x31) - goto_first(0x00) - - label(0x31) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x31) - if_objective_complete(3, /*goto*/ 0x31) - goto_first(0x00) - - label(0x31) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_CAVE_00E9, /*goto*/ 0x04) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_CAVE_00D5, /*goto*/ 0x05) - endloop(0x00) - - // Pad 0x00e9 - label(0x04) - set_stage_flag(STAGEFLAG_BOARDED_PLANE) - unset_savefile_flag(GAMEFILEFLAG_AF1_ENTRY) - if_chr_deadish(CHR_BOND, /*goto*/ 0x31) - goto_next(0x02) - - label(0x31) - if_chr_deadish(CHR_COOP, /*goto*/ 0x31) - goto_next(0x02) - - // Both players dead - label(0x31) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x02) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, 0x0425) - - // Pad 0x00d5 - label(0x05) - set_stage_flag(STAGEFLAG_BOARDED_PLANE) - set_savefile_flag(GAMEFILEFLAG_AF1_ENTRY) - if_chr_deadish(CHR_BOND, /*goto*/ 0x31) - goto_next(0x02) - - label(0x31) - if_chr_deadish(CHR_COOP, /*goto*/ 0x31) - goto_next(0x02) - - // Both players dead - label(0x31) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x02) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, 0x0425) - endlist -}; - -u8 func100d_laser_panel[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LASER_PANEL, /*goto*/ 0x04) - if_object_in_good_condition(OBJ_LASER_PANEL, /*goto*/ 0x02) - goto_next(0x05) - - label(0x02) - reloop(0x00) - - label(0x04) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_LASER_PANEL, TRUE) - show_hudmsg(CHR_P1P2, L_CAVE_045) // "Laser grid access denied." - endloop(0x00) - - label(0x05) - set_stage_flag(STAGEFLAG_LASERS_OVERLOADED) - show_hudmsg(CHR_P1P2, L_CAVE_046) // "Laser grid system has been overloaded." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_check_alaskans_killed[] = { - set_chr_chrflag(0x00, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x01, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x02, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x03, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x04, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x05, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x06, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x07, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x08, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x09, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0a, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0b, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0c, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0d, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0e, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0f, CHRCFLAG_KILLCOUNTABLE) - - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) - if_kill_count_gt(2, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - show_hudmsg(CHR_BOND, L_CAVE_047) // "Too many neutral casualties inflicted." - set_stage_flag(STAGEFLAG_TOO_MANY_NEUTRALS_KILLED) - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func0410_unused[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(22) - set_reaction_speed(80) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_00000040) - set_chr_chrflag(CHR_SELF, CHRCFLAG_00040000) - set_ailist(CHR_SELF, AILIST_NSA) - endlist -}; - -u8 func040f_nsa[] = { - set_shotlist(AILIST_NSA) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x44) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x44) - if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_PRESET, /*goto*/ 0x02) - - // Return to pad - walk_to_pad(PAD_PRESET) - - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_distance_to_target_lt(250, /*goto*/ 0x64) - if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, TRUE, BANK_0, /*goto*/ 0x33) - if_chr_in_room(CHR_TARGET, 0x00, 0x006b, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x006c, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x006d, /*goto*/ 0x31) - goto_first(0x00) - - label(0x33) - if_chr_in_room(CHR_TARGET, 0x00, 0x003c, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x003d, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x003e, /*goto*/ 0x31) - if_chr_y(CHR_TARGET, -257, OPERATOR_LESS_THAN, /*goto*/ 0x6d) // gone down an escalator - goto_next(0x76) - - label(0x6d) - if_chr_in_room(CHR_TARGET, 0x00, 0x003f, /*goto*/ 0x31) - label(0x76) - goto_first(0x00) - - label(0x31) - if_can_see_target(/*goto*/ 0x04) - if_chr_distance_to_pad_lt(CHR_SELF, 70, PAD_PRESET, /*goto*/ 0x02) - endloop(0x06) - - // At pad - label(0x02) - stop_chr - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x0b) - if_can_see_target(/*goto*/ 0x31) - endloop(0x00) - - // Seen player - label(0x31) - if_chr_y(CHR_TARGET, -330, OPERATOR_LESS_THAN, /*goto*/ 0x02) - goto_first(0x00) - - // Seen player down escalator - label(0x02) - if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, TRUE, BANK_0, /*goto*/ 0x33) - if_chr_in_room(CHR_TARGET, 0x00, 0x006b, /*goto*/ 0x04) - if_chr_in_room(CHR_TARGET, 0x00, 0x006c, /*goto*/ 0x04) - if_chr_in_room(CHR_TARGET, 0x00, 0x006d, /*goto*/ 0x04) - goto_first(0x00) - - label(0x33) - if_chr_in_room(CHR_TARGET, 0x00, 0x003c, /*goto*/ 0x04) - if_chr_in_room(CHR_TARGET, 0x00, 0x003d, /*goto*/ 0x04) - if_chr_in_room(CHR_TARGET, 0x00, 0x003e, /*goto*/ 0x04) - if_chr_y(CHR_TARGET, -257, OPERATOR_LESS_THAN, /*goto*/ 0x6d) - goto_next(0x76) - - // Seen player down escalator but not in security hall - label(0x6d) - if_chr_in_room(CHR_TARGET, 0x00, 0x003f, /*goto*/ 0x04) // escalator room - label(0x76) - goto_first(0x00) - - // Seen player in security hall or escalator room - label(0x04) - restart_timer - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_target_out_of_fov_left(245, /*goto*/ 0x02) - if_timer_gt(60, /*goto*/ 0x02) - endloop(0x09) - - label(0x02) - chr_do_animation(ANIM_TALKING_0098, 0, 90, 0, 16, CHR_SELF, 2) - say_quip(CHR_BOND, 0x1c, 0xff, 0x02, 0xff, 0x81, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x0a) - - label(0x02) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - // Unreachable - restart_timer - set_target_chr(CHR_P1P2) - try_walk_to_target(/*goto*/ 0x05) - - // Also unreachable - label(0x31) - restart_timer - set_target_chr(CHR_BOND) - try_run_to_target(/*goto*/ 0x05) - - beginloop(0x05) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - if_chr_stopped(/*goto*/ 0x32) - if_timer_gt(30, /*goto*/ 0x32) - if_chr_y(CHR_TARGET, -330, OPERATOR_LESS_THAN, /*goto*/ 0x02) - goto_next(0x07) - - label(0x02) - if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, TRUE, BANK_0, /*goto*/ 0x33) - if_chr_in_room(CHR_TARGET, 0x00, 0x006b, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x006c, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x006d, /*goto*/ 0x31) - goto_next(0x07) - - label(0x33) - if_chr_in_room(CHR_TARGET, 0x00, 0x003c, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x003d, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x003e, /*goto*/ 0x31) - if_chr_in_room(CHR_TARGET, 0x00, 0x003f, /*goto*/ 0x31) - goto_next(0x07) - - label(0x31) - if_distance_to_target_lt(250, /*goto*/ 0x02) - endloop(0x05) - - label(0x32) - goto_first(0x04) - - label(0x64) - label(0x02) - set_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_returnlist(CHR_SELF, AILIST_NSA) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - - label(0x07) - chr_do_animation(ANIM_TALKING_0098, 0, 90, 0, 16, CHR_SELF, 2) - say_quip(CHR_BOND, 0x1d, 0xff, 0x02, 0xff, 0x81, 0x00, 0x00) - label(0x08) - yield - if_chr_stopped(/*goto*/ 0x02) - goto_first(0x08) - - label(0x02) - goto_first(0x44) - - label(0x0b) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0412_init_takeover_lackey[] = { - set_shotlist(GAILIST_ALERTED) - set_self_chrflag(CHRCFLAG_00000040) - set_chr_dodge_rating(2, 10) - set_accuracy(60) - set_reaction_speed(80) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_TAKEOVER_LACKEY) - endlist -}; - -u8 func0411_takeover_lackey[] = { - set_shotlist(GAILIST_ALERTED) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x00) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_deadish(0x0c, /*goto*/ 0x7b) - if_target_in_sight(/*goto*/ 0x31) - goto_next(0x02) - - label(0x31) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x02) - label(0x02) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ 0x31) - if_target_in_sight(/*goto*/ 0x02) - label(0x31) - endloop(0x00) - - // Alaskan guard is dead - label(0x7b) - label(0x02) - set_chr_team(CHR_SELF, TEAM_04) - if_chr_deadish(0x0c, /*goto*/ 0x02) - set_target_chr(0x0c) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x31) - label(0x31) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) - - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x04) - - label(0x02) - speak(CHR_TARGET, L_CAVE_065, SFX_WERE_TAKING_OVER, CHANNEL_6, COLOR_08_RED) // "We're taking over!!" - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x09) - - label(0x02) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) - set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISE_UNCOVERED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func0413_alaskan_console_guard[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 unregistered_function3[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_OFFICEWORKER) - endlist -}; - -u8 func0414_officeworker[] = { - set_morale(0) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x00) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x44) - chr_do_animation(ANIM_SITTING_DORMANT, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) - if_chr_idle(/*goto*/ 0x02) - goto_next(0x08) - - label(0x02) - if_target_in_sight(/*goto*/ 0x02) - label(0x33) - endloop(0x00) - - label(0x02) - chr_do_animation(ANIM_SITTING_0265, 0, 120, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - say_quip(CHR_BOND, 0x20, 0xff, 0x0a, 0xff, BANK_1, 0x00, 0x00) - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x07) - if_chr_idle(/*goto*/ 0x02) - goto_next(0x08) - - label(0x02) - if_timer_gt(180, /*goto*/ 0x02) - endloop(0x09) - - label(0x02) - goto_first(0x00) - - label(0x08) - goto_first(0x44) - - // After takeover - label(0x07) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x6d) - set_chr_hiddenflag(0x3a, CHRHFLAG_00100000) - chr_move_to_pad(0x3a, PAD_CAVE_00D7, 0x00, /*goto*/ 0x31) - - label(0x31) - chr_do_animation(ANIM_SITTING_DORMANT, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - - label(0x77) - chr_do_animation(ANIM_COWER_0229, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x02) - if_chr_idle(/*goto*/ 0x31) - goto_first(0x77) - - label(0x31) - endloop(0x04) - - label(0x02) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x78) - - beginloop(0x78) - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(40, /*goto*/ 0x02) - endloop(0x78) - - label(0x02) - do_preset_animation(PRESETANIM_TALK7) - speak(CHR_TARGET, L_CAVE_054, MP3_0338, CHANNEL_4, COLOR_08_RED) // "Stop them - they're breaking into the safe..." - - beginloop(0x05) - if_sound_finished(CHANNEL_4, /*goto*/ 0x79) - endloop(0x05) - - label(0x79) - chr_do_animation(ANIM_COWER_0229, -1, 60, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x06) - if_chr_idle(/*goto*/ 0x02) - goto_first(0x79) - - label(0x02) - endloop(0x06) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x6d) - damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) - if_chr_dead(CHR_SELF, /*goto*/ 0x31) - endloop(0x6d) - - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_alaskan_mountainlift_guard[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1010_setup_baggage_carrier[] = { - set_object_flag(OBJ_BAGGAGE_CARRIER, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define laser_overloaded_logic(laser1, laser2, time) \ - beginloop(0x00) \ - if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x04) \ - endloop(0x00) \ - \ - label(0x04) \ - restart_timer \ - open_door(laser1) \ - open_door(laser2) \ - \ - beginloop(0x05) \ - if_timer_gt(time, /*goto*/ 0x02) \ - endloop(0x05) \ - \ - label(0x02) \ - close_door(laser1) \ - close_door(laser2) \ - \ - beginloop(0x05) \ - if_timer_gt(time, /*goto*/ 0x02) \ - endloop(0x05) \ - \ - label(0x02) \ - goto_first(0x04) \ - \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 func1011_lasers1[] = { - laser_overloaded_logic(0x07, 0x0c, 120) - endlist -}; - -u8 func1012_lasers2[] = { - laser_overloaded_logic(0x0e, 0x10, 180) - endlist -}; - -u8 func1013_lasers3[] = { - laser_overloaded_logic(0x0b, 0x12, 90) - endlist -}; - -u8 func1014_lasers4[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x04) - endloop(0x00) - - label(0x04) - restart_timer - open_door(0x11) - - beginloop(0x05) - if_timer_gt(180, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - close_door(0x11) - - beginloop(0x05) - if_timer_gt(180, /*goto*/ 0x02) - endloop(0x05) - - label(0x02) - goto_first(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This is the first laser, which gets disabled permanently. - */ -u8 func1017_laser5[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x04) - endloop(0x00) - - label(0x04) - restart_timer - disable_object(0x13) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - open_door(0x13) - - beginloop(0x05) - if_door_state(0x13, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x31) - endloop(0x05) - - label(0x31) - goto_first(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_unused[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(45) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(30) - set_shield(0) - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_unhide_laser_guards[] = { - // These are all invalid chrs. They must have been removed. - // They would have appeared when the lasers were overloaded. - disable_chr(0x3e) - disable_chr(0x3f) - disable_chr(0x40) - disable_chr(0x41) - set_chr_chrflag(0x3e, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x3f, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x40, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x41, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_LASERS_OVERLOADED, TRUE, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - unset_chr_chrflag(0x3e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x3f, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x40, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x41, CHRCFLAG_HIDDEN) - enable_chr(0x3e) - set_ailist(0x3e, 0x0404) - enable_chr(0x3f) - set_ailist(0x3f, GAILIST_ALERTED) - enable_chr(0x40) - set_ailist(0x40, GAILIST_ALERTED) - enable_chr(0x41) - set_ailist(0x41, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * After overloading the lasers, some guards would have been unhidden who will - * chase you down. This function would have been assigned to one of them. - * - * @unused - */ -u8 func0404_laser_guard[] = { - set_shotlist(GAILIST_UNALERTED) - run_to_pad(PAD_CAVE_0002) - label(0x04) - yield - label(0x02) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_console_noises[] = { - yield - assign_sound(SFX_8141, CHANNEL_0) - play_sound_from_object(CHANNEL_0, 0x04, 1, 600, 800) - yield - assign_sound(SFX_8143, CHANNEL_2) - play_sound_from_object(CHANNEL_2, 0x05, 1, 500, 1000) - yield - play_sound_from_pad(PAD_CAVE_0114, SFX_81A7) - yield - play_sound_from_pad(PAD_CAVE_0115, SFX_81A7) - yield - play_sound_from_pad(PAD_CAVE_01AC, SFX_811B) - - label(0x42) - restart_timer - - beginloop(0x00) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x09) - - label(0x31) - if_timer_gt(180, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - yield - if_object_in_good_condition(0x01, /*goto*/ 0x31) - goto_next(0x09) - - label(0x31) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x09) - call_rng - if_rand_lt(100, /*goto*/ 0x76) - if_rand_lt(150, /*goto*/ 0x77) - if_rand_lt(200, /*goto*/ 0x78) - goto_first(0x42) - - // Rand 1 - label(0x76) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x09) - - label(0x31) - mute_channel(CHANNEL_1) - yield - yield - yield - yield - yield - assign_sound(SFX_8112, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_CONSOLE, 1, 600, 800) - goto_first(0x42) - - // Rand 2 - label(0x77) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x09) - - label(0x31) - mute_channel(CHANNEL_1) - yield - yield - yield - yield - yield - assign_sound(SFX_813F, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_CONSOLE, 1, 600, 800) - goto_first(0x42) - - // Rand 3 - label(0x78) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x09) - - label(0x31) - mute_channel(CHANNEL_1) - yield - yield - yield - yield - yield - assign_sound(SFX_8140, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_CONSOLE, 1, 600, 800) - goto_first(0x42) - - label(0x09) - mute_channel(CHANNEL_1) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0426_init_alaskan_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Assigned to stripes guards and NSA lackeys during takeover. - */ -u8 func0427_init_posttakeover_guard[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_team(CHR_SELF, TEAM_04) - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(45) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(30) - set_shield(0) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_POSTTAKEOVER_GUARD) - endlist -}; - -/** - * Wait until not in sight by any human player, - * then assign AILIST_BECOME_UNALERTED. - */ -u8 func0428_posttakeover_guard[] = { - beginloop(0x00) - set_target_chr(CHR_BOND) - if_nearly_in_targets_sight(30, /*goto*/ 0x31) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x02) - set_target_chr(CHR_COOP) - if_nearly_in_targets_sight(30, /*goto*/ 0x31) - - label(0x02) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x02) - set_target_chr(CHR_ANTI) - if_nearly_in_targets_sight(30, /*goto*/ 0x31) - - label(0x02) - unset_self_chrflag(CHRCFLAG_HIDDEN) - unset_self_chrflag(CHRCFLAG_00040000) - set_ailist(CHR_SELF, AILIST_BECOME_UNALERTED) - - label(0x31) - restart_timer - - beginloop(0x6d) - if_timer_gt(300, /*goto*/ 0x02) - endloop(0x6d) - - label(0x02) - endloop(0x00) - - endlist -}; - -/** - * @unused - */ -u8 func0429_unused[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(22) - set_reaction_speed(80) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Assigned to two stripes guards in the foyer during takeover. - */ -u8 func042a_foyer_spawner[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(12) - set_reaction_speed(45) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(30) - set_shield(0) - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) - if_chr_y(CHR_TARGET, -4800, OPERATOR_LESS_THAN, /*goto*/ 0x09) - reloop(0x00) - - // Security shut down - label(0x02) - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - if_never_been_onscreen(/*goto*/ 0x6a) - if_can_see_target(/*goto*/ 0x04) - reloop(0x00) - - label(0x04) - set_ailist(CHR_SELF, AILIST_FOYER_CLONE) - - label(0x6a) - unset_self_chrflag(CHRCFLAG_HIDDEN) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x6a) - reloop(0x00) - - label(0x6a) - try_spawn_clone2(CHR_SELF, AILIST_INIT_FOYER_CLONE, 0, /*goto*/ 0x31) - label(0x31) - yield - endloop(0x00) - - // Player has gone to bottom without disabling security - label(0x09) - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -u8 func042b_init_foyer_clone[] = { - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - label(0x00) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x42, /*goto*/ 0x02) - label(0x02) - set_ailist(CHR_SELF, AILIST_FOYER_CLONE) - endlist -}; - -u8 func042c_foyer_clone[] = { - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -#define hoverbot_do_paths(path1, path2, path3) \ - /* Path 1 */ \ - label(0x44) \ - begin_hovercar_path(path1) \ - label(0x31) \ - set_vehicle_speed(512, 120) \ - \ - beginloop(0x04) \ - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 3, /*goto*/ 0x02) \ - endloop(0x04) \ - \ - /* Path 2 */ \ - label(0x02) \ - begin_hovercar_path(path2) \ - label(0x31) \ - set_vehicle_speed(512, 120) \ - \ - beginloop(0x05) \ - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 3, /*goto*/ 0x02) \ - endloop(0x05) \ - \ - /* Path 3 */ \ - label(0x02) \ - begin_hovercar_path(path3) \ - label(0x31) \ - set_vehicle_speed(512, 120) \ - \ - beginloop(0x06) \ - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 3, /*goto*/ 0x02) \ - endloop(0x06) \ - \ - label(0x02) \ - goto_first(0x44) \ - \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 func042d_hoverbot1[] = { - hoverbot_do_paths(0, 1, 2) - endlist -}; - -u8 func042e_hoverbot2[] = { - hoverbot_do_paths(1, 2, 0) - endlist -}; - -u8 func042f_hoverbot3[] = { - hoverbot_do_paths(2, 0, 1) - endlist -}; - -u8 func0430_hoverbot4[] = { - hoverbot_do_paths(3, 4, 5) - endlist -}; - -u8 func0431_hoverbot5[] = { - hoverbot_do_paths(4, 5, 3) - endlist -}; - -u8 func0432_hoverbot6[] = { - hoverbot_do_paths(5, 3, 4) - endlist -}; - -/** - * This looks to be copied from Chicago? But is assigned to an chr called - * steward. - */ -u8 func0419_ba8c[] = { - set_alertness(255) - set_returnlist(CHR_SELF, 0x0419) - set_shotlist(0x0419) - if_chr_deadish(CHR_SELF, /*goto*/ 0x02) - goto_next(0x31) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x31) - if_chr_idle(/*goto*/ 0x6b) - if_num_times_shot_lt(1, /*goto*/ 0x00) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x02) - endloop(0x0c) - - label(0x02) - goto_next(0x0b) - - // Unreachable - restart_timer - - beginloop(0x6b) - if_saw_death(0x00, /*goto*/ 0x4f) - if_saw_injury(0x00, /*goto*/ 0x0f) - if_timer_gt(180, /*goto*/ 0x02) - endloop(0x6b) - - label(0x02) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x33) - stop_chr - goto_next(0x00) - - label(0x33) - start_patrol - - label(0x00) - yield - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x6c) - call_rng - if_rand_gt(128, /*goto*/ 0x6c) - - label(0x6d) - restart_timer - - label(0x07) - stop_chr - if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x31) - call_rng - if_rand_gt(128, /*goto*/ 0x31) - call_rng - if_rand_lt(64, /*goto*/ 0x6e) - if_rand_lt(128, /*goto*/ 0x6f) - if_rand_lt(196, /*goto*/ 0x70) - set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - chr_do_animation(ANIM_SMOKE_CIGARETTE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x72) - - label(0x6e) - chr_do_animation(ANIM_SCRATCH_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x72) - - label(0x6f) - chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x72) - - label(0x70) - chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x72) - - label(0x71) - chr_do_animation(ANIM_TWO_GUN_HOLD, 0, 100, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x72) - - label(0x31) - unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_PRESET, /*goto*/ 0x02) - goto_next(0x31) - - label(0x02) - call_rng - if_rand_lt(64, /*goto*/ 0x6e) - if_rand_lt(128, /*goto*/ 0x6f) - if_rand_lt(196, /*goto*/ 0x70) - try_set_target_pad_to_something(0x08, /*goto*/ 0x31) - label(0x6e) - try_set_target_pad_to_something(0x02, /*goto*/ 0x31) - label(0x6f) - try_set_target_pad_to_something(0x04, /*goto*/ 0x31) - label(0x70) - try_set_target_pad_to_something(0x08, /*goto*/ 0x31) - goto_next(0x72) - label(0x31) - go_to_target_pad(GOPOSFLAG_WALK) - restart_timer - label(0x72) - yield - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_saw_death(0x00, /*goto*/ 0x4f) - if_saw_injury(0x00, /*goto*/ 0x0f) - if_target_in_sight(/*goto*/ 0x02) - if_chr_stopped(/*goto*/ 0x73) - if_chr_idle(/*goto*/ 0x31) - if_timer_gt(180, /*goto*/ 0x73) - label(0x31) - goto_first(0x72) - - label(0x73) - goto_first(0x00) - - label(0x6c) - if_saw_death(0x00, /*goto*/ 0x4f) - if_saw_injury(0x00, /*goto*/ 0x0f) - if_target_in_sight(/*goto*/ 0x02) - goto_first(0x00) - - label(0x02) - restart_timer - label(0x04) - yield - if_saw_death(0x00, /*goto*/ 0x4f) - if_saw_injury(0x00, /*goto*/ 0x0f) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ 0x31) - goto_next(0x02) - label(0x31) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x31) - if_distance_to_target_gt(450, /*goto*/ 0x31) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_returnlist(CHR_SELF, 0x0419) - set_ailist(CHR_SELF, GAILIST_CIVILIAN_SAY_COMMENT) - label(0x31) - if_timer_lt(600, /*goto*/ 0x31) - unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - label(0x31) - goto_first(0x00) - - label(0x0f) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - label(0x08) - yield - if_target_in_fov_left(10, /*goto*/ 0x02) - if_timer_gt(40, /*goto*/ 0x02) - goto_first(0x08) - - label(0x4f) - restart_timer - chr_do_animation(ANIM_LOOK_AROUND_FRANTIC, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - label(0x0f) - yield - if_timer_gt(90, /*goto*/ 0x0b) - goto_first(0x0f) - - label(0x02) - say_quip(CHR_BOND, 0x24, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - label(0x09) - yield - if_timer_gt(120, /*goto*/ 0x0b) - goto_first(0x09) - - label(0x0b) - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x02) - goto_next(0x0e) - label(0x31) - goto_first(0x04) - - label(0x02) - try_run_to_chr(CHR_PRESET, /*goto*/ 0x05) - label(0x05) - yield - if_detected_chr(CHR_PRESET, /*goto*/ 0x02) - goto_first(0x05) - - label(0x02) - increase_squadron_alertness(100) - say_quip(CHR_BOND, 0x25, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) - label(0x0e) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 20, CHR_SELF, 2) - label(0x0a) - yield - if_chr_stopped(/*goto*/ 0x31) - goto_first(0x0a) - - label(0x31) - goto_first(0x0e) - - endlist -}; - -u8 func041a_draw_magnum[] = { - set_chr_team(CHR_SELF, TEAM_04) - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x00) - label(0x00) - unset_self_flag_bankx(CHRFLAG1_HANDCOMBATONLY, BANK_1) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_self_flag_bankx(CHRFLAG1_PREWARNED, BANK_1) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func141b_setup_lifts[] = { - activate_lift(1, 0x20) - activate_lift(2, 0x21) - activate_lift(9, 0x36) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_safe_switch[] = { - set_object_flag2(OBJ_FLIGHTPLANS, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) - - // Wait for player to activate switch - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_SAFE_SWITCH, /*goto*/ 0x31) - endloop(0x00) - - // Raise switch cover - label(0x31) - unset_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) - - beginloop(0x05) - if_lift_stationary(OBJ_SAFE_SWITCH_COVER, /*goto*/ 0x31) - endloop(0x05) - - label(0x31) - set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) - - // Wait for player to press button again - beginloop(0x06) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_SAFE_SWITCH, /*goto*/ 0x31) - endloop(0x06) - - // Open safe - label(0x31) - play_sound(SFX_PRESS_SWITCH, -1) - yield - yield - yield - yield - yield - open_door(OBJ_SAFEDOOR) - yield - set_object_flag(OBJ_SAFEDOOR, OBJFLAG_DOOR_KEEPOPEN) - - unset_object_flag2(OBJ_FLIGHTPLANS, OBJFLAG2_INVISIBLE) - unset_object_flag(OBJ_FLIGHTPLANS, OBJFLAG_UNCOLLECTABLE) - set_object_flag(OBJ_FLIGHTPLANS, OBJFLAG_COLLECTABLE) - set_object_flag2(OBJ_FLIGHTPLANS, OBJFLAG2_PICKUPWITHOUTLOS) - - // 0x32 = a shield - set_object_flag2(0x34, OBJFLAG2_PICKUPWITHOUTLOS) - unset_object_flag(0x34, OBJFLAG_UNCOLLECTABLE) - - // 0x32 = invalid object - unset_object_flag2(0x32, OBJFLAG2_INVISIBLE) - unset_object_flag(0x32, OBJFLAG_UNCOLLECTABLE) - - label(0x31) - - beginloop(0x08) - if_door_state(OBJ_SAFEDOOR, DOORSTATE_CLOSING, /*goto*/ 0x31) - reloop(0x08) - - label(0x31) - open_door(OBJ_SAFEDOOR) - endloop(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_safe_switch_cover[] = { - set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) - - beginloop(0x00) - if_chr_activated_object(CHR_ANY, OBJ_SAFE_SWITCH_COVER, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - unset_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_DEACTIVATED) - yield - yield - - beginloop(0x04) - if_lift_stationary(OBJ_SAFE_SWITCH_COVER, /*goto*/ 0x31) - endloop(0x04) - - label(0x31) - set_object_flag(OBJ_SAFE_SWITCH_COVER, OBJFLAG_CANNOT_ACTIVATE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_check_disguise_used[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - show_hudmsg(CHR_P1P2, L_CAVE_049) // "Disguise worn." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_intro[] = { - label(0x31) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_AIRBASE_INTRO) - camera_movement(ANIM_CUT_CAVE_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_hudpiece_visible(CHR_BOND, TRUE) - set_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TRENT, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 4) - set_chr_chrflag(0x48, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x48, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x48, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x48, 4) - set_chr_chrflag(0x49, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x49, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x49, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x49, 4) - set_chr_chrflag(0x4a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x4a, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x4a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x4a, 4) - set_chr_chrflag(0x4b, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x4b, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x4b, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_GUARD1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x4b, 4) - set_chr_chrflag(0x4c, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x4c, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x4c, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_GUARD2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x4c, 4) - enable_object(0x22) - set_object_flag2(0x22, OBJFLAG2_04000000) - set_object_flag3(0x22, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_CAVE_INTRO_CABLECAR, 0x22, 0x04, 0xffff) - enable_object(0x2f) - set_object_flag2(0x2f, OBJFLAG2_04000000) - set_object_flag3(0x2f, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_CAVE_INTRO_BINOCULARS, 0x2f, 0x04, 0xffff) - restart_timer - fade_to_color(0x000000ff, 0x0000) - fade_to_color(0x00000000, 0x006e) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - wait_until(30, 0x6d) - speak(CHR_BOND, L_CAVE_055, MP3_0447, CHANNEL_7, COLOR_09_BLUE) // "Agent Dark in position. I can see the main entranc..." - - wait_until(312, 0x89) - play_sound(SFX_0594, CHANNEL_10) - - wait_until(346, 0x8a) - play_sound(SFX_0595, CHANNEL_10) - - wait_until(580, 0x76) - speak(CHR_BOND, L_CAVE_056, MP3_0448, CHANNEL_10, COLOR_06_WHITE) // "Excellent, Joanna. That cable car is your way in....." - - wait_until(968, 0x8b) - play_sound(SFX_0596, CHANNEL_10) - - wait_until(1315, 0x77) - speak(CHR_BOND, L_CAVE_057, MP3_07DB, CHANNEL_10, COLOR_09_BLUE) // "That they're probably innocent of any involvement ..." - - wait_until(1411, 0x8e) - play_sound(SFX_04AF, CHANNEL_0) - - wait_until(1735, 0x85) - mute_channel(CHANNEL_0) - play_sound(SFX_04EA, CHANNEL_10) - - wait_until(1800, 0x86) - play_sound(SFX_04EB, CHANNEL_10) - - wait_until(1890, 0x87) - play_sound(SFX_04EC, CHANNEL_10) - - wait_until(1900, 0x78) - speak(CHR_BOND, L_CAVE_058, MP3_0449, CHANNEL_5, COLOR_06_WHITE) // "I don't know how far the conspiracy has spread thr..." - - wait_until(1970, 0x8c) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(1980, 0x88) - - wait_until(2013, 0x8d) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(2048, 0x8f) - play_sound(SFX_0596, CHANNEL_10) - - wait_until(2076, 0x92) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(2088, 0x93) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(2116, 0x94) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(2140, 0x95) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(2154, 0x96) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(2184, 0x97) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(2202, 0x98) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(2246, 0x99) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(2296, 0x9a) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(2332, 0x9b) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(2376, 0x9c) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(2418, 0x9d) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(2446, 0x9e) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(2486, 0x9f) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(2526, 0xa0) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(2558, 0xa1) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(2674, 0xa2) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(2700, 0x79) - speak(CHR_BOND, L_CAVE_059, MP3_044A, CHANNEL_7, COLOR_09_BLUE) // "Yes, and protect him from his abductors. Do you ha..." - - wait_until(2704, 0xa3) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(2720, 0xa4) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(2770, 0xa5) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(2796, 0xa6) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(2812, 0xa7) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(2830, 0xa8) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(2846, 0xa9) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(2856, 0xaa) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(2890, 0xab) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(2946, 0xac) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(2976, 0xad) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(3008, 0xae) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(3116, 0xaf) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(3154, 0xb0) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3188, 0xb1) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(3230, 0xb2) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(3250, 0x7a) - speak(CHR_BOND, L_CAVE_060, MP3_044B, CHANNEL_5, COLOR_06_WHITE) // "Only vague suspicions, and I won't distract you wi..." - - wait_until(3387, 0xb3) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(3427, 0xb4) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(3448, 0xb5) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(3656, 0xb6) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(3723, 0x90) - - wait_until(3796, 0x91) - play_sound(SFX_04FC, CHANNEL_10) - - beginloop(0x04) - if_camera_animating(/*goto*/ 0x31) - goto_next(0x48) - - label(0x31) - if_controller_button_pressed(/*goto*/ 0x48) - label(0x31) - endloop(0x04) - - label(0x48) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_10) - disable_object(0x22) - disable_object(0x2f) - label(0x02) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x48, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x49, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x4a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x4b, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x4c, CHRCFLAG_UNPLAYABLE) - remove_chr(CHR_TRENT) - remove_chr(0x48) - remove_chr(0x4a) - remove_chr(0x4b) - remove_chr(0x4c) - set_chr_chrflag(0x49, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x49, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x49, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_NSA2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x49, 2) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_CAVE_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - set_chr_hudpiece_visible(CHR_BOND, FALSE) - unset_object_flag2(0x22, OBJFLAG2_04000000) - set_object_flag3(0x22, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_CAVE_INTRO_CABLECAR, 0x22, 0x01, 0xfffe) - set_ailist(0x00, 0x0405) - set_ailist(0x01, 0x0405) - set_ailist(CHR_STEWARDESS, AILIST_STEWARDESS) - stop_cutscene_track - stop_ambient_track - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_msg_nowsyourchance[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MSG_NOWSYOURCHANCE, TRUE, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - speak(CHR_BOND, L_CAVE_050, SFX_8182, CHANNEL_6, COLOR_09_BLUE) // "Now's your chance! Grab the stewardess's bag and g..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_msg_usethatcase[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) - - restart_timer - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_BRIEFCASE1, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - restart_timer - - beginloop(0x04) - if_timer_gt(600, /*goto*/ 0x31) - reloop(0x04) - - label(0x31) - if_sound_finished(CHANNEL_4, /*goto*/ 0x31) - endloop(0x04) - - label(0x31) - speak(CHR_P1P2, L_CAVE_051, SFX_8183, CHANNEL_4, COLOR_09_BLUE) // "Use that case to conceal your equipment." - - label(0x09) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_msg_casewillgetstopped[] = { - beginloop(0x00) - if_objective_complete(1, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - restart_timer - - beginloop(0x04) - if_timer_gt(120, /*goto*/ 0x31) - endloop(0x04) - - label(0x31) - speak(CHR_BOND, L_CAVE_052, SFX_8184, CHANNEL_6, COLOR_09_BLUE) // "The case will get stopped unless you do something." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_msg_smallerthanithought[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0025, /*goto*/ 0x31) - if_chr_in_room(CHR_P1P2, 0x00, 0x001c, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - speak(CHR_P1P2, L_CAVE_053, MP3_03C7, CHANNEL_6, COLOR_09_BLUE) // "So that's Air Force One? ... Huh, smaller than I t..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_check_office1_dead[] = { - beginloop(0x00) - if_chr_deadish(CHR_OFFICE1, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - set_stage_flag(STAGEFLAG_OFFICE1_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1023_check_office2_dead[] = { - beginloop(0x00) - if_chr_deadish(CHR_OFFICE2, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - set_stage_flag(STAGEFLAG_OFFICE2_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1024_double_dy357[] = { - set_object_flag(0x30, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(0x30, OBJFLAG2_INVISIBLE) - set_object_flag(0x31, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(0x31, OBJFLAG2_INVISIBLE) - - beginloop(0x00) - if_chr_knockedout(0x10, /*goto*/ 0x31) - reloop(0x00) - - label(0x31) - if_chr_knockedout(0x11, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - unset_object_flag(0x30, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x30, OBJFLAG2_INVISIBLE) - unset_object_flag(0x31, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x31, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func0416_watch_flag[] = { - beginloop(0x00) - if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_ANTINONINTERACTABLE, /*goto*/ 0x31) - reloop(0x00) - - label(0x31) - endloop(0x00) - - endlist -}; - -u8 func101a_check_disguise_used2[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_UNIFORM, /*goto*/ 0x02) - endloop(0x00) - - label(0x02) - - beginloop(0x04) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x31) - endloop(0x04) - - label(0x31) - if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ 0x02) - if_stage_flag_eq(STAGEFLAG_RECEPTIONIST_CALLED_SECURITY, TRUE, /*goto*/ 0x02) - set_stage_flag(STAGEFLAG_DISGUISED) - set_stage_flag(STAGEFLAG_DISGUISED2) - label(0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x00) - endlist -}; - -u8 func1026_check_alarm_destroyed[] = { - beginloop(0x00) - if_object_in_good_condition(OBJ_ALARM, /*goto*/ 0x31) - activate_alarm - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x31) - endloop(0x00) - - endlist -}; - -u8 func0417_remove_or_unalert[] = { - set_self_chrflag(CHRCFLAG_00040000) - - label(0x00) - yield - set_target_chr(CHR_BOND) - if_nearly_in_targets_sight(30, /*goto*/ 0x02) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) - set_target_chr(CHR_COOP) - if_nearly_in_targets_sight(30, /*goto*/ 0x02) - label(0x31) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x04) - set_target_chr(CHR_ANTI) - if_nearly_in_targets_sight(30, /*goto*/ 0x02) - label(0x04) - yield - chr_drop_weapon(CHR_SELF) - remove_chr(CHR_SELF) - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x02) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0418_remove_or_cower[] = { - set_self_chrflag(CHRCFLAG_00040000) - label(0x00) - yield - set_target_chr(CHR_BOND) - if_nearly_in_targets_sight(30, /*goto*/ 0x02) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) - set_target_chr(CHR_COOP) - if_nearly_in_targets_sight(30, /*goto*/ 0x02) - label(0x31) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x04) - set_target_chr(CHR_ANTI) - if_nearly_in_targets_sight(30, /*goto*/ 0x02) - label(0x04) - yield - remove_chr(CHR_SELF) - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x02) - label(0x62) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x63) - if_chr_stopped(/*goto*/ 0x31) - endloop(0x63) - - label(0x31) - goto_first(0x62) - - endlist -}; - -u8 func102a_setup_snow[] = { - enable_snow(TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1027_remotemine[] = { - beginloop(0x00) - if_object_in_good_condition(OBJ_REMOTEMINE, /*goto*/ 0x31) - goto_next(0x02) - - label(0x31) - reloop(0x00) - - label(0x02) - destroy_object(OBJ_REMOTEMINE) - yield - destroy_object(0x46) - yield - destroy_object(0x47) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x31) - endloop(0x00) - - endlist -}; - -u8 func141b_setup_lifts_and_doors[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x31) - - // SA and PA - unlock_door(0x35, 0x80) - goto_next(0x02) - - // Agent - label(0x31) - disable_object(0x09) - label(0x02) - set_object_flag(OBJ_DIAGONAL_LIFT, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_VERTICAL_LIFT, OBJFLAG_DEACTIVATED) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x02) - endloop(0x04) - - label(0x02) - unset_object_flag(OBJ_DIAGONAL_LIFT, OBJFLAG_DEACTIVATED) - unset_object_flag(OBJ_VERTICAL_LIFT, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1029_lift_doors[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x37, /*goto*/ 0x31) - if_chr_activated_object(CHR_P1P2, 0x38, /*goto*/ 0x31) - if_chr_activated_object(CHR_P1P2, 0x39, /*goto*/ 0x31) - if_chr_activated_object(CHR_P1P2, 0x42, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x43, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x3b, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x3c, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x3f, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x40, /*goto*/ 0x05) - if_chr_activated_object(CHR_P1P2, 0x41, /*goto*/ 0x05) - reloop(0x00) - - label(0x31) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x05) - show_hudmsg(CHR_P1P2, L_CAVE_061) // "Lift inoperative - security system is active." - restart_timer - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x05) - if_timer_gt(120, /*goto*/ 0x31) - endloop(0x04) - - label(0x31) - reloop(0x00) - - label(0x05) - play_sound(SFX_DOOR_81B0, -1) - restart_timer - - beginloop(0x06) - if_timer_gt(120, /*goto*/ 0x02) - endloop(0x06) - - label(0x02) - endloop(0x00) - - endlist -}; - -u8 func102b_check_secretary_dead[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x09) - if_chr_deadish(CHR_SECRETARY, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - if_door_locked(0x18, 0x02, /*goto*/ 0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x31) - show_hudmsg(CHR_BOND, L_CAVE_062) // "Critical mission personnel disabled." - set_stage_flag(STAGEFLAG_SECRETARY_DEAD) - label(0x09) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102c_lock_door_on_alarm[] = { - beginloop(0x00) - if_alarm_active(/*goto*/ 0x31) - endloop(0x00) - - label(0x31) - lock_door(0x18, 0x04) - close_door(0x18) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102d_check_console_destroyed[] = { - beginloop(0x00) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x31) - goto_next(0x02) - - label(0x31) - endloop(0x00) - - label(0x02) - mute_channel(CHANNEL_1) - if_stage_flag_eq(STAGEFLAG_SECURITY_SHUT_DOWN, TRUE, /*goto*/ 0x31) - set_stage_flag(STAGEFLAG_CONSOLE_DESTROYED) - show_hudmsg(CHR_BOND, L_CAVE_063) // "Critical mission object destroyed." - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102e_check_base_entered[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x002e, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - show_hudmsg(CHR_BOND, L_CAVE_064) // "Entrance to base secured." - set_stage_flag(STAGEFLAG_ENTERED_BASE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102f_undisguise_on_alarm[] = { - beginloop(0x00) - if_alarm_active(/*goto*/ 0x31) - endloop(0x00) - - label(0x31) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x31) - set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISE_UNCOVERED) - label(0x31) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1030_setup_rtracker[] = { - yield - set_object_flag3(0x30, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(0x31, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1031_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x007b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0080, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0081, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0082, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0083, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0083, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0084, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0085, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0086, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0086, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0087, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0087, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0088, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0088, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0089, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0090, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0091, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1032_unhide_guards_near_plane[] = { - // Wait until player is in a room near the plane. If you ride the vertical - // elevator all the way to the bottom, then come out and turn left, you'll - // walk through these rooms before reaching the stairs. - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0016, /*goto*/ 0x31) - if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x31) - endloop(0x00) - - label(0x31) - enable_chr(0x1b) - set_ailist(0x1b, 0x0422) - unset_chr_hiddenflag(0x1b, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_chrflag(0x1b, CHRCFLAG_HIDDEN) - yield - enable_chr(0x19) - set_ailist(0x19, AILIST_INIT_POSTTAKEOVER_GUARD) - unset_chr_hiddenflag(0x19, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_chrflag(0x19, CHRCFLAG_HIDDEN) - yield - enable_chr(0x1d) - set_ailist(0x1d, AILIST_INIT_POSTTAKEOVER_GUARD) - unset_chr_hiddenflag(0x1d, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_chrflag(0x1d, CHRCFLAG_HIDDEN) - yield - enable_chr(0x1e) - set_ailist(0x1e, AILIST_INIT_POSTTAKEOVER_GUARD) - unset_chr_hiddenflag(0x1e, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_chrflag(0x1e, CHRCFLAG_HIDDEN) - yield - enable_chr(0x20) - set_ailist(0x20, AILIST_INIT_POSTTAKEOVER_GUARD) - unset_chr_hiddenflag(0x20, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_chrflag(0x20, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1420_setup_portals[] = { - yield - set_room_flag(0x0080, ROOMFLAG_0800) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_rebuild_groups, 0x1000 }, - { func1401_setup_counterop, 0x1401 }, - { func1002_objectives_failed_msg, 0x1002 }, - { func1003_intro, 0x1003 }, - { func1004_guard_activation, 0x1004 }, - { func1005_check_civilians_killed, 0x1005 }, - { func1007_console_activation, 0x1007 }, - { func1009_carousel_activation, 0x1009 }, - { func100b_suitcase_scanning, 0x100b }, - { func100c_check_end_level, 0x100c }, - { func100d_laser_panel, 0x100d }, - { func100e_check_alaskans_killed, 0x100e }, - { func1010_setup_baggage_carrier, 0x1010 }, - { func1011_lasers1, 0x1011 }, - { func1012_lasers2, 0x1012 }, - { func1013_lasers3, 0x1013 }, - { func1014_lasers4, 0x1014 }, - { func1015_unhide_laser_guards, 0x1015 }, - { func1016_console_noises, 0x1016 }, - { func1017_laser5, 0x1017 }, - { func1018_safe_switch, 0x1018 }, - { func1018_safe_switch_cover, 0x1019 }, - { func101a_check_disguise_used, 0x101a }, - { func141b_setup_lifts, 0x141b }, - { func101c_msg_nowsyourchance, 0x101c }, - { func101d_msg_usethatcase, 0x101d }, - { func101e_msg_casewillgetstopped, 0x101e }, - { func101f_msg_smallerthanithought, 0x101f }, - { func1020_weapon_scanning_bond, 0x1020 }, - { func1021_weapon_scanning_coop, 0x1021 }, - { func1022_check_office1_dead, 0x1022 }, - { func1023_check_office2_dead, 0x1023 }, - { func1024_double_dy357, 0x1024 }, - { func101a_check_disguise_used2, 0x1025 }, - { func1026_check_alarm_destroyed, 0x1026 }, - { func1027_remotemine, 0x1027 }, - { func141b_setup_lifts_and_doors, 0x1028 }, - { func1029_lift_doors, 0x1029 }, - { func102a_setup_snow, 0x102a }, - { func102b_check_secretary_dead, 0x102b }, - { func102c_lock_door_on_alarm, 0x102c }, - { func102d_check_console_destroyed, 0x102d }, - { func102e_check_base_entered, 0x102e }, - { func102f_undisguise_on_alarm, 0x102f }, - { func1030_setup_rtracker, 0x1030 }, - { func1031_setup_environment, 0x1031 }, - { func1032_unhide_guards_near_plane, 0x1032 }, - { func1420_setup_portals, 0x1420 }, - { func0404_laser_guard, 0x0404 }, - { func0403_unused, 0x0403 }, - { func0402_init_stripes, 0x0402 }, - { func0401_unused_cutscene, 0x0401 }, - { func0405_start_path15, 0x0405 }, - { func0406_become_unalerted, 0x0406 }, - { func041b_start_path06, 0x041b }, - { func041c_start_path07, 0x041c }, - { func041d_start_path08, 0x041d }, - { func041e_start_path09, 0x041e }, - { func041f_start_path10, 0x041f }, - { func0420_start_path11, 0x0420 }, - { func0421_start_path12, 0x0421 }, - { func0422_start_path13, 0x0422 }, - { func0423_start_path14, 0x0423 }, - { func0424_start_path15_unused, 0x0424 }, - { func0407_stewardess, 0x0407 }, - { func0408_secretary, 0x0408 }, - { func0409_office1, 0x0409 }, - { func040a_office2, 0x040a }, - { func040b_unused, 0x040b }, - { func040c_init_secretary, 0x040c }, - { func040d_init_office1, 0x040d }, - { func040e_init_office2, 0x040e }, - { func040f_nsa, 0x040f }, - { func0410_unused, 0x0410 }, - { func0411_takeover_lackey, 0x0411 }, - { func0412_init_takeover_lackey, 0x0412 }, - { func0413_alaskan_console_guard, 0x0413 }, - { func0414_officeworker, 0x0414 }, - { func0415_alaskan_mountainlift_guard, 0x0415 }, - { func0416_watch_flag, 0x0416 }, - { func0417_remove_or_unalert, 0x0417 }, - { func0418_remove_or_cower, 0x0418 }, - { func0419_ba8c, 0x0419 }, - { func041a_draw_magnum, 0x041a }, - { func0425_outro, 0x0425 }, - { func0426_init_alaskan_guard, 0x0426 }, - { func0427_init_posttakeover_guard, 0x0427 }, - { func0428_posttakeover_guard, 0x0428 }, - { func0429_unused, 0x0429 }, - { func042a_foyer_spawner, 0x042a }, - { func042b_init_foyer_clone, 0x042b }, - { func042c_foyer_clone, 0x042c }, - { func042d_hoverbot1, 0x042d }, - { func042e_hoverbot2, 0x042e }, - { func042f_hoverbot3, 0x042f }, - { func0430_hoverbot4, 0x0430 }, - { func0431_hoverbot5, 0x0431 }, - { func0432_hoverbot6, 0x0432 }, - { func1003_intro, 0x0c00 }, - { func0425_outro, 0x0c01 }, - { NULL, 0 }, -}; diff --git a/src/setups/setupcrad.c b/src/setups/setupcrad.c index f15755b4d..4221b6509 100644 --- a/src/setups/setupcrad.c +++ b/src/setups/setupcrad.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupcryp.c b/src/setups/setupcryp.c index 60716c6ce..63a437630 100644 --- a/src/setups/setupcryp.c +++ b/src/setups/setupcryp.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupdam.c b/src/setups/setupdam.c index f23b9337e..0f6c7931c 100644 --- a/src/setups/setupdam.c +++ b/src/setups/setupdam.c @@ -98,7 +98,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -650,2302 +650,3 @@ struct path paths[] = { { path04, 4, PATHFLAG_CIRCULAR }, { NULL, 0, 0 }, }; - -u8 func1001_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_PUSHABLE) - set_chr_chrflag(CHR_LABTECH1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH3, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PILOT1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PILOT2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PILOT3, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func0408_guard_unalerted[] = { - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_chr_dodge_rating(2, 10) - set_accuracy(18) - set_reaction_speed(60) - set_chr_maxdamage(CHR_SELF, 70) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1002_intro[] = { - play_cutscene_track(MUSIC_PELAGIC_INTRO) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - camera_movement(ANIM_CUT_DAM_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 4) - restart_timer - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x39) \ - if_timer_gt(time, /*goto*/ 0x04) \ - endloop(loopid) \ - label(0x04) - - wait_until(342, 0x3b) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(390, 0x3c) - play_sound(SFX_0172, CHANNEL_6) - - wait_until(438, 0x3d) - play_sound(SFX_0173, CHANNEL_5) - - wait_until(484, 0x48) - play_sound(SFX_0174, CHANNEL_7) - - wait_until(532, 0x4a) - play_sound(SFX_0175, CHANNEL_5) - - wait_until(574, 0x4b) - play_sound(SFX_0176, CHANNEL_7) - - wait_until(616, 0x49) - play_sound(SFX_0177, CHANNEL_6) - - wait_until(660, 0x4c) - play_sound(SFX_0178, CHANNEL_6) - - wait_until(712, 0x4d) - play_sound(SFX_0171, CHANNEL_5) - - wait_until(760, 0x4e) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(812, 0x4f) - play_sound(SFX_0173, CHANNEL_6) - - wait_until(1386, 0x50) - play_sound(SFX_0171, CHANNEL_5) - - wait_until(1482, 0x51) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(1628, 0x52) - play_sound(SFX_0173, CHANNEL_6) - - wait_until(1698, 0x53) - play_sound(SFX_0174, CHANNEL_5) - - wait_until(1860, 0x54) - play_sound(SFX_05A8, CHANNEL_7) - - wait_until(2180, 0x55) - play_sound(SFX_05A9, CHANNEL_6) - - wait_until(2260, 0x57) - play_sound(SFX_05AA, CHANNEL_7) - - wait_until(2274, 0x58) - play_sound(SFX_0175, CHANNEL_6) - - wait_until(2280, 0x59) - play_sound(SFX_0176, CHANNEL_5) - - wait_until(2294, 0x56) - play_sound(SFX_0177, CHANNEL_5) - - wait_until(2298, 0x5a) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(2316, 0x5b) - play_sound(SFX_0178, CHANNEL_6) - - wait_until(2474, 0x5c) - play_sound(SFX_0172, CHANNEL_5) - - wait_until(2489, 0x5d) - play_sound(SFX_01DB, CHANNEL_7) - - wait_until(2572, 0x5e) - play_sound(SFX_0171, CHANNEL_6) - - wait_until(2616, 0x5f) - play_sound(SFX_0173, CHANNEL_5) - - wait_until(2644, 0x60) - play_sound(SFX_0172, CHANNEL_5) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x07) - goto_next(0x39) - - label(0x07) - if_controller_button_pressed(/*goto*/ 0x39) - label(0x07) - endloop(0x0b) - - label(0x39) - mute_channel(CHANNEL_10) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) - unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) - disable_chr(CHR_INTRO_GUARD) - enter_firstperson - yield - set_ailist(CHR_ELVIS, AILIST_ELVIS_AT_START) - restart_timer - - beginloop(0x0c) - if_timer_gt(60, /*goto*/ 0x04) - endloop(0x0c) - - label(0x04) - stop_cutscene_track - stop_ambient_track - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c01_outro[] = { - camera_movement(ANIM_CUT_DAM_OUTRO_CAM) - play_cutscene_track(MUSIC_PELAGIC_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - - enable_object(OBJ_OUTRO_SUBMARINE) - set_object_flag2(OBJ_OUTRO_SUBMARINE, OBJFLAG2_04000000) - set_object_flag3(OBJ_OUTRO_SUBMARINE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_DAM_OUTRO_SUBMARINE, OBJ_OUTRO_SUBMARINE, 0x04, 0xffff) - - enable_object(OBJ_OUTRO_GRATE) - set_object_flag2(OBJ_OUTRO_GRATE, OBJFLAG2_04000000) - set_object_flag3(OBJ_OUTRO_GRATE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_DAM_OUTRO_GRATE, OBJ_OUTRO_GRATE, 0x04, 0xffff) - - enable_object(OBJ_OUTRO_CRATE1) - set_object_flag2(OBJ_OUTRO_CRATE1, OBJFLAG2_04000000) - set_object_flag3(OBJ_OUTRO_CRATE1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_DAM_OUTRO_CRATE1, OBJ_OUTRO_CRATE1, 0x04, 0xffff) - - enable_object(OBJ_OUTRO_CRATE2) - set_object_flag2(OBJ_OUTRO_CRATE2, OBJFLAG2_04000000) - set_object_flag3(OBJ_OUTRO_CRATE2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_DAM_OUTRO_CRATE2, OBJ_OUTRO_CRATE2, 0x04, 0xffff) - - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - show_nonessential_chrs(FALSE) - restart_timer - - wait_until(46, 0x3c) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(160, 0x3d) - play_sound(SFX_0172, CHANNEL_10) - play_sound_from_object2(0x0a, OBJ_OUTRO_SUBMARINE, SFX_042D, 0x00, 0x00) - - wait_until(180, 0x3b) - speak(CHR_BOND, L_DAM_039, MP3_0465, CHANNEL_10, COLOR_06_WHITE) // "Right. The diving operation has been disrupted on ..." - - wait_until(200, 0x48) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(232, 0x49) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(254, 0x4a) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(272, 0x66) - - wait_until(374, 0x4b) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(415, 0x4c) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(454, 0x4d) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(532, 0x4e) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(570, 0x4f) - speak(CHR_BOND, L_DAM_040, MP3_0466, CHANNEL_10, COLOR_09_BLUE) // "I hope the government don't want to use this ship ..." - - wait_until(582, 0x50) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(666, 0x51) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(706, 0x52) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(736, 0x64) - play_sound(SFX_05A8, CHANNEL_10) - - wait_until(806, 0x53) - play_sound(SFX_809F, CHANNEL_10) - - wait_until(854, 0x54) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(876, 0x55) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(906, 0x56) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(926, 0x57) - play_sound(SFX_80A2, CHANNEL_10) - - wait_until(950, 0x58) - speak(CHR_BOND, L_DAM_041, MP3_0467, CHANNEL_10, COLOR_06_WHITE) // "Do you think we were a little heavy-handed?" - - wait_until(1088, 0x59) - play_sound(SFX_80A3, CHANNEL_10) - - wait_until(1152, 0x5a) - play_sound(SFX_0176, CHANNEL_10) - - wait_until(1190, 0x5b) - speak(CHR_BOND, L_DAM_042, MP3_0468, CHANNEL_10, COLOR_09_BLUE) // "Naaahhhh." - - wait_until(1228, 0x5c) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(1258, 0x5d) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(1260, 0x5e) - play_sound(SFX_05B4, CHANNEL_10) - - wait_until(1300, 0x5f) - play_sound(SFX_JO_LANDING_05B6, CHANNEL_10) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(1309, 0x65) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(1358, 0x60) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(1382, 0x61) - play_sound(SFX_EXPLOSION_8098, CHANNEL_10) - - wait_until(1480, 0x62) - play_sound(SFX_80A3, CHANNEL_10) - - wait_until(1480, 0x63) - play_sound_from_object2(0x0a, OBJ_OUTRO_GRATE, SFX_00C1, 0x00, 0x00) - - wait_until(1500, 0x67) - play_sound_from_object2(0x0a, OBJ_OUTRO_SUBMARINE, SFX_042D, 0x00, 0x00) - - wait_until(1590, 0x68) - play_sound_from_object2(0x0a, OBJ_OUTRO_SUBMARINE, SFX_0434, 0x00, 0x00) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x07) - goto_next(0x39) - - label(0x07) - if_controller_button_pressed(/*goto*/ 0x39) - label(0x07) - endloop(0x0b) - - label(0x39) - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DAM_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function1[] = { - label(0x00) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_msg_controlledfrom[] = { - restart_timer - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0027, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - speak(CHR_P1P2, L_DAM_011, MP3_03D1, CHANNEL_6, COLOR_09_BLUE) // "This must be where the sub's controlled from." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_msg_withoutautopilot[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x007e, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - speak(CHR_P1P2, L_DAM_012, MP3_03D2, CHANNEL_6, COLOR_09_BLUE) // "Without the autopilot and the GPS, the ship will w..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_msg_conductoperations[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x007f, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - speak(CHR_P1P2, L_DAM_013, MP3_03D3, CHANNEL_6, COLOR_09_BLUE) // "They'll be unable to conduct any operations withou..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function2[] = { - // These are invalid object IDs - beginloop(0x00) - if_object_in_good_condition(0x11, /*goto*/ 0x07) - goto_next(0x04) - - label(0x07) - if_object_in_good_condition(0x10, /*goto*/ 0x07) - goto_next(0x04) - - label(0x07) - endloop(0x00) - - label(0x04) - show_hudmsg(CHR_BOND, L_DAM_016) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_00000400) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_open_reactor_hatch[] = { - // Wait for all switches active - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_HATCHSWITCH1_ACTIVATED, TRUE, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_stage_flag_eq(STAGEFLAG_HATCHSWITCH2_ACTIVATED, TRUE, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_stage_flag_eq(STAGEFLAG_HATCHSWITCH3_ACTIVATED, TRUE, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_stage_flag_eq(STAGEFLAG_HATCHSWITCH4_ACTIVATED, TRUE, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - disable_object(OBJ_REACTOR_HATCH) - set_object_flag2(OBJ_REACTOR_HATCH, OBJFLAG2_INVISIBLE) - show_hudmsg(CHR_P1P2, L_DAM_017) // "Reactor shutdown control hatch opened." - set_stage_flag(STAGEFLAG_REACTOR_HATCH_OPEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_reactor_switch[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_REACTOR_SWITCH, /*goto*/ 0x07) - show_hudmsg(CHR_BOND, L_DAM_036) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_REACTOR_SWITCH_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x07) - if_chr_activated_object(CHR_P1P2, OBJ_REACTOR_SWITCH, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_stage_flag_eq(STAGEFLAG_REACTOR_HATCH_OPEN, TRUE, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_1) - assign_sound(SFX_8147, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_REACTOR_SWITCH, TRUE) - set_lights_state(0x007f, LIGHTOP_3, 0xff, 0x06, 0x78) - set_object_image(OBJ_REACTOR_SWITCH, 0, TVCMDLIST_12) - set_object_image(OBJ_REACTOR_SWITCH, 1, TVCMDLIST_12) - set_object_image(OBJ_REACTOR_SWITCH, 2, TVCMDLIST_12) - show_hudmsg(CHR_P1P2, L_DAM_018) // "Reactor has been shut down." - set_stage_flag(STAGEFLAG_REACTOR_SHUT_DOWN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_diving_area_located[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_MET_ELVIS, TRUE, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_in_room(CHR_P1P2, 0x00, 0x0064, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0095, /*goto*/ 0x07) - if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0096, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - show_hudmsg(CHR_P1P2, L_DAM_019) // "Diving control center has been located." - set_stage_flag(STAGEFLAG_LOCATED_DIVING_AREA) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_check_end_level[] = { - beginloop(0x6f) - if_objective_complete(0, /*goto*/ 0x07) - reloop(0x6f) - - label(0x07) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x07) - if_objective_complete(1, /*goto*/ 0x07) - reloop(0x6f) - - label(0x07) - if_objective_complete(2, /*goto*/ 0x07) - reloop(0x6f) - - label(0x07) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x07) - if_objective_complete(3, /*goto*/ 0x07) - endloop(0x6f) - - label(0x07) - - beginloop(0x3b) - if_stage_flag_eq(STAGEFLAG_ELVIS_WARPED_FROM_START, TRUE, /*goto*/ 0x07) - endloop(0x3b) - - label(0x07) - if_stage_flag_eq(STAGEFLAG_ELVIS_APPEARED_AT_MOONPOOL, TRUE, /*goto*/ 0x00) - set_stage_flag(STAGEFLAG_ELVIS_APPEARED_AT_MOONPOOL) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_ELVIS, AILIST_ELVIS_AT_MOONPOOL) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0064, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0095, /*goto*/ 0x07) - if_chr_distance_to_pad_lt(CHR_P1P2, 600, PAD_DAM_0096, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_all_objectives_complete(/*goto*/ 0x07) - endloop(0x00) - - label(0x07) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x07) - endloop(0x0b) - - label(0x07) - if_chr_deadish(CHR_BOND, /*goto*/ 0x07) - goto_next(0x08) - - label(0x07) - if_chr_deadish(CHR_COOP, /*goto*/ 0x07) - - // Jo or Velvet alive - label(0x08) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x08) - - if_chr_deadish(CHR_BOND, /*goto*/ 0x07) - goto_next(0x04) - - // Both players dead - this check is redundant - label(0x07) - if_chr_deadish(CHR_COOP, /*goto*/ 0x07) - goto_next(0x04) - - // Both players dead - label(0x07) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x04) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - - // Elvis dead - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_check_labtech_dead[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0b) - - beginloop(0x00) - if_chr_death_animation_finished(CHR_LABTECH1, /*goto*/ 0x07) - if_chr_dead(CHR_LABTECH1, /*goto*/ 0x07) - if_chr_death_animation_finished(CHR_LABTECH2, /*goto*/ 0x07) - if_chr_dead(CHR_LABTECH2, /*goto*/ 0x07) - if_chr_death_animation_finished(CHR_LABTECH3, /*goto*/ 0x07) - if_chr_dead(CHR_LABTECH3, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - show_hudmsg(CHR_BOND, L_DAM_020) // "Critical mission personnel killed." - set_stage_flag(STAGEFLAG_LABTECH_DEAD) - label(0x0b) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_check_researchdata_collected[] = { - beginloop(0x00) - if_chr_has_object(CHR_BOND, OBJ_RESEARCHDATA1, /*goto*/ 0x07) - if_chr_has_object(CHR_COOP, OBJ_RESEARCHDATA1, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_has_object(CHR_BOND, OBJ_RESEARCHDATA2, /*goto*/ 0x07) - if_chr_has_object(CHR_COOP, OBJ_RESEARCHDATA2, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_has_object(CHR_BOND, OBJ_RESEARCHDATA3, /*goto*/ 0x07) - if_chr_has_object(CHR_COOP, OBJ_RESEARCHDATA3, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - show_hudmsg(CHR_BOND, L_DAM_021) // "Research data has been secured." - set_stage_flag(STAGEFLAG_COLLECTED_RESEARCH_DATA) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_path(pathid) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(18) \ - set_reaction_speed(60) \ - set_chr_maxdamage(CHR_SELF, 70) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - -u8 func0405_start_path00[] = { - init_path(0) - endlist -}; - -u8 func0409_start_path03[] = { - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - init_path(3) - endlist -}; - -u8 func040a_start_path04[] = { - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - init_path(4) - endlist -}; - -u8 func0406_start_path01[] = { - init_path(1) - endlist -}; - -u8 func0407_start_path02[] = { - init_path(2) - endlist -}; - -u8 func040e_init_labtech1[] = { - set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_LABTECH1) - endlist -}; - -u8 func040b_labtech1[] = { - set_shotlist(AILIST_LABTECH1) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Dying - label(0x07) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x04) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x0f) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0f) - if_chr_stopped(/*goto*/ 0x04) - goto_next(0x07) - label(0x04) - if_chr_idle(/*goto*/ 0x07) - call_rng - if_rand_lt(128, /*goto*/ 0x27) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x3b) - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x3c) - chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x27) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_0209, /*goto*/ 0x3b) - walk_to_pad(PAD_DAM_0209) - goto_next(0x07) - - label(0x3b) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020A, /*goto*/ 0x3c) - walk_to_pad(PAD_DAM_020A) - goto_next(0x07) - - label(0x3c) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020B, /*goto*/ 0x07) - walk_to_pad(PAD_DAM_020B) - goto_next(0x07) - - label(0x07) - endloop(0x00) - - label(0x0f) - set_ailist(CHR_SELF, AILIST_LABTECH_ALERTED) - endlist -}; - -u8 func040f_init_labtech2[] = { - set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_LABTECH2) - endlist -}; - -u8 func040c_labtech2[] = { - set_shotlist(AILIST_LABTECH2) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Dying - label(0x07) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x04) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x0f) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0f) - if_chr_stopped(/*goto*/ 0x04) - goto_next(0x07) - label(0x04) - if_chr_idle(/*goto*/ 0x07) - call_rng - if_rand_lt(128, /*goto*/ 0x27) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x3b) - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x3c) - chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x27) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020C, /*goto*/ 0x3b) - walk_to_pad(PAD_DAM_020C) - goto_next(0x07) - - label(0x3b) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020D, /*goto*/ 0x3c) - walk_to_pad(PAD_DAM_020D) - goto_next(0x07) - - label(0x3c) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020E, /*goto*/ 0x07) - walk_to_pad(PAD_DAM_020E) - goto_next(0x07) - - label(0x07) - endloop(0x00) - - label(0x0f) - set_ailist(CHR_SELF, AILIST_LABTECH_ALERTED) - endlist -}; - -u8 func0410_init_labtech3[] = { - set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_LABTECH3) - endlist -}; - -u8 func040d_labtech3[] = { - // @bug: Wrong onshot function. Under normal gameplay this labtech has 1HP - // anyway and will die in one shot. Theoretically, if you use PD mode with - // max health and shoot him with a weak weapon then he will start running to - // lab tech 1's pads. - set_shotlist(AILIST_LABTECH1) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Dying - label(0x07) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x04) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x0f) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x10) - if_chr_stopped(/*goto*/ 0x04) - goto_next(0x07) - label(0x04) - if_chr_idle(/*goto*/ 0x07) - call_rng - if_rand_lt(128, /*goto*/ 0x27) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x3b) - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x3c) - chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x07) - - label(0x27) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_020F, /*goto*/ 0x3b) - walk_to_pad(PAD_DAM_020F) - goto_next(0x07) - - label(0x3b) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_0210, /*goto*/ 0x3c) - walk_to_pad(PAD_DAM_0210) - goto_next(0x07) - - label(0x3c) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_DAM_0211, /*goto*/ 0x07) - walk_to_pad(PAD_DAM_0211) - goto_next(0x07) - - label(0x07) - endloop(0x00) - - label(0x10) - set_alertness(100) - - label(0x0f) - set_ailist(CHR_SELF, AILIST_LABTECH_ALERTED) - endlist -}; - -u8 func0411_labtech_alerted[] = { - restart_timer - label(0x0b) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) - - beginloop(0x0c) - if_target_in_fov_left(10, /*goto*/ 0x04) - if_timer_gt(60, /*goto*/ 0x04) - endloop(0x0c) - - label(0x04) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - set_alertness(100) - say_quip(CHR_BOND, 0x2a, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x3e) - if_timer_gt(90, /*goto*/ 0x04) - endloop(0x3e) - - // Already alert (eg. by gunfire) - label(0x04) - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x3f) - goto_next(0x42) - - label(0x3f) - try_run_to_chr(CHR_PRESET, /*goto*/ 0x40) - goto_next(0x42) - - beginloop(0x40) - if_detected_chr(CHR_PRESET, /*goto*/ 0x41) - if_chr_stopped(/*goto*/ 0x41) - endloop(0x40) - - label(0x41) - increase_squadron_alertness(100) - say_quip(CHR_BOND, QUIP_WARNFRIENDS, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - - label(0x42) - go_to_target_pad(GOPOSFLAG_RUN) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x13) - endloop(0x10) - - label(0x13) - restart_timer - if_can_see_target(/*goto*/ 0x07) - goto_next(0x00) - - label(0x07) - set_target_chr(CHR_P1P2) - if_distance_to_target_lt(300, /*goto*/ 0x04) - - label(0x00) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x11) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_timer_gt(1200, /*goto*/ 0x0d) - if_can_see_target(/*goto*/ 0x07) - goto_next(0x00) - - label(0x07) - if_distance_to_target_lt(300, /*goto*/ 0x04) - label(0x00) - if_chr_stopped(/*goto*/ 0x07) - endloop(0x11) - - label(0x07) - goto_first(0x13) - - label(0x0d) - goto_first(0x42) - - label(0x04) - retreat(GOPOSFLAG_RUN, 2) - restart_timer - - beginloop(0x14) - if_timer_gt(600, /*goto*/ 0x07) - endloop(0x14) - - label(0x07) - goto_first(0x13) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_hide[] = { - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_alarm_responders[] = { - yield - yield - set_chr_hiddenflag(0x57, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x58, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x59, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x5a, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x5b, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x5c, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x5d, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x5e, CHRHFLAG_CLOAKED) - disable_chr(0x57) - disable_chr(0x58) - disable_chr(0x59) - disable_chr(0x5a) - disable_chr(0x5b) - disable_chr(0x5c) - disable_chr(0x5d) - disable_chr(0x5e) - set_chr_hiddenflag(0x04, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x25, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x06, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x08, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x0a, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x0c, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x0e, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x10, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x12, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x14, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x16, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x18, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x1a, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x1c, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x1e, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x20, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(0x22, CHRHFLAG_CLOAKED) - disable_chr(0x04) - disable_chr(0x25) - disable_chr(0x06) - disable_chr(0x08) - disable_chr(0x0a) - disable_chr(0x0c) - disable_chr(0x0e) - disable_chr(0x10) - disable_chr(0x12) - disable_chr(0x14) - disable_chr(0x16) - disable_chr(0x18) - disable_chr(0x1a) - disable_chr(0x1c) - disable_chr(0x1e) - disable_chr(0x20) - disable_chr(0x22) - - beginloop(0x00) - if_alarm_active(/*goto*/ 0x07) - endloop(0x00) - - label(0x07) - enable_chr(0x57) - enable_chr(0x58) - enable_chr(0x59) - enable_chr(0x5a) - enable_chr(0x5b) - enable_chr(0x5c) - enable_chr(0x5d) - enable_chr(0x5e) - set_chr_team(0x57, TEAM_ENEMY) - set_chr_team(0x58, TEAM_ENEMY) - set_chr_team(0x59, TEAM_ENEMY) - set_chr_team(0x5a, TEAM_ENEMY) - set_chr_team(0x5b, TEAM_ENEMY) - set_chr_team(0x5c, TEAM_ENEMY) - set_chr_team(0x5d, TEAM_ENEMY) - set_chr_team(0x5e, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - yield - enable_chr(0x04) - enable_chr(0x25) - enable_chr(0x06) - enable_chr(0x08) - enable_chr(0x0a) - enable_chr(0x0c) - enable_chr(0x0e) - enable_chr(0x10) - enable_chr(0x12) - enable_chr(0x14) - enable_chr(0x16) - enable_chr(0x18) - enable_chr(0x1a) - enable_chr(0x1c) - enable_chr(0x1e) - enable_chr(0x20) - enable_chr(0x22) - set_chr_team(0x04, TEAM_ENEMY) - set_chr_team(0x25, TEAM_ENEMY) - set_chr_team(0x06, TEAM_ENEMY) - set_chr_team(0x08, TEAM_ENEMY) - set_chr_team(0x0a, TEAM_ENEMY) - set_chr_team(0x0c, TEAM_ENEMY) - set_chr_team(0x0e, TEAM_ENEMY) - set_chr_team(0x10, TEAM_ENEMY) - set_chr_team(0x12, TEAM_ENEMY) - set_chr_team(0x14, TEAM_ENEMY) - set_chr_team(0x16, TEAM_ENEMY) - set_chr_team(0x18, TEAM_ENEMY) - set_chr_team(0x1a, TEAM_ENEMY) - set_chr_team(0x1c, TEAM_ENEMY) - set_chr_team(0x1e, TEAM_ENEMY) - set_chr_team(0x20, TEAM_ENEMY) - set_chr_team(0x22, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - yield - set_ailist(0x57, 0x0409) - set_ailist(0x58, 0x0409) - set_ailist(0x59, 0x040a) - set_ailist(0x5a, 0x040a) - set_ailist(0x5b, AILIST_GUARD_ALERTED) - set_ailist(0x5c, AILIST_GUARD_ALERTED) - set_ailist(0x5d, AILIST_GUARD_ALERTED) - set_ailist(0x5e, AILIST_GUARD_ALERTED) - set_ailist(0x04, AILIST_GUARD_UNALERTED) - set_ailist(0x25, AILIST_GUARD_UNALERTED) - set_ailist(0x06, AILIST_GUARD_UNALERTED) - set_ailist(0x08, AILIST_GUARD_UNALERTED) - set_ailist(0x0a, AILIST_GUARD_UNALERTED) - set_ailist(0x0c, AILIST_GUARD_UNALERTED) - set_ailist(0x0e, AILIST_GUARD_UNALERTED) - set_ailist(0x10, AILIST_GUARD_UNALERTED) - set_ailist(0x12, AILIST_GUARD_UNALERTED) - set_ailist(0x14, AILIST_GUARD_UNALERTED) - set_ailist(0x16, AILIST_GUARD_UNALERTED) - set_ailist(0x18, AILIST_GUARD_UNALERTED) - set_ailist(0x1a, AILIST_GUARD_UNALERTED) - set_ailist(0x1c, AILIST_GUARD_UNALERTED) - set_ailist(0x1e, AILIST_GUARD_UNALERTED) - set_ailist(0x20, AILIST_GUARD_UNALERTED) - set_ailist(0x22, AILIST_GUARD_UNALERTED) - yield - unset_chr_chrflag(0x57, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x58, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x59, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x5a, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x5b, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x5c, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x5d, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x5e, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x57, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x58, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x59, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x5a, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x5b, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x5c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x5d, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x5e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x04, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x25, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x06, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x08, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x0a, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x0c, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x0e, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x10, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x12, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x14, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x18, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x1a, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x1c, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x1e, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x20, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x22, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x04, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x25, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x06, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x08, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0a, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x10, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x12, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x14, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x18, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1a, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x20, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x22, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_init_pilot[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_PILOT) - endlist -}; - -u8 func0401_pilot_dying[] = { - unset_stage_flag(STAGEFLAG_SAID_PULLTHEPLUG) - unset_stage_flag(STAGEFLAG_SAID_SWITCHTHINGOFF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0401_pilot[] = { - set_shotlist(AILIST_PILOT) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x00) - - // Dying - label(0x07) - set_ailist(CHR_SELF, AILIST_PILOT_DYING) - - // Alive - wait for player to arrive - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x07) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - endloop(0x00) - - // Seen player - label(0x07) - say_quip(CHR_BOND, QUIP_SURRENDER, 0xfe, 0x0a, 0xff, BANK_0, 0x00, 0x00) - - label(0x04) - increase_squadron_alertness(100) - surrender - - beginloop(0x0b) - // Wait for Jo nearby - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_distance_to_target_lt(200, /*goto*/ 0x07) - reloop(0x0b) - - // and for Jo's room entry speech to finish - label(0x07) - if_sound_finished(CHANNEL_6, /*goto*/ 0x07) - reloop(0x0b) - - // and for Jo to be in view - label(0x07) - if_chr_in_view(/*goto*/ 0x07) - endloop(0x0b) - - label(0x07) - if_stage_flag_eq(STAGEFLAG_AUTOPILOT_DISABLED, TRUE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_SAID_PULLTHEPLUG, FALSE, /*goto*/ 0x07) - goto_next(0x04) - - label(0x08) - if_chr_deadish(CHR_ANGRY_PILOT, /*goto*/ 0x09) - goto_first(0x0b) - - // Angry pilot dead or hasn't been chosen yet - label(0x09) - if_stage_flag_eq(STAGEFLAG_GPS_DISABLED, TRUE, /*goto*/ 0x04) - if_stage_flag_eq(STAGEFLAG_SAID_SWITCHTHINGOFF, FALSE, /*goto*/ 0x08) - - // GPS disabled - label(0x04) - say_quip(CHR_BOND, QUIP_SURRENDER, 0xfe, 0x0a, 0xff, BANK_0, 0x00, 0x00) - goto_first(0x0b) - - label(0x07) - speak(CHR_TARGET, L_DAM_043, MP3_JO_PULL_THE_PLUG, CHANNEL_7, COLOR_09_BLUE) // "Pull the plug on that now." - set_stage_flag(STAGEFLAG_SAID_PULLTHEPLUG) - goto_next(0x0c) - - label(0x08) - speak(CHR_TARGET, L_DAM_044, MP3_JO_SWITCH_THIS_THING_OFF, CHANNEL_7, COLOR_09_BLUE) // "Switch this thing off." - set_stage_flag(STAGEFLAG_SAID_SWITCHTHINGOFF) - goto_next(0x0c) - - beginloop(0x0c) - if_sound_finished(CHANNEL_7, /*goto*/ 0x07) - endloop(0x0c) - - label(0x07) - set_self_flag_bankx(CHRFLAG0_COVER_TYPE2, BANK_0) - if_stage_flag_eq(STAGEFLAG_SAID_SWITCHTHINGOFF, FALSE, /*goto*/ 0x07) - speak(CHR_TARGET, L_DAM_045, MP3_SCI_ILL_SHUT_IT_DOWN, CHANNEL_6, COLOR_04_ORANGE) // "I'll shut it down." - goto_next(0x08) - - label(0x07) - speak(CHR_TARGET, L_DAM_046, MP3_SCI_PLEASE_DONT_HURT_ME, CHANNEL_6, COLOR_04_ORANGE) // "Please don't hurt me." - label(0x08) - do_preset_animation(PRESETANIM_TALKRANDOM) - - beginloop(0x0f) - if_sound_finished(CHANNEL_6, /*goto*/ 0x08) - endloop(0x0f) - - // Choose which pad to walk to - label(0x08) - if_stage_flag_eq(STAGEFLAG_SAID_SWITCHTHINGOFF, TRUE, /*goto*/ 0x07) - walk_to_pad(PAD_DAM_015D) - goto_next(0x0d) - - label(0x07) - walk_to_pad(PAD_DAM_0160) - - // Walking to pad - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x07) - endloop(0x0d) - - // Push button - label(0x07) - chr_do_animation(ANIM_PUSH_BUTTON, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) -#if VERSION >= VERSION_NTSC_1_0 - restart_timer - - beginloop(0x0e) - if_chr_stopped(/*goto*/ 0x07) - if_timer_gt(60, /*goto*/ 0x08) - endloop(0x0e) - - label(0x08) - speak(CHR_SELF, -1, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x07) - endloop(0x10) -#else - beginloop(0x0e) - if_chr_stopped(/*goto*/ 0x07) - endloop(0x0e) -#endif - - label(0x07) - if_stage_flag_eq(STAGEFLAG_AUTOPILOT_DISABLED, TRUE, /*goto*/ 0x07) - show_hudmsg(CHR_TARGET, L_DAM_014) // "Autopilot system has been deactivated." - set_stage_flag(STAGEFLAG_TRIGGER_ANGRY_PILOT) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - set_stage_flag(STAGEFLAG_AUTOPILOT_DISABLED) - surrender - goto_first(0x0b) - - label(0x07) - show_hudmsg(CHR_TARGET, L_DAM_015) // "GPS system has been deactivated." - set_stage_flag(STAGEFLAG_GPS_DISABLED) - surrender - goto_first(0x0b) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_check_pilots_dead[] = { - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_00080000, TRUE, /*goto*/ 0x08) - if_chr_deadish(CHR_PILOT1, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_deadish(CHR_PILOT2, /*goto*/ 0x07) - reloop(0x00) - - label(0x07) - if_chr_deadish(CHR_PILOT3, /*goto*/ 0x07) - endloop(0x00) - - // All pilots dead - label(0x07) - - // Flag is set - label(0x08) - if_stage_flag_eq(STAGEFLAG_AUTOPILOT_DISABLED, FALSE, /*goto*/ 0x07) - if_stage_flag_eq(STAGEFLAG_GPS_DISABLED, FALSE, /*goto*/ 0x07) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x07) - show_hudmsg(CHR_BOND, L_DAM_027) // "Critical mission personnel have been killed." - set_stage_flag(STAGEFLAG_PILOT_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Choose a pilot to become angry. One of the three is selected at random. If - * the selected pilot is dead, try the next one and so on in order 1, 2, 3. - */ -u8 func1012_choose_angry_pilot[] = { - set_chr_chrflag(CHR_PILOT1, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_PILOT2, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_PILOT3, CHRCFLAG_KILLCOUNTABLE) - - beginloop(0x00) - if_kill_count_gt(0, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_ANGRY_PILOT, TRUE, /*goto*/ 0x07) - endloop(0x00) - - // Triggered - label(0x07) - call_rng - if_rand_lt(86, /*goto*/ 0x3b) - if_rand_lt(172, /*goto*/ 0x3c) - - beginloop(0x03) - if_kill_count_gt(0, /*goto*/ 0x08) - if_chr_deadish(CHR_PILOT1, /*goto*/ 0x3b) - if_chr_has_flag_bankx(CHR_PILOT1, CHRFLAG0_COVER_TYPE2, BANK_0, /*goto*/ 0x3b) - set_ailist(CHR_PILOT1, AILIST_ANGRY_PILOT) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x3b) - if_chr_deadish(CHR_PILOT2, /*goto*/ 0x3c) - if_chr_has_flag_bankx(CHR_PILOT2, CHRFLAG0_COVER_TYPE2, BANK_0, /*goto*/ 0x3c) - set_ailist(CHR_PILOT2, AILIST_ANGRY_PILOT) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x3c) - if_chr_deadish(CHR_PILOT3, /*goto*/ 0x04) - if_chr_has_flag_bankx(CHR_PILOT3, CHRFLAG0_COVER_TYPE2, BANK_0, /*goto*/ 0x04) - set_ailist(CHR_PILOT3, AILIST_ANGRY_PILOT) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x04) - endloop(0x03) - - // Killed a pilot - label(0x08) - show_hudmsg(CHR_BOND, L_DAM_035) // "Civilians have been killed." - set_stage_flag(STAGEFLAG_JO_KILLED_A_PILOT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0404_angry_pilot[] = { - set_chr_id(CHR_ANGRY_PILOT) - set_accuracy(90) - set_reaction_speed(100) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - unset_self_flag_bankx(CHRFLAG0_ALERT_ON_HEARSPAWN, BANK_0) - set_self_chrflag(CHRCFLAG_00000040) - set_shotlist(AILIST_ANGRY_PILOT) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Dying - label(0x07) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x04) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - speak(CHR_TARGET, L_DAM_047, MP3_04DD, CHANNEL_7, COLOR_04_ORANGE) // "Die, you traitors." - chr_do_animation(ANIM_DRAW_PISTOL_0245, -1, 120, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SELF, 3) - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x00000000, /*goto*/ 0x6c) - - beginloop(0x6c) - if_chr_stopped(/*goto*/ 0x03) - endloop(0x6c) - - label(0x03) - if_kill_count_gt(1, /*goto*/ 0x08) - goto_next(0x04) - - // Jo killed a pilot - label(0x08) - set_stage_flag(STAGEFLAG_00080000) - - // Select another pilot as target - label(0x04) - if_chr_deadish(CHR_PILOT1, /*goto*/ 0x3b) - if_chr_has_flag_bankx(CHR_PILOT1, CHRFLAG0_GP1, BANK_0, /*goto*/ 0x3b) - set_target_chr(CHR_PILOT1) - goto_next(0x00) - - label(0x3b) - if_chr_deadish(CHR_PILOT2, /*goto*/ 0x3c) - if_chr_has_flag_bankx(CHR_PILOT2, CHRFLAG0_GP1, BANK_0, /*goto*/ 0x3c) - set_target_chr(CHR_PILOT2) - goto_next(0x00) - - label(0x3c) - if_chr_deadish(CHR_PILOT3, /*goto*/ 0x04) - if_chr_has_flag_bankx(CHR_PILOT3, CHRFLAG0_GP1, BANK_0, /*goto*/ 0x04) - set_target_chr(CHR_PILOT3) - goto_next(0x00) - - // No other pilots - label(0x04) - call_rng - if_rand_lt(128, /*goto*/ 0x3b) - set_target_chr(CHR_COOP) - if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x3b) - goto_next(0x00) - label(0x3b) - set_target_chr(CHR_BOND) - - // Got target (other pilot or Jo) - label(0x00) - if_target_is_player(/*goto*/ 0x07) - goto_next(0x04) - label(0x07) - set_shotlist(GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(0x04) - restart_timer - try_run_to_target(/*goto*/ 0x6d) - - beginloop(0x6d) - if_can_see_attack_target(/*goto*/ 0x07) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x6d) - - label(0x04) - goto_first(0x00) - - label(0x07) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) - label(0x04) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x6e) - - beginloop(0x6e) - if_chr_stopped(/*goto*/ 0x07) - endloop(0x6e) - - label(0x07) - goto_first(0x03) - - endlist -}; - -u8 func1013_lift_switch[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT_SWITCH, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - show_hudmsg(CHR_P1P2, L_DAM_028) // "Lift door has been unlocked." - unlock_door(0x18, 0x02) - unlock_door(0x19, 0x02) - open_door(0x18) - open_door(0x19) - set_stage_flag(STAGEFLAG_LIFT_UNLOCKED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_moonpool_switch[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_MOONPOOL_SWITCH, /*goto*/ 0x08) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x10) - show_hudmsg(CHR_P1P2, L_DAM_036) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_MOONPOOL_SWITCH_DESTROYED) - - label(0x10) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x08) - if_chr_activated_object(CHR_P1P2, OBJ_MOONPOOL_SWITCH, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - label(0x07) - show_hudmsg(CHR_P1P2, L_DAM_029) // "Lift has been activated." - set_stage_flag(STAGEFLAG_MOONPOOL_ACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0413_guard_alerted[] = { - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_chr_dodge_rating(2, 10) - set_accuracy(18) - set_reaction_speed(60) - set_chr_maxdamage(CHR_SELF, 70) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func1015_shuffle_hatchswitches[] = { - yield - shuffle_pelagic_switches - yield - yield - set_object_image(OBJ_BADHATCHSWITCH1, 0, TVCMDLIST_12) - yield - set_object_image(OBJ_BADHATCHSWITCH2, 0, TVCMDLIST_12) - yield - set_object_image(OBJ_BADHATCHSWITCH3, 0, TVCMDLIST_12) - yield - set_object_image(OBJ_BADHATCHSWITCH4, 0, TVCMDLIST_12) - yield - set_object_image(OBJ_HATCHSWITCH1, 0, TVCMDLIST_13) - yield - set_object_image(OBJ_HATCHSWITCH2, 0, TVCMDLIST_13) - yield - set_object_image(OBJ_HATCHSWITCH3, 0, TVCMDLIST_13) - yield - set_object_image(OBJ_HATCHSWITCH4, 0, TVCMDLIST_13) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define hatchswitch_logic(switch, flag) \ - yield \ - yield \ - \ - beginloop(0x00) \ - chr_toggle_p1p2(CHR_SELF) \ - if_chr_activated_object(CHR_P1P2, switch, /*goto*/ 0x07) \ - endloop(0x00) \ - \ - label(0x07) \ - assign_sound(SFX_043A, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, switch, TRUE) \ - set_object_image(switch, 0, TVCMDLIST_14) \ - set_stage_flag(flag) \ - \ - beginloop(0x0b) \ - if_stage_flag_eq(STAGEFLAG_HATCHSWITCHES_RESETTING, TRUE, /*goto*/ 0x07) \ - endloop(0x0b) \ - \ - label(0x07) \ - set_object_image(switch, 0, TVCMDLIST_13) \ - yield \ - yield \ - yield \ - yield \ - yield \ - unset_stage_flag(STAGEFLAG_HATCHSWITCH1_ACTIVATED) \ - unset_stage_flag(STAGEFLAG_HATCHSWITCH2_ACTIVATED) \ - unset_stage_flag(STAGEFLAG_HATCHSWITCH3_ACTIVATED) \ - unset_stage_flag(STAGEFLAG_HATCHSWITCH4_ACTIVATED) \ - goto_first(0x00) - -u8 func1016_hatchswitch1[] = { - hatchswitch_logic(OBJ_HATCHSWITCH1, STAGEFLAG_HATCHSWITCH1_ACTIVATED) - endlist -}; - -u8 func1017_hatchswitch2[] = { - hatchswitch_logic(OBJ_HATCHSWITCH2, STAGEFLAG_HATCHSWITCH2_ACTIVATED) - endlist -}; - -u8 func1018_hatchswitch3[] = { - hatchswitch_logic(OBJ_HATCHSWITCH3, STAGEFLAG_HATCHSWITCH3_ACTIVATED) - endlist -}; - -u8 func1019_hatchswitch4[] = { - hatchswitch_logic(OBJ_HATCHSWITCH4, STAGEFLAG_HATCHSWITCH4_ACTIVATED) - endlist -}; - -u8 func101a_badhatchswitches[] = { - yield - yield - - beginloop(0x00) - if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH1, /*goto*/ 0x0b) - if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH2, /*goto*/ 0x0c) - if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH3, /*goto*/ 0x0d) - if_chr_activated_object(CHR_P1P2, OBJ_BADHATCHSWITCH4, /*goto*/ 0x0e) - endloop(0x00) - - // 1 - label(0x0b) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH1, TRUE) - yield - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH1, FALSE) - set_object_image(OBJ_BADHATCHSWITCH1, 0, TVCMDLIST_0F) - goto_next(0x04) - - // 2 - label(0x0c) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH2, TRUE) - yield - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH2, FALSE) - set_object_image(OBJ_BADHATCHSWITCH2, 0, TVCMDLIST_0F) - goto_next(0x04) - - // 3 - label(0x0d) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH3, TRUE) - yield - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH3, FALSE) - set_object_image(OBJ_BADHATCHSWITCH3, 0, TVCMDLIST_0F) - goto_next(0x04) - - // 4 - label(0x0e) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_BADHATCHSWITCH4, TRUE) - yield - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_BADHATCHSWITCH4, FALSE) - set_object_image(OBJ_BADHATCHSWITCH4, 0, TVCMDLIST_0F) - goto_next(0x04) - - label(0x04) - show_hudmsg(CHR_P1P2, L_DAM_031) // "Unlocking sequence has been reset." - set_stage_flag(STAGEFLAG_HATCHSWITCHES_RESETTING) - restart_timer - - beginloop(0x10) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x10) - - label(0x04) - mute_channel(CHANNEL_6) - unset_stage_flag(STAGEFLAG_HATCHSWITCHES_RESETTING) - set_object_image(OBJ_BADHATCHSWITCH1, 0, TVCMDLIST_12) - set_object_image(OBJ_BADHATCHSWITCH2, 0, TVCMDLIST_12) - set_object_image(OBJ_BADHATCHSWITCH3, 0, TVCMDLIST_12) - set_object_image(OBJ_BADHATCHSWITCH4, 0, TVCMDLIST_12) - goto_first(0x00) - - endlist -}; - -u8 func101b_reactor_hum[] = { - yield - assign_sound(SFX_8146, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_REACTOR_SWITCH, 1, 2000, 3000) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_elvis_at_start[] = { - set_shotlist(AILIST_ELVIS_AT_START) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Dying - label(0x07) - if_sound_finished(CHANNEL_6, /*goto*/ 0x08) - mute_channel(CHANNEL_6) - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x04) - stop_chr - set_chr_maxdamage(CHR_SELF, 1) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x07) - endloop(0x0b) - - label(0x07) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DAM_032, MP3_04DC, CHANNEL_6, COLOR_06_WHITE) // "You go on ahead, Jo. I'll secure the perimeter. We..." - - beginloop(0x0c) - if_sound_finished(CHANNEL_6, /*goto*/ 0x07) - endloop(0x0c) - - label(0x07) - jog_to_pad(PAD_DAM_0040) - - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x07) - endloop(0x0d) - - label(0x3b) - restart_timer - label(0x0e) - stop_chr - if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x07) - call_rng - if_rand_gt(128, /*goto*/ 0x07) - - // 50% chance of doing an idle animation - call_rng - if_rand_lt(64, /*goto*/ 0x44) - if_rand_lt(128, /*goto*/ 0x45) - if_rand_lt(196, /*goto*/ 0x46) - - set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - chr_do_animation(ANIM_SMOKE_CIGARETTE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x4c) - - label(0x44) - chr_do_animation(ANIM_SCRATCH_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x4c) - - label(0x45) - chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x4c) - - label(0x46) - chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x4c) - - label(0x47) - chr_do_animation(ANIM_TWO_GUN_HOLD, 0, 100, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x4c) - - // 50% chance - label(0x07) - unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - if_chr_in_room(CHR_SELF, 0x00, 0x0029, /*goto*/ 0x04) - set_padpreset(PAD_DAM_0040) - goto_next(0x07) - - label(0x04) - call_rng - if_rand_lt(64, /*goto*/ 0x44) - if_rand_lt(128, /*goto*/ 0x45) - if_rand_lt(196, /*goto*/ 0x46) - try_set_target_pad_to_something(0x08, /*goto*/ 0x07) - label(0x44) - try_set_target_pad_to_something(0x02, /*goto*/ 0x07) - label(0x45) - try_set_target_pad_to_something(0x04, /*goto*/ 0x07) - label(0x46) - try_set_target_pad_to_something(0x08, /*goto*/ 0x07) - goto_next(0x4c) - label(0x07) - go_to_target_pad(GOPOSFLAG_WALK) - - beginloop(0x4c) - if_chr_in_room(CHR_BOND, 0x00, 0x0029, /*goto*/ 0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x002a, /*goto*/ 0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x002b, /*goto*/ 0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x0030, /*goto*/ 0x04) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x07) - if_chr_in_room(CHR_COOP, 0x00, 0x0029, /*goto*/ 0x04) - if_chr_in_room(CHR_COOP, 0x00, 0x002a, /*goto*/ 0x04) - if_chr_in_room(CHR_COOP, 0x00, 0x002b, /*goto*/ 0x04) - if_chr_in_room(CHR_COOP, 0x00, 0x0030, /*goto*/ 0x04) - label(0x07) - goto_next(0x10) - - label(0x04) - if_chr_stopped(/*goto*/ 0x4b) - endloop(0x4c) - - label(0x4b) - goto_first(0x3b) - - label(0x04) - label(0x10) - yield - if_difficulty_lt(DIFF_SA, /*goto*/ 0x07) - - // SA and PA - chr_move_to_pad(CHR_ELVIS, PAD_DAM_0020, 0x01, /*goto*/ 0x04) - goto_first(0x10) - - // Agent - label(0x07) - chr_move_to_pad(CHR_ELVIS, PAD_DAM_0096, 0x01, /*goto*/ 0x04) - goto_first(0x10) - - label(0x04) - stop_chr - set_stage_flag(STAGEFLAG_ELVIS_WARPED_FROM_START) - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - add_health_or_armor(2000) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Elvis leading the way from the moon pool to the diving area. - */ -u8 func0416_elvis_leading[] = { - set_shotlist(AILIST_ELVIS_LEADING) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Dying - label(0x07) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x04) - if_just_injured(CHR_SELF, /*goto*/ 0x07) - goto_next(0x04) - - // Injured - label(0x07) - say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x3a) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x3a) - - label(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0b) - set_padpreset(PAD_DAM_0096) - label(0x12) - label(0x04) - run_to_pad(PAD_DAM_0096) - restart_timer - - beginloop(0x00) - if_timer_gt(1200, /*goto*/ 0x08) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0b) - label(0x07) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x00) - - label(0x08) - goto_first(0x12) - - label(0x07) - goto_first(0x03) - - label(0x04) - stop_chr - - beginloop(0x0c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0b) - label(0x07) - endloop(0x0c) - - label(0x0b) - call_rng - if_rand_lt(85, /*goto*/ 0x3b) - if_rand_lt(170, /*goto*/ 0x3c) - say_quip(CHR_BOND, 0x26, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x07) - - label(0x3b) - say_quip(CHR_BOND, 0x27, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x07) - - label(0x3c) - say_quip(CHR_BOND, 0x28, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - label(0x07) - set_shotlist(AILIST_ELVIS_LEADING) - set_returnlist(CHR_SELF, AILIST_ELVIS_LEADING) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func101c_check_elvis_dead[] = { - beginloop(0x00) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - show_hudmsg(CHR_BOND, L_DAM_033) // "Elvis has been killed." - set_stage_flag(STAGEFLAG_ELVIS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0418_elvis_at_moonpool[] = { - // @bug? If Elvis has enough health, and you can shoot him before he talks, - // he'll jump straight to leading the way without enabling AIVSAI on - // everyone. This may allow him to run past guards without engaging in - // combat. - set_shotlist(AILIST_ELVIS_LEADING) - - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x07) - endloop(0x00) - - label(0x07) - if_chr_deadish(CHR_SELF, /*goto*/ 0x07) - do_preset_animation(PRESETANIM_TALKRANDOM) - set_stage_flag(STAGEFLAG_MET_ELVIS) - speak(CHR_P1P2, L_DAM_034, SFX_81A4, CHANNEL_6, COLOR_06_WHITE) // "Joanna... What took you so long? Follow me - let's..." - - beginloop(0x0b) - if_sound_finished(CHANNEL_6, /*goto*/ 0x07) - endloop(0x0b) - - label(0x07) - set_ailist(CHR_SELF, AILIST_ELVIS_PREPARE_LEADING) - endlist -}; - -u8 func0417_elvis_prepare_leading[] = { - // Allow all other chrs to engage in combat with Elvis - set_chr_flag_bankx(0x03, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x04, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x05, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x06, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x07, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x08, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x09, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0c, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0e, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0f, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x10, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x11, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x12, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x13, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x14, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x15, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x16, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x17, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x18, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x19, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x1a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x1b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x1c, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x1d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x1e, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x1f, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x20, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x21, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x22, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x23, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x24, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x25, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x26, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x27, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x28, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x29, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x2a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x2b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x2c, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x2d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x2e, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x2f, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x30, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x31, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x32, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x33, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x34, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x35, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x36, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x37, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x38, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x39, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x3a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x3b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(CHR_PILOT1, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x3d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(CHR_PILOT2, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(CHR_PILOT3, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x40, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x41, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x42, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x43, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x44, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x45, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x46, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x47, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x48, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x49, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x4a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x4b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x4c, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x4d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x51, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x52, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x53, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x54, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x55, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x56, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x57, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x58, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x59, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x5a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x5b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x5c, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x5d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x5e, CHRFLAG0_AIVSAI, BANK_0) - set_ailist(CHR_SELF, AILIST_ELVIS_LEADING) - endlist -}; - -u8 func101d_alarm_switches[] = { - beginloop(0x00) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x21, /*goto*/ 0x07) - if_chr_activated_object(CHR_P1P2, 0x22, /*goto*/ 0x07) - if_chr_activated_object(CHR_P1P2, 0x23, /*goto*/ 0x07) - if_chr_activated_object(CHR_P1P2, 0x24, /*goto*/ 0x07) - if_chr_activated_object(CHR_P1P2, 0x25, /*goto*/ 0x07) - endloop(0x00) - - label(0x07) - if_alarm_active(/*goto*/ 0x07) - activate_alarm - show_hudmsg(CHR_P1P2, L_DAM_037) // "Alarm has been activated." - goto_next(0x0c) - - label(0x07) - deactivate_alarm - show_hudmsg(CHR_BOND, L_DAM_038) // "Alarm has been deactivated." - goto_next(0x0c) - - label(0x0c) - restart_timer - - beginloop(0x0d) - if_timer_gt(120, /*goto*/ 0x07) - endloop(0x0d) - - label(0x07) - goto_first(0x00) - - // Unreachable - set_ailist(CHR_SELF, AILIST_ELVIS_LEADING) - endlist -}; - -u8 func101e_alarm_images[] = { - beginloop(0x00) - if_alarm_active(/*goto*/ 0x07) - endloop(0x00) - - label(0x07) - set_object_flag(0x27, OBJFLAG_UNCOLLECTABLE) - set_object_flag(0x28, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(0x27, OBJFLAG2_INVISIBLE) - set_object_flag2(0x28, OBJFLAG2_INVISIBLE) - set_object_image(0x21, 0, TVCMDLIST_0F) - set_object_image(0x22, 0, TVCMDLIST_0F) - set_object_image(0x23, 0, TVCMDLIST_0F) - set_object_image(0x24, 0, TVCMDLIST_0F) - set_object_image(0x25, 0, TVCMDLIST_0F) - - beginloop(0x0b) - if_alarm_active(/*goto*/ 0x07) - goto_next(0x04) - - label(0x07) - endloop(0x0b) - - label(0x04) - set_object_image(0x21, 0, TVCMDLIST_14) - set_object_image(0x22, 0, TVCMDLIST_14) - set_object_image(0x23, 0, TVCMDLIST_14) - set_object_image(0x24, 0, TVCMDLIST_14) - set_object_image(0x25, 0, TVCMDLIST_14) - goto_first(0x00) - - endlist -}; - -u8 func101f_unlock_doors[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0b) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0c) - - // PA - unlock_door(0x2c, 0x80) - unlock_door(0x2d, 0x80) - - // SA + PA - label(0x0c) - unlock_door(0x29, 0x80) - unlock_door(0x2a, 0x80) - unlock_door(0x2b, 0x80) - - // A + SA + PA - label(0x0b) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_setup_rtracker[] = { - yield - set_object_flag3(0x27, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(0x28, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1421_setup_environment[] = { - yield - configure_environment(0x0060, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0061, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0063, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0064, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0067, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0068, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0069, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0069, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0070, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0070, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0071, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0071, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0072, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0072, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0073, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0077, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1004_msg_controlledfrom, 0x1004 }, - { func1005_msg_withoutautopilot, 0x1005 }, - { func1006_msg_conductoperations, 0x1006 }, - { func1009_open_reactor_hatch, 0x1009 }, - { func100a_reactor_switch, 0x100a }, - { func100b_check_diving_area_located, 0x100b }, - { func100c_check_end_level, 0x100c }, - { func100e_check_labtech_dead, 0x100e }, - { func100f_check_researchdata_collected, 0x100f }, - { func1010_alarm_responders, 0x1010 }, - { func1011_check_pilots_dead, 0x1011 }, - { func1012_choose_angry_pilot, 0x1012 }, - { func1013_lift_switch, 0x1013 }, - { func1014_moonpool_switch, 0x1014 }, - { func1015_shuffle_hatchswitches, 0x1015 }, - { func1016_hatchswitch1, 0x1016 }, - { func1017_hatchswitch2, 0x1017 }, - { func1018_hatchswitch3, 0x1018 }, - { func1019_hatchswitch4, 0x1019 }, - { func101a_badhatchswitches, 0x101a }, - { func101b_reactor_hum, 0x101b }, - { func101c_check_elvis_dead, 0x101c }, - { func101d_alarm_switches, 0x101d }, - { func101e_alarm_images, 0x101e }, - { func101f_unlock_doors, 0x101f }, - { func1020_setup_rtracker, 0x1020 }, - { func1421_setup_environment, 0x1421 }, - { func1002_intro, 0x0c00 }, - { func0c01_outro, 0x0c01 }, - { func0408_guard_unalerted, 0x0408 }, - { func0405_start_path00, 0x0405 }, - { func0401_pilot, 0x0401 }, - { func0402_init_pilot, 0x0402 }, - { func0401_pilot_dying, 0x0403 }, - { func0404_angry_pilot, 0x0404 }, - { func0c01_outro, 0x0414 }, - { func0415_elvis_at_start, 0x0415 }, - { func0416_elvis_leading, 0x0416 }, - { func0417_elvis_prepare_leading, 0x0417 }, - { func0418_elvis_at_moonpool, 0x0418 }, - { func0406_start_path01, 0x0406 }, - { func0407_start_path02, 0x0407 }, - { func0409_start_path03, 0x0409 }, - { func040a_start_path04, 0x040a }, - { func040b_labtech1, 0x040b }, - { func040c_labtech2, 0x040c }, - { func040d_labtech3, 0x040d }, - { func040e_init_labtech1, 0x040e }, - { func040f_init_labtech2, 0x040f }, - { func0410_init_labtech3, 0x0410 }, - { func0411_labtech_alerted, 0x0411 }, - { func0412_hide, 0x0412 }, - { func0413_guard_alerted, 0x0413 }, - { NULL, 0 }, -}; diff --git a/src/setups/setupdepo.c b/src/setups/setupdepo.c index 1e5e634e0..458cff05b 100644 --- a/src/setups/setupdepo.c +++ b/src/setups/setupdepo.c @@ -110,7 +110,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -511,2650 +511,6 @@ s32 path03[] = { -1, }; -u8 func0409_start_path00[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(5) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(0) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040a_start_path01[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(5) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(1) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040b_start_path02[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(5) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(2) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040c_start_path03[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(5) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(3) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func1008_check_generator[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_GENERATOR, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_GENERATOR, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_GENERATOR_SHUT_DOWN, TRUE, /*goto*/ 0x2c) - - // Destroyed - mute_channel(CHANNEL_4) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_GENERATOR_DESTROYED) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - reloop(0x04) - - // Generator activated - label(0x08) - if_stage_flag_eq(STAGEFLAG_GENERATOR_SHUT_DOWN2, TRUE, /*goto*/ 0x09) - set_object_image(OBJ_GENERATOR, 0, TVCMDLIST_14) - set_object_image(OBJ_GENERATOR, 1, TVCMDLIST_14) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_0) - assign_sound(SFX_8147, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_GENERATOR, TRUE) - show_hudmsg(CHR_P1P2, L_DEPO_025) // "Damping field generator shut down." - set_stage_flag(STAGEFLAG_GENERATOR_SHUT_DOWN2) - set_stage_flag(STAGEFLAG_GENERATOR_SHUT_DOWN) - reloop(0x04) - - label(0x09) - show_hudmsg(CHR_P1P2, L_DEPO_026) // "Generator cannot be restarted." - endloop(0x04) - - endlist -}; - -u8 func1003_laser_switch_1[] = { - assign_sound(SFX_8119, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_LASER_1A, 1, 300, 400) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH1, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_LASERSWITCH1, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_LASERSWITCH1_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - reloop(0x04) - - // Activated/deactivated - label(0x08) - if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, TRUE, /*goto*/ 0x09) - - // Deactivated - set_object_image(OBJ_LASERSWITCH1, 0, TVCMDLIST_14) - show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." - set_stage_flag(STAGEFLAG_LASERSET1_DISABLED) - open_door(OBJ_LASER_1A) - open_door(OBJ_LASER_1B) - open_door(OBJ_LASER_1C) - open_door(OBJ_LASER_1D) - yield - set_object_flag(OBJ_LASER_1A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_1B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_1C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_1D, OBJFLAG_DOOR_KEEPOPEN) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH1, 0x012c, 0x0190, 0x00) - mute_channel(CHANNEL_0) - assign_sound(SFX_PICKUP_SHIELD, CHANNEL_0) - play_sound_from_entity(CHANNEL_0, OBJ_LASER_1A, 0x012c, 0x0190, 0x00) - goto_next(0x0a) - - // Activated - label(0x09) - show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." - unset_stage_flag(STAGEFLAG_LASERSET1_DISABLED) - set_object_image(OBJ_LASERSWITCH1, 0, TVCMDLIST_13) - close_door(OBJ_LASER_1A) - close_door(OBJ_LASER_1B) - close_door(OBJ_LASER_1C) - close_door(OBJ_LASER_1D) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH1, 0x012c, 0x0190, 0x00) - assign_sound(SFX_8119, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_LASER_1A, 1, 300, 400) - goto_next(0x0a) - label(0x0a) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1004_laser_switch_2[] = { - assign_sound(SFX_8119, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_LASER_2A, 1, 300, 400) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH2, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_LASERSWITCH2, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_LASERSWITCH2_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - reloop(0x04) - - // Activated/deactivated - label(0x08) - if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, TRUE, /*goto*/ 0x09) - - // Deactivated - set_object_image(OBJ_LASERSWITCH2, 0, TVCMDLIST_14) - show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." - set_stage_flag(STAGEFLAG_LASERSET2_DISABLED) - open_door(OBJ_LASER_2A) - open_door(OBJ_LASER_2B) - open_door(OBJ_LASER_2C) - open_door(OBJ_LASER_2D) - yield - set_object_flag(OBJ_LASER_2A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2D, OBJFLAG_DOOR_KEEPOPEN) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH2, 0x012c, 0x0190, 0x00) - mute_channel(CHANNEL_1) - assign_sound(SFX_PICKUP_SHIELD, CHANNEL_1) - play_sound_from_entity(CHANNEL_1, OBJ_LASER_2A, 0x012c, 0x0190, 0x00) - goto_next(0x0a) - - // Activated - label(0x09) - set_object_image(OBJ_LASERSWITCH2, 0, TVCMDLIST_13) - show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." - unset_stage_flag(STAGEFLAG_LASERSET2_DISABLED) - close_door(OBJ_LASER_2A) - close_door(OBJ_LASER_2B) - close_door(OBJ_LASER_2C) - close_door(OBJ_LASER_2D) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH2, 0x012c, 0x0190, 0x00) - assign_sound(SFX_8119, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_LASER_2A, 1, 300, 400) - goto_next(0x0a) - label(0x0a) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1005_laser_switch_3[] = { - assign_sound(SFX_8119, CHANNEL_2) - play_sound_from_object(CHANNEL_2, OBJ_LASER_3A, 1, 300, 400) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH3, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_LASERSWITCH3, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_LASERSWITCH3_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - reloop(0x04) - - // Activated/deactivated - label(0x08) - if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, TRUE, /*goto*/ 0x09) - - // Deactivated - set_object_image(OBJ_LASERSWITCH3, 0, TVCMDLIST_14) - show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." - set_stage_flag(STAGEFLAG_LASERSET3_DISABLED) - open_door(OBJ_LASER_3A) - open_door(OBJ_LASER_3B) - open_door(OBJ_LASER_3C) - open_door(OBJ_LASER_3D) - yield - set_object_flag(OBJ_LASER_3A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3D, OBJFLAG_DOOR_KEEPOPEN) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH3, 0x012c, 0x0190, 0x00) - mute_channel(CHANNEL_2) - assign_sound(SFX_PICKUP_SHIELD, CHANNEL_2) - play_sound_from_entity(CHANNEL_2, OBJ_LASER_3A, 0x012c, 0x0190, 0x00) - goto_next(0x0a) - - // Activated - label(0x09) - set_object_image(OBJ_LASERSWITCH3, 0, TVCMDLIST_13) - show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." - unset_stage_flag(STAGEFLAG_LASERSET3_DISABLED) - close_door(OBJ_LASER_3A) - close_door(OBJ_LASER_3B) - close_door(OBJ_LASER_3C) - close_door(OBJ_LASER_3D) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH3, 0x012c, 0x0190, 0x00) - assign_sound(SFX_8119, CHANNEL_2) - play_sound_from_object(CHANNEL_2, OBJ_LASER_3A, 1, 300, 400) - goto_next(0x0a) - label(0x0a) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1006_laser_switch_4[] = { - assign_sound(SFX_811A, CHANNEL_3) - play_sound_from_object(CHANNEL_3, OBJ_LASER_4A, 1, 300, 400) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LASERSWITCH4, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_LASERSWITCH4, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_024) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_LASERSWITCH4_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - reloop(0x04) - - // Activated/deactivated - label(0x08) - if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, TRUE, /*goto*/ 0x09) - - // Deactivated - set_object_image(OBJ_LASERSWITCH4, 0, TVCMDLIST_14) - show_hudmsg(CHR_P1P2, L_DEPO_027) // "Laser grid unit shut down." - set_stage_flag(STAGEFLAG_LASERSET4_DISABLED) - open_door(OBJ_LASER_4A) - open_door(OBJ_LASER_4B) - open_door(OBJ_LASER_4C) - open_door(OBJ_LASER_4D) - yield - set_object_flag(OBJ_LASER_4A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4D, OBJFLAG_DOOR_KEEPOPEN) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH4, 0x012c, 0x0190, 0x00) - mute_channel(CHANNEL_3) - assign_sound(SFX_PICKUP_SHIELD, CHANNEL_3) - play_sound_from_entity(CHANNEL_3, OBJ_LASER_4A, 0x012c, 0x0190, 0x00) - goto_next(0x0a) - - // Activated - label(0x09) - set_object_image(OBJ_LASERSWITCH4, 0, TVCMDLIST_13) - show_hudmsg(CHR_P1P2, L_DEPO_028) // "Laser grid unit activated." - unset_stage_flag(STAGEFLAG_LASERSET4_DISABLED) - close_door(OBJ_LASER_4A) - close_door(OBJ_LASER_4B) - close_door(OBJ_LASER_4C) - close_door(OBJ_LASER_4D) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LASERSWITCH4, 0x012c, 0x0190, 0x00) - assign_sound(SFX_811A, CHANNEL_3) - play_sound_from_object(CHANNEL_3, OBJ_LASER_4A, 1, 300, 400) - goto_next(0x0a) - label(0x0a) - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1007_init_lasers[] = { - yield - - // Wait for cutscene to finish - beginloop(0x8f) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x8f) - - label(0x06) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - // SA/PA - bring up lasers - close_door(OBJ_LASER_1A) - close_door(OBJ_LASER_2A) - close_door(OBJ_LASER_3A) - close_door(OBJ_LASER_4A) - close_door(OBJ_LASER_1B) - close_door(OBJ_LASER_2B) - close_door(OBJ_LASER_3B) - close_door(OBJ_LASER_4B) - close_door(OBJ_LASER_1C) - close_door(OBJ_LASER_2C) - close_door(OBJ_LASER_3C) - close_door(OBJ_LASER_4C) - close_door(OBJ_LASER_1D) - close_door(OBJ_LASER_2D) - close_door(OBJ_LASER_3D) - close_door(OBJ_LASER_4D) - - // Wait until all lasers disabled, show message and set flag - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_ALL_LASERS_DISABLED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_029) // "All laser grid systems shut down." - set_stage_flag(STAGEFLAG_ALL_LASERS_DISABLED) - label(0x2c) - endloop(0x04) - - // Agent - take down lasers - label(0x0d) - set_object_image(OBJ_LASERSWITCH1, 0, TVCMDLIST_14) - set_object_image(OBJ_LASERSWITCH2, 0, TVCMDLIST_14) - set_object_image(OBJ_LASERSWITCH3, 0, TVCMDLIST_14) - set_object_image(OBJ_LASERSWITCH4, 0, TVCMDLIST_14) - open_door(OBJ_LASER_1A) - open_door(OBJ_LASER_2A) - open_door(OBJ_LASER_3A) - open_door(OBJ_LASER_4A) - open_door(OBJ_LASER_1B) - open_door(OBJ_LASER_2B) - open_door(OBJ_LASER_3B) - open_door(OBJ_LASER_4B) - open_door(OBJ_LASER_1C) - open_door(OBJ_LASER_2C) - open_door(OBJ_LASER_3C) - open_door(OBJ_LASER_4C) - open_door(OBJ_LASER_1D) - open_door(OBJ_LASER_2D) - open_door(OBJ_LASER_3D) - open_door(OBJ_LASER_4D) - yield - set_object_flag(OBJ_LASER_1A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4A, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_1B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4B, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_1C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4C, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_1D, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_2D, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_3D, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_LASER_4D, OBJFLAG_DOOR_KEEPOPEN) - set_stage_flag(STAGEFLAG_LASERSET1_DISABLED) - set_stage_flag(STAGEFLAG_LASERSET2_DISABLED) - set_stage_flag(STAGEFLAG_LASERSET3_DISABLED) - set_stage_flag(STAGEFLAG_LASERSET4_DISABLED) - set_stage_flag(STAGEFLAG_ALL_LASERS_DISABLED) - label(0x0e) - yield - open_door(OBJ_LASER_1A) - open_door(OBJ_LASER_2A) - open_door(OBJ_LASER_3A) - open_door(OBJ_LASER_4A) - open_door(OBJ_LASER_1B) - open_door(OBJ_LASER_2B) - open_door(OBJ_LASER_3B) - open_door(OBJ_LASER_4B) - open_door(OBJ_LASER_1C) - open_door(OBJ_LASER_2C) - open_door(OBJ_LASER_3C) - open_door(OBJ_LASER_4C) - open_door(OBJ_LASER_1D) - open_door(OBJ_LASER_2D) - open_door(OBJ_LASER_3D) - open_door(OBJ_LASER_4D) - yield - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_1) - mute_channel(CHANNEL_2) - mute_channel(CHANNEL_3) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_spawner_during_decode[] = { - // Wait for alarm or decoder attached - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_DECODER_ATTACHED, TRUE, /*goto*/ 0x06) - if_alarm_active(/*goto*/ 0x61) - endloop(0x04) - - // Decoder is attached - label(0x06) - yield - yield - - // Wait 8.3 seconds - restart_timer - - beginloop(0x08) - if_timer_gt(500, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - activate_alarm - - // Spawn two swat guards - label(0x61) - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_0058, 0x0401, SPAWNFLAG_00000200, /*goto*/ 0x06) - label(0x06) - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_003F, 0x0402, SPAWNFLAG_00000200, /*goto*/ 0x06) - label(0x06) - - // Every half second, use RNG to decide whether to consider spawning more. - // 55/255 chance of passing. - label(0x09) - restart_timer - call_rng - - beginloop(0x0a) - if_rand_gt(200, /*goto*/ 0x06) - if_timer_gt(30, /*goto*/ 0x2c) - endloop(0x0a) - - label(0x2c) - reloop(0x09) - - label(0x06) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x55) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x56) - if_num_chrs_in_squadron_gt(5, 0x09, /*goto*/ 0x2c) - if_kill_count_gt(50, /*goto*/ 0x2c) - goto_next(0x57) - - // Agent - label(0x55) - if_num_chrs_in_squadron_gt(3, 0x09, /*goto*/ 0x2c) - if_kill_count_gt(50, /*goto*/ 0x2c) - goto_next(0x57) - - // Special Agent - label(0x56) - if_num_chrs_in_squadron_gt(4, 0x09, /*goto*/ 0x2c) - if_kill_count_gt(50, /*goto*/ 0x2c) - goto_next(0x57) - - // All difficulties - label(0x57) - call_rng - if_rand_gt(128, /*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_VISITED_TOP_DOOR, TRUE, /*goto*/ 0x2c) - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_0058, 0x0401, SPAWNFLAG_00000200, /*goto*/ 0x06) - label(0x06) - goto_next(0x0d) - - label(0x2c) - reloop(0x09) - - label(0x0b) - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, PAD_DEPO_003F, 0x0402, SPAWNFLAG_00000200, /*goto*/ 0x06) - label(0x06) - label(0x0d) - restart_timer - - beginloop(0x0e) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - endloop(0x09) - - endlist -}; - -#define init_swat \ - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) \ - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(15) \ - set_reaction_speed(25) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x06) \ - label(0x06) \ - set_chr_team(CHR_SELF, TEAM_ENEMY) \ - set_squadron(SQUADRON_09) \ - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) \ - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) \ - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) \ - set_alertness(90) \ - set_self_chrflag(CHRCFLAG_00000200) \ - rebuild_teams \ - rebuild_squadrons \ - run_to_pad(PAD_DEPO_004E) - -u8 func0401_init_swat1[] = { - init_swat - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x2c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2c) - if_chr_in_room(CHR_SELF, 0x00, 0x0050, /*goto*/ 0x06) - endloop(0x08) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - label(0x06) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * Same as above, but guards with this function will become unalerted if they - * lose sight of Jo regardless of what room they're in. - */ -u8 func0402_init_swat2[] = { - init_swat - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x2c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2c) - if_chr_in_room(CHR_SELF, 0x00, 0x0050, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - label(0x06) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func100a_give_keycards[] = { - set_object_flag(OBJ_KEYCARD1, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_KEYCARD1, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_KEYCARD2, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_KEYCARD2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_CROSSBOW, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_CROSSBOW, OBJFLAG_UNCOLLECTABLE) - - set_chr_chrflag(CHR_CLOAK_1A, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_CLOAK_1B, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_CLOAK_2A, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_CLOAK_2B, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_CLOAK_2C, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_CLOAK_2D, CHRCFLAG_KILLCOUNTABLE) - - // Wait for trigger - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_CLOAK1_ONE_REMAINING, TRUE, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - if_chr_deadish(CHR_CLOAK_1A, /*goto*/ 0x06) - - // First cloacked guard is alive - give_object_to_chr(OBJ_KEYCARD1, CHR_CLOAK_1A) - give_object_to_chr(OBJ_CROSSBOW, CHR_CLOAK_1A) - set_target_chr(CHR_CLOAK_1A) - goto_next(0x2c) - - // First cloaked guard is dead - label(0x06) - give_object_to_chr(OBJ_KEYCARD1, CHR_CLOAK_1B) - give_object_to_chr(OBJ_CROSSBOW, CHR_CLOAK_1B) - set_target_chr(CHR_CLOAK_1B) - - label(0x2c) - unset_object_flag(OBJ_KEYCARD1, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_KEYCARD1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_CROSSBOW, OBJFLAG2_INVISIBLE) - unset_object_flag(OBJ_CROSSBOW, OBJFLAG_UNCOLLECTABLE) - - // Wait for the chr who holds the keycard to die - beginloop(0x55) - if_chr_knockedout(CHR_TARGET, /*goto*/ 0x08) - if_chr_dead(CHR_TARGET, /*goto*/ 0x2c) - if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x2c) - endloop(0x55) - - label(0x2c) - set_object_flag2(OBJ_CROSSBOW, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_CROSSBOW, OBJFLAG_UNCOLLECTABLE) - disable_object(OBJ_CROSSBOW) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_CLOAK2_ONE_REMAINING, TRUE, /*goto*/ 0x2c) - endloop(0x08) - - // Second room - label(0x2c) - if_chr_deadish(CHR_CLOAK_2A, /*goto*/ 0x06) - - // 2A alive - give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2A) - goto_next(0x2c) - - // 2A dead - label(0x06) - if_chr_deadish(CHR_CLOAK_2B, /*goto*/ 0x06) - give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2B) - goto_next(0x2c) - - // 2B dead - label(0x06) - if_chr_deadish(CHR_CLOAK_2C, /*goto*/ 0x06) - give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2C) - goto_next(0x2c) - - // 2C dead - label(0x06) - give_object_to_chr(OBJ_KEYCARD2, CHR_CLOAK_2D) - - label(0x2c) - unset_object_flag(OBJ_KEYCARD2, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_KEYCARD2, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_backup_collected[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_BACKUPDISK, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - set_stage_flag(STAGEFLAG_BACKUP_COLLECTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_set_ai[] = { - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - - // On counterop SA and PA, give Joanna a CMP150 - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - give_object_to_chr(OBJ_CMP150_BOND, CHR_BOND) - give_object_to_chr(OBJ_CMP150_COOP, CHR_COOP) - label(0x06) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func100e_check_conspirators_alerted[] = { - // Wait for alarm - beginloop(0x04) - if_alarm_active(/*goto*/ 0x06) - reloop(0x04) - - // These objects are doors - label(0x06) - unset_object_flag2(0x3f, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x40, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x41, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x42, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x43, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x44, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x45, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x46, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x34, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x35, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x36, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x37, OBJFLAG2_AICANNOTUSE) - - set_stage_flag(STAGEFLAG_ALARM_SOUNDING) - if_stage_flag_eq(STAGEFLAG_MEETING_STARTED, TRUE, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_CONSPIRATORS_ALERTED) - set_ailist(CHR_CASS, AILIST_RUN_FROM_MEETING) - set_ailist(0x1c, AILIST_RUN_FROM_MEETING) // chr doesn't exist - set_ailist(CHR_BLONDE, AILIST_RUN_FROM_MEETING) - show_hudmsg(CHR_BOND, L_DEPO_041) // "Conspirators have been alerted." - - // Wait until alarm not active - label(0x06) - - beginloop(0x55) - if_alarm_active(/*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x55) - - label(0x06) - unset_stage_flag(STAGEFLAG_ALARM_SOUNDING) - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_alarm_switches[] = { - // Wait until player activated alarm switch - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_ALARM1, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_ALARM2, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDING, TRUE, /*goto*/ 0x06) - show_hudmsg(CHR_P1P2, L_DEPO_042) // "Alarm activated." - set_stage_flag(STAGEFLAG_ALARM_SOUNDING) - activate_alarm - reloop(0x04) - - label(0x06) - show_hudmsg(CHR_P1P2, L_DEPO_043) // "Alarm deactivated." - unset_stage_flag(STAGEFLAG_ALARM_SOUNDING) - deactivate_alarm - endloop(0x04) - - endlist -}; - -u8 func1010_safe_cracking[] = { - // Wait for player to activate keypad or for it to be destroyed - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_SAFEKEYPAD, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_064) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_SAFEKEYPAD_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_SAFEKEYPAD, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DOORDECODER, /*goto*/ 0x2c) - show_hudmsg(CHR_P1P2, L_DEPO_044) // "Safe door is locked." - endloop(0x04) - - label(0x2c) - show_hudmsg(CHR_P1P2, L_DEPO_045) // "Door Decoder attached." - remove_weapon_from_inventory(WEAPON_DOORDECODER) - move_object_to_pad(OBJ_DECODER, PAD_DEPO_0075) - set_stage_flag(STAGEFLAG_DECODER_ATTACHED) - assign_sound(SFX_8144, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_SAFEKEYPAD, 1, 300, 400) - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - speak(CHR_BOND, L_DEPO_038, MP3_0754, CHANNEL_5, COLOR_00_GREEN) // "INTRUDER ALERT - all security to the vault." - play_x_track(XREASON_DEFAULT, 10, 180) - yield - set_countdown_timer(60) - show_hudmsg(CHR_P1P2, L_DEPO_036) // "Initiating cracking routines." - yield - show_countdown_timer - start_countdown_timer - restart_timer - - beginloop(0x5e) - if_timer_gt(180, /*goto*/ 0x2c) - endloop(0x5e) - - label(0x2c) - activate_alarm - - beginloop(0x08) - if_object_in_good_condition(OBJ_SAFEKEYPAD, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_DEPO_064) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_SAFEKEYPAD_DESTROYED) - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - if_countdown_timer_lt(1, /*goto*/ 0x06) - endloop(0x08) - - // Unlock - label(0x06) - mute_channel(CHANNEL_1) - assign_sound(SFX_8145, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_SAFEKEYPAD, TRUE) - show_hudmsg(CHR_P1P2, L_DEPO_037) // "Door Decoder finished - door unlocked." - unlock_door(OBJ_SAFEDOOR, 0x40) - unset_object_flag2(OBJ_SAFEDOOR, OBJFLAG2_AICANNOTUSE) - open_door(OBJ_SAFEDOOR) - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_check_for_end[] = { - // Wait until player on ending catwalk - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0060, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0061, /*goto*/ 0x06) - reloop(0x08) - - label(0x06) - if_chr_deadish(CHR_P1P2, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x08) - - label(0x06) - set_stage_flag(STAGEFLAG_EXITED_BUILDING) - set_invincible(CHR_BOND) - yield - yield - revoke_control(CHR_BOND, 4) - hide_countdown_timer - stop_countdown_timer - if_all_objectives_complete(/*goto*/ 0x53) - show_hudmsg(CHR_BOND, L_DEPO_051) // "Objectives incomplete - MISSION FAILED." - label(0x2c) - restart_timer - - beginloop(0x52) - if_timer_gt(280, /*goto*/ 0x2c) - endloop(0x52) - - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Objectives complete - label(0x53) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x06) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func1013_check_escape_doors[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_ESCAPEDOOR1, /*goto*/ 0x06) - goto_next(0x2c) - label(0x06) - if_object_in_good_condition(OBJ_ESCAPEDOOR2, /*goto*/ 0x06) - label(0x2c) - activate_alarm - set_ailist(CHR_SELF, GAILIST_IDLE) - reloop(0x04) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1014_check_camspy_location[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(0x00, /*camspy*/ 0x02, VERSION >= VERSION_NTSC_1_0 ? 0x0094 : 0x003a, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_CONSPIRATORS_ALERTED, TRUE, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_MEETING_HOLOGRAPHED) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_check_for_meeting_trigger[] = { - // Wait until meeting started then start cutscene - beginloop(0x00) - if_stage_flag_eq(STAGEFLAG_MEETING_HOLOGRAPHED, TRUE, /*goto*/ 0x06) - endloop(0x00) - - label(0x06) - set_ailist(CHR_SELF, AILIST_MEETING_CUTSCENE) - endlist -}; - -u8 func0403_walk_from_meeting[] = { - walk_to_pad(PAD_DEPO_0085) - - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x04) - - label(0x06) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0404_run_from_meeting[] = { - run_to_pad(PAD_DEPO_0085) - - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x04) - - label(0x06) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -/** - * Monitor the laser states and unset the stage flags when they become enabled - * (ie. door is closed). This seems redundant because the flags are unset when - * the switches are used. Maybe they close after a long timeout or something. - */ -u8 func1017_check_lasers_closed[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ALL_LASERS_DISABLED, TRUE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_MEETING_HOLOGRAPHED, TRUE, /*goto*/ 0x08) - if_door_state(OBJ_LASER_1A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - unset_stage_flag(STAGEFLAG_LASERSET1_DISABLED) - label(0x2c) - if_door_state(OBJ_LASER_2A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - unset_stage_flag(STAGEFLAG_LASERSET2_DISABLED) - label(0x2c) - if_door_state(OBJ_LASER_3A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - unset_stage_flag(STAGEFLAG_LASERSET3_DISABLED) - label(0x2c) - if_door_state(OBJ_LASER_4A, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - unset_stage_flag(STAGEFLAG_LASERSET4_DISABLED) - label(0x2c) - endloop(0x04) - - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_INTRO) - camera_movement(ANIM_CUT_DEPO_INTRO_CAM) - cmd0175(60) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_INTRO_VICTIM, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_INTRO_GUARD_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_VICTIM, 4) - - restart_timer - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - - beginloop(0x55) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(74, /*goto*/ 0x06) - endloop(0x55) - - label(0x06) - play_sound(SFX_0161, CHANNEL_7) - - beginloop(0x56) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(100, /*goto*/ 0x06) - endloop(0x56) - - label(0x06) - play_sound(SFX_0085, CHANNEL_7) - - beginloop(0x57) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(172, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - play_sound(SFX_0163, CHANNEL_7) - - beginloop(0x58) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(173, /*goto*/ 0x06) - endloop(0x58) - - label(0x06) - play_sound(SFX_0164, CHANNEL_6) - - beginloop(0x59) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(278, /*goto*/ 0x06) - endloop(0x59) - - label(0x06) - play_sound(SFX_0161, CHANNEL_7) - - beginloop(0x5a) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(312, /*goto*/ 0x06) - endloop(0x5a) - - label(0x06) - play_sound(SFX_0162, CHANNEL_7) - - beginloop(0x5b) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(356, /*goto*/ 0x06) - endloop(0x5b) - - label(0x06) - play_sound(SFX_0163, CHANNEL_7) - - beginloop(0x5c) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(396, /*goto*/ 0x06) - endloop(0x5c) - - label(0x06) - play_sound(SFX_0164, CHANNEL_7) - - beginloop(0x5d) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(434, /*goto*/ 0x06) - endloop(0x5d) - - label(0x06) - play_sound(SFX_0161, CHANNEL_7) - - beginloop(0x5e) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(478, /*goto*/ 0x06) - endloop(0x5e) - - label(0x06) - play_sound(SFX_0162, CHANNEL_7) - - beginloop(0x60) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(515, /*goto*/ 0x06) - endloop(0x60) - - label(0x06) - play_sound(SFX_0163, CHANNEL_7) - - beginloop(0x61) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(560, /*goto*/ 0x06) - endloop(0x61) - - label(0x06) - play_sound(SFX_0164, CHANNEL_7) - - beginloop(0x65) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(568, /*goto*/ 0x06) - endloop(0x65) - - label(0x06) - play_sound(SFX_0162, CHANNEL_6) - - beginloop(0x62) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(595, /*goto*/ 0x06) - endloop(0x62) - - label(0x06) - play_sound(SFX_0161, CHANNEL_7) - - beginloop(0x63) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(630, /*goto*/ 0x06) - endloop(0x63) - - label(0x06) - play_sound(SFX_0162, CHANNEL_7) - - beginloop(0x66) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(638, /*goto*/ 0x06) - endloop(0x66) - - label(0x06) - play_sound(SFX_0163, CHANNEL_6) - - beginloop(0x68) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(670, /*goto*/ 0x06) - endloop(0x68) - - label(0x06) - play_sound(SFX_002E, CHANNEL_7) - - beginloop(0x67) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(670, /*goto*/ 0x06) - endloop(0x67) - - label(0x06) - play_sound(SFX_0045, CHANNEL_6) - chr_drop_weapon(CHR_INTRO_VICTIM) - - beginloop(0x69) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(672, /*goto*/ 0x06) - endloop(0x69) - - label(0x06) - play_sound(SFX_ARGH_MALE_0087, CHANNEL_5) - - beginloop(0x64) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(702, /*goto*/ 0x06) - endloop(0x64) - - label(0x06) - play_sound(SFX_0164, CHANNEL_6) - - beginloop(0x6a) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(718, /*goto*/ 0x06) - endloop(0x6a) - - label(0x06) - play_sound(SFX_007A, CHANNEL_7) - - beginloop(0x6b) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(722, /*goto*/ 0x06) - endloop(0x6b) - - label(0x06) - play_sound(SFX_007C, CHANNEL_6) - - beginloop(0x6c) - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(764, /*goto*/ 0x06) - endloop(0x6c) - - label(0x06) - play_sound(SFX_0082, CHANNEL_5) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0x54) - label(0x2c) - if_controller_button_pressed(/*goto*/ 0x54) - label(0x2c) - endloop(0x08) - - label(0x54) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_INTRO_VICTIM, CHRHFLAG_00020000) - set_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_INTRO_VICTIM, CHRCFLAG_PERIMDISABLEDTMP) - chr_do_animation(ANIM_CUT_DEPO_INTRO_GUARD_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_VICTIM, 2) - - stop_cutscene_track - stop_ambient_track - enter_firstperson - chr_do_animation(ANIM_CUT_DEPO_INTRO_GUARD_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_VICTIM, 2) - chr_drop_weapon(CHR_INTRO_VICTIM) - yield - set_ailist(CHR_CLOAK_1A, AILIST_INIT_CLOAK1_GUARD) - set_ailist(CHR_CLOAK_1B, AILIST_INIT_CLOAK1_GUARD) - yield - kill(CHR_INTRO_VICTIM) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -// Used in both mid and outro cutscenes -#define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x54) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - \ - label(0x06) - -u8 func040e_meeting_cutscene[] = { - deactivate_alarm - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_MIDCUTSCENE) - camera_movement(ANIM_CUT_DEPO_MID_CAM) - set_stage_flag(STAGEFLAG_MEETING_STARTED) - set_ailist(CHR_BLONDE, GAILIST_IDLE) - set_ailist(CHR_CASS, GAILIST_IDLE) - set_ailist(CHR_TRENT, GAILIST_IDLE) - set_ailist(CHR_STRIPES, GAILIST_IDLE) - - set_chr_chrflag(CHR_BLONDE, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_BLONDE, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_BLONDE, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_MID_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BLONDE, 4) - - set_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_MID_CASS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 4) - - set_chr_chrflag(CHR_TRENT, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TRENT, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_MID_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TRENT, 4) - - set_chr_chrflag(CHR_STRIPES, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_STRIPES, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_STRIPES, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_MID_STR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_STRIPES, 4) - restart_timer - - beginloop(0x55) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x55) - - label(0x06) - speak(CHR_BOND, L_DEPO_072, MP3_040C, CHANNEL_5, COLOR_04_ORANGE) // "We've recovered the sapient from Carrington and al..." - - wait_until(752, 0x56) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(760, 0x57) - speak(CHR_BOND, L_DEPO_073, MP3_040D, CHANNEL_7, COLOR_03_RED) // "This will reduce its efficiency. My team will have..." - - wait_until(813, 0x58) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(864, 0x59) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(1183, 0x5a) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(1466, 0x5b) - play_sound(SFX_0161, CHANNEL_6) - - // Someone screwed up the labelling here... - // 5c was probably supposed to go here. - yield - if_controller_button_pressed(/*goto*/ 0x54) - if_timer_gt(1594, /*goto*/ 0x06) - goto_first(0x5c) - label(0x06) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(1638, 0x5c) - play_sound(SFX_0593, CHANNEL_6) - - wait_until(1684, 0x5d) - speak(CHR_BOND, L_DEPO_074, MP3_040E, CHANNEL_5, COLOR_04_ORANGE) // "No one could have predicted that! And I resent bei..." - - wait_until(1780, 0x5e) - play_sound_from_object2(CHANNEL_6, 0x3a, SFX_01D5, 0x00, 0x00) - - wait_until(2050, 0x60) - play_sound_from_object2(CHANNEL_7, 0x3a, SFX_00EC, 0x00, 0x00) - - wait_until(2070, 0x5f) - open_door(0x3a) - play_sound_from_object2(0x0a, 0x3a, SFX_DOOR_81B0, 0x00, 0x00) - - wait_until(2195, 0x61) - play_sound(SFX_0171, CHANNEL_6) - - wait_until(2227, 0x62) - play_sound(SFX_0172, CHANNEL_5) - - wait_until(2272, 0x63) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(2291, 0x64) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(2316, 0x65) - speak(CHR_BOND, L_DEPO_075, MP3_040F, CHANNEL_7, COLOR_03_RED) // "The President turned down your request for the loa..." - - wait_until(2342, 0x67) - play_sound(SFX_0162, CHANNEL_6) - close_door(0x3a) - - wait_until(2387, 0x68) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(2406, 0x69) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(2521, 0x6a) - play_sound(SFX_0161, CHANNEL_5) - - wait_until(2547, 0x6b) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(2584, 0x6c) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(2586, 0x6d) - play_sound(SFX_0164, CHANNEL_5) - - wait_until(2617, 0x6e) - play_sound(SFX_0164, CHANNEL_5) - - wait_until(2662, 0x70) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(2668, 0x71) - play_sound(SFX_0161, CHANNEL_5) - - wait_until(2692, 0x6f) - speak(CHR_BOND, L_DEPO_076, MP3_0410, CHANNEL_7, COLOR_03_RED) // "Could it be you overestimated your influence over ..." - - wait_until(2705, 0x72) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(2713, 0x73) - play_sound(SFX_0162, CHANNEL_5) - - wait_until(2796, 0x74) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(2937, 0x75) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(2971, 0x76) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(3000, 0x77) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(3046, 0x78) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(3048, 0x79) - speak(CHR_BOND, L_DEPO_077, MP3_0411, CHANNEL_7, COLOR_05_GREEN) // "No! Perhaps I underestimated his resolve. We have ..." - - wait_until(3186, 0x7a) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(3378, 0x7b) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(3429, 0x7c) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(3481, 0x7d) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(3557, 0x7e) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(3628, 0x7f) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(3813, 0x80) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(3916, 0x81) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(4070, 0x82) - speak(CHR_BOND, L_DEPO_078, MP3_0412, CHANNEL_7, COLOR_04_ORANGE) // "Ha! Assuming you don't get any interference. If Ca..." - - wait_until(4312, 0x84) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(4370, 0x85) - play_sound(SFX_0164, CHANNEL_5) - - wait_until(4440, 0x86) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(4510, 0x87) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(4555, 0x88) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(4560, 0x83) - speak(CHR_BOND, L_DEPO_079, MP3_0413, CHANNEL_5, COLOR_05_GREEN) // "There will be no outside help for Mr. Carrington. ..." - - wait_until(4636, 0x89) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(5017, 0x8a) - play_sound(SFX_0164, CHANNEL_7) - - wait_until(5272, 0x8b) - speak(CHR_BOND, L_DEPO_080, MP3_0414, CHANNEL_5, COLOR_03_RED) // "Then the devices we gave you are working correctly..." - - wait_until(5360, 0x8c) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(5509, 0x8d) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(5897, 0x8e) - play_sound(SFX_0161, CHANNEL_6) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0x54) - label(0x2c) - label(0x2c) - endloop(0x08) - - label(0x54) - label(0x06) - stop_cutscene_track - stop_ambient_track - enter_firstperson - set_stage_flag(STAGEFLAG_MEETING_FINISHED) - mute_channel(CHANNEL_10) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - restart_timer - label(0x06) - set_ailist(CHR_CASS, AILIST_WALK_FROM_MEETING) - - beginloop(0x0e) - if_timer_gt(140, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - set_ailist(CHR_TRENT, AILIST_WALK_FROM_MEETING) - - beginloop(0x0f) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x0f) - - label(0x06) - chr_move_to_pad(0x1e, PAD_DEPO_003C, 0x01, /*goto*/ 0x2c) // invalid chr? - label(0x2c) - set_ailist(CHR_BLONDE, AILIST_WALK_FROM_MEETING) - set_ailist(CHR_STRIPES, AILIST_WALK_FROM_MEETING) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040f_outro_from_menu[] = { - disable_object(OBJ_MINE1) - disable_object(OBJ_MINE2) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func040f_outro[] = { - camera_movement(ANIM_CUT_DEPO_OUTRO_CAM) - play_cutscene_track(MUSIC_G5_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DEPO_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - set_chr_hudpiece_visible(CHR_P1P2, TRUE) - restart_timer - deactivate_alarm - show_nonessential_chrs(FALSE) - set_cutscene_weapon(CHR_P1P2, -1, -1) - yield - set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2_SILENCER) - - wait_until(20, 0x55) - play_sound(SFX_0171, CHANNEL_6) - - wait_until(38, 0x57) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(69, 0x58) - play_sound(SFX_0174, CHANNEL_6) - - wait_until(88, 0x5a) - play_sound(SFX_0172, CHANNEL_6) - - wait_until(103, 0x5b) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(134, 0x5c) - play_sound(SFX_0174, CHANNEL_6) - - wait_until(142, 0x5e) - - wait_until(162, 0x60) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(185, 0x61) - play_sound(SFX_0174, CHANNEL_6) - - wait_until(204, 0x62) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(220, 0x63) - play_sound(SFX_0172, CHANNEL_6) - - wait_until(256, 0x64) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(262, 0x65) - play_sound(SFX_0174, CHANNEL_6) - - enable_rain(2) - wait_until(273, 0x68) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(318, 0x6a) - play_sound(SFX_0174, CHANNEL_6) - - wait_until(344, 0x6b) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(362, 0x6c) - play_sound(SFX_0172, CHANNEL_6) - - wait_until(390, 0x6d) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(404, 0x6e) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(420, 0x70) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(468, 0x71) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(488, 0x72) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(679, 0x74) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(728, 0x56) - - wait_until(768, 0x73) - speak(CHR_P1P2, L_DEPO_081, MP3_0415, CHANNEL_7, COLOR_09_BLUE) // "Agent Dark reporting in! Prepare to receive a down..." - - wait_until(1280, 0x59) - - wait_until(1310, 0x75) - speak(CHR_P1P2, L_DEPO_082, MP3_0416, CHANNEL_7, COLOR_06_WHITE) // "No time for that now, Agent Dark. There's been a d..." - - wait_until(1780, 0x76) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(1841, 0x77) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(1883, 0x78) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(2600, 0x5d) - - wait_until(2630, 0x79) - speak(CHR_P1P2, L_DEPO_083, MP3_0417, CHANNEL_7, COLOR_09_BLUE) // "Area 51? But what about the President?" - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0x54) - label(0x2c) - if_controller_button_pressed(/*goto*/ 0x54) - label(0x2c) - endloop(0x08) - - label(0x54) - label(0x06) - set_chr_hudpiece_visible(CHR_P1P2, FALSE) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_intro_from_menu[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO) - endlist -}; - -u8 func1019_generator_hum[] = { - yield - assign_sound(SFX_8146, CHANNEL_4) - play_sound_from_object(CHANNEL_4, OBJ_GENERATOR, 1, 1600, 2200) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Not entirely sure what this does. It's probably the guards in the laser - * switch area, and it probably controls which ones will run for the alarm. - */ -u8 func101a_init_laser_switch_guards[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) - - // Perfect Agent - set_chr_flag_bankx(0x0c, CHRFLAG0_ACTIVATEALARM, BANK_0) - set_chr_flag_bankx(0x0d, CHRFLAG0_ACTIVATEALARM, BANK_0) - set_chr_flag_bankx(0x0e, CHRFLAG0_ACTIVATEALARM, BANK_0) - goto_next(0x06) - - // Agent - label(0x08) - set_chr_flag_bankx(0x0e, CHRFLAG0_ACTIVATEALARM, BANK_0) - set_chr_flag_bankx(0x0e, CHRFLAG0_SURPRISABLE, BANK_0) - goto_next(0x06) - - // Special Agent - label(0x09) - set_chr_flag_bankx(0x0e, CHRFLAG0_ACTIVATEALARM, BANK_0) - set_chr_flag_bankx(0x0d, CHRFLAG0_ACTIVATEALARM, BANK_0) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_cloak_guard[] = { - set_morale(0) - set_shotlist(AILIST_CLOAK_GUARD) - set_chr_cloaked(CHR_SELF, TRUE, FALSE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x03) - - // Dead - label(0x06) - goto_next(0x10) - - // Choose target - label(0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - label(0x06) - restart_timer - cmd0139(70, 0x02, TRUE) - - // Wait 3 seconds or until stopped - beginloop(0x55) - if_timer_gt(180, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x55) - - // 50% chance of attacking immediately, 50% at 2 seconds - label(0x06) - stop_chr - call_rng - if_rand_gt(128, /*goto*/ 0x06) - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - - // Attacking - label(0x06) - if_morale_lt(3, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_within_targets_fovx_by_angle(15, /*goto*/ 0x0e) - label(0x06) - if_can_see_attack_target(/*goto*/ 0x2c) - goto_next(0x0d) - label(0x0e) - add_morale(1) - label(0x2c) - restart_timer - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - label(0x0a) - label(0x2c) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2c) - label(0x2c) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x0c) - endloop(0x0b) - - label(0x0c) - set_morale(0) - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - label(0x0d) - goto_first(0x03) - - label(0x10) - if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED, /*goto*/ 0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0413_cloak1_guard[] = { - yield - set_shotlist(AILIST_CLOAK_GUARD) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - label(0x06) - set_reaction_speed(100) - set_shotlist(AILIST_CLOAK_GUARD) - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_distance_to_target_lt(400, /*goto*/ 0x06) - if_target_in_fov(30, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x06) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) - if_timer_gt(180, /*goto*/ 0x06) - label(0x2c) - endloop(0x04) - - label(0x06) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_00040000) - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - set_ailist(CHR_SELF, AILIST_CLOAK_GUARD) - endlist -}; - -u8 func0414_init_cloak2_guard[] = { - stop_chr - set_shotlist(AILIST_CLOAK_GUARD) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_chr_dodge_rating(2, 10) - set_accuracy(5) - set_reaction_speed(25) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_00040000) - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - set_ailist(CHR_SELF, AILIST_CLOAK_GUARD) - endlist -}; - -u8 func101b_cloak2_entry[] = { - // Wait until in glass area of second cloak room - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x001a, /*goto*/ 0x06) -#if VERSION < VERSION_NTSC_1_0 - if_chr_in_room(0x00, /*camspy*/ 0x02, 0x001a, /*goto*/ 0x06) -#endif - endloop(0x08) - - label(0x06) - lock_door(0x34, 0x10) - lock_door(0x35, 0x10) - lock_door(0x36, 0x10) - lock_door(0x37, 0x10) - set_object_flag2(0x34, OBJFLAG2_LOCKEDBACK) - set_object_flag2(0x35, OBJFLAG2_LOCKEDBACK) - set_object_flag2(0x36, OBJFLAG2_LOCKEDFRONT) - set_object_flag2(0x37, OBJFLAG2_LOCKEDBACK) - close_door(0x34) - close_door(0x35) - close_door(0x36) - close_door(0x37) - if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x2c) - play_sound(SFX_8147, -1) - restart_timer - set_lights_state(0x000b, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000c, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000d, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000e, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0010, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000f, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0011, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0012, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0013, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0014, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0015, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0017, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0018, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0001, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0003, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0004, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0005, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0006, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0007, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0008, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0009, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000a, LIGHTOP_3, 0xff, 0x06, 0x78) - - // Wait 2 seconds - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_lights_state(0x000b, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000c, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000d, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000e, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0010, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000f, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0011, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0012, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0013, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0014, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0015, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0017, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0018, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0001, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0003, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0004, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0005, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0006, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0007, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0008, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0009, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000a, LIGHTOP_1, 0x0a, 0x00, 0x00) - goto_next(0x07) - - label(0x2c) - play_sound(SFX_8148, -1) - set_lights_state(0x000b, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000c, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000d, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000e, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0010, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000f, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0011, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0012, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0013, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0014, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0015, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0017, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0018, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0001, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0003, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0004, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0005, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0006, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0007, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0008, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0009, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000a, LIGHTOP_3, 0x06, 0xff, 0x78) - - // Wait 2 seconds - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_lights_state(0x000b, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000c, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000d, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000e, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0010, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000f, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0011, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0012, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0013, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0014, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0015, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0017, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0018, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0001, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0003, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0004, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0005, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0006, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0007, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0008, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0009, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000a, LIGHTOP_1, 0xff, 0x00, 0x00) - - label(0x07) - unset_chr_chrflag(CHR_CLOAK_2A, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_CLOAK_2B, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_CLOAK_2C, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_CLOAK_2D, CHRCFLAG_HIDDEN) - set_ailist(CHR_CLOAK_2A, AILIST_CLOAK2_GUARD) - set_ailist(CHR_CLOAK_2B, AILIST_CLOAK2_GUARD) - set_ailist(CHR_CLOAK_2C, AILIST_CLOAK2_GUARD) - set_ailist(CHR_CLOAK_2D, AILIST_CLOAK2_GUARD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0405_cloak2_hide[] = { - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_check_visited_top_door[] = { - // Wait until decoder attached - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_DECODER_ATTACHED, TRUE, /*goto*/ 0x08) - endloop(0x04) - - // Wait until player gone near top fire escape door - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 400, PAD_DEPO_0058, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_stage_flag(STAGEFLAG_VISITED_TOP_DOOR) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_init_mines[] = { - yield - set_object_flag2(OBJ_MINE1, OBJFLAG2_00020000) - set_object_flag2(OBJ_MINE2, OBJFLAG2_00020000) - set_object_flag2(OBJ_MINE1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_MINE2, OBJFLAG2_INVISIBLE) - unset_object_flag(OBJ_MINE1, OBJFLAG_00000100) - unset_object_flag(OBJ_MINE2, OBJFLAG_00000100) - set_chr_team(CHR_ANTI, TEAM_ENEMY) - - label(0x06) - if_savefile_flag_is_unset(GAMEFILEFLAG_G5_MINE, /*goto*/ 0x06) - - disable_object(OBJ_MINE1) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - disable_object(OBJ_MINE2) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_guard(accuracy, reaction, function) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(accuracy) \ - set_reaction_speed(reaction) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - set_ailist(CHR_SELF, function) - -u8 func0406_init_type1_guard[] = { - init_guard(5, 30, GAILIST_UNALERTED) - endlist -}; - -// Never assigned -u8 func0407_init_type2_guard[] = { - init_guard(15, 25, GAILIST_UNALERTED) - endlist -}; - -u8 func0408_init_cloak1_guard[] = { - init_guard(5, 25, 0x0413) - endlist -}; - -u8 func101e_msg_nowaythrough[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, FALSE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, FALSE, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_chr_in_room(CHR_P1P2, 0x00, 0x002f, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - speak(CHR_P1P2, L_DEPO_060, MP3_03B4, CHANNEL_6, COLOR_09_BLUE) // "There's no way through while those lasers are acti..." - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_msg_meetingroomahead[] = { - restart_timer - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MEETING_HOLOGRAPHED, TRUE, /*goto*/ 0x0d) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_chr_y(CHR_P1P2, 300, OPERATOR_LESS_THAN, /*goto*/ 0x06) - goto_next(0x2c) - label(0x06) - endloop(0x04) - - label(0x2c) - speak(CHR_P1P2, L_DEPO_061, MP3_03B5, CHANNEL_6, COLOR_09_BLUE) // "That must be the meeting room up ahead. Time to us..." - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_msg_heavilyencrypted[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0050, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - speak(CHR_P1P2, L_DEPO_062, SFX_817C, CHANNEL_6, COLOR_09_BLUE) // "The safe's heavily encrypted. The decoder's gonna ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1021_blow_mines[] = { - // Wait for backup collected - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_BACKUP_COLLECTED, TRUE, /*goto*/ 0x2c) - endloop(0x04) - - // Wait 2 seconds - label(0x2c) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) - speak(CHR_P1P2, L_DEPO_063, MP3_03B7, CHANNEL_6, COLOR_09_BLUE) // "Time to leave! Let's get to the door I set up earl..." - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Agent - label(0x2c) - if_object_in_good_condition(OBJ_ESCAPEDOOR1, /*goto*/ 0x2c) - goto_next(0x0d) - - label(0x2c) - if_object_in_good_condition(OBJ_ESCAPEDOOR2, /*goto*/ 0x2c) - goto_next(0x0d) - - label(0x2c) - speak(CHR_P1P2, L_DEPO_065, SFX_81A2, CHANNEL_6, COLOR_09_BLUE) // "Stand back, Joanna. We'll create your escape route..." - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x09) - - label(0x2c) - destroy_object(OBJ_MINE1) - destroy_object(OBJ_MINE2) - restart_timer - - beginloop(0x0a) - if_timer_gt(240, /*goto*/ 0x2c) - endloop(0x0a) - - label(0x2c) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_light_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LIGHTSWITCH, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x2c) - - // Turning lights off - set_stage_flag(STAGEFLAG_LIGHTS_OFF) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LIGHTSWITCH, 0x012c, 0x0190, 0x00) - yield - set_object_image(OBJ_LIGHTSWITCH, 0, TVCMDLIST_14) - play_sound(SFX_8147, -1) - set_lights_state(0x000b, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000c, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000d, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000e, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0010, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000f, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0011, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0012, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0013, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0014, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0015, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0017, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0018, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0001, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0003, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0004, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0005, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0006, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0007, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0008, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x0009, LIGHTOP_3, 0xff, 0x06, 0x78) - set_lights_state(0x000a, LIGHTOP_3, 0xff, 0x06, 0x78) - - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_lights_state(0x000b, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000c, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000d, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000e, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0010, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000f, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0011, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0012, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0013, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0014, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0015, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0017, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0018, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0001, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0003, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0004, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0005, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0006, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0007, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0008, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x0009, LIGHTOP_1, 0x0a, 0x00, 0x00) - set_lights_state(0x000a, LIGHTOP_1, 0x0a, 0x00, 0x00) - goto_first(0x04) - - // Turning lights on - label(0x2c) - unset_stage_flag(STAGEFLAG_LIGHTS_OFF) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LIGHTSWITCH, 0x012c, 0x0190, 0x00) - yield - play_sound(SFX_8148, -1) - set_object_image(0x3d, 0, TVCMDLIST_06) - set_lights_state(0x000b, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000c, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000d, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000e, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0010, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000f, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0011, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0012, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0013, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0014, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0015, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0017, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0018, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0001, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0003, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0004, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0005, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0006, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0007, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0008, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0009, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x000a, LIGHTOP_3, 0x06, 0xff, 0x78) - - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_lights_state(0x000b, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000c, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000d, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000e, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0010, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000f, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0011, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0012, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0013, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0014, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0015, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0017, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0018, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0001, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0003, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0004, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0005, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0006, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0007, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0008, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0009, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x000a, LIGHTOP_1, 0xff, 0x00, 0x00) - endloop(0x04) - - endlist -}; - -u8 func1023_hide_nbomb_crate[] = { - if_savefile_flag_is_unset(GAMEFILEFLAG_G5_MINE, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - disable_object(OBJ_NBOMB_CRATE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Opens the laser doors in response to the stageflags changing. - */ -u8 unregistered_function[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_LASERSET1_DISABLED, FALSE, /*goto*/ 0x2c) - if_door_state(OBJ_LASER_1A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) - open_door(OBJ_LASER_1A) - open_door(OBJ_LASER_1B) - open_door(OBJ_LASER_1C) - open_door(OBJ_LASER_1D) - label(0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET2_DISABLED, FALSE, /*goto*/ 0x2c) - if_door_state(OBJ_LASER_2A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) - open_door(OBJ_LASER_2A) - open_door(OBJ_LASER_2B) - open_door(OBJ_LASER_2C) - open_door(OBJ_LASER_2D) - label(0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET3_DISABLED, FALSE, /*goto*/ 0x2c) - if_door_state(OBJ_LASER_3A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) - open_door(OBJ_LASER_3A) - open_door(OBJ_LASER_3B) - open_door(OBJ_LASER_3C) - open_door(OBJ_LASER_3D) - label(0x2c) - if_stage_flag_eq(STAGEFLAG_LASERSET4_DISABLED, FALSE, /*goto*/ 0x2c) - if_door_state(OBJ_LASER_4A, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) - open_door(OBJ_LASER_4A) - open_door(OBJ_LASER_4B) - open_door(OBJ_LASER_4C) - open_door(OBJ_LASER_4D) - label(0x2c) - endloop(0x04) - - endlist -}; - -/** - * I'm guessing co op buddies etc would get stuck in locked rooms after the - * player has passed through them. So this just unlocks the doors once they've - * been opened for the first time. - */ -u8 func1026_unlock_doors[] = { - // If Velvet and counter op don't exist, return - yield - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) - goto_next(0x04) - label(0x2c) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x0a) - - // Wait until some door is not closed (so... opening, I guess?) - beginloop(0x04) - if_door_state(0x43, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x44, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x45, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x46, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - endloop(0x04) - - // Unlock those doors - label(0x2c) - unlock_door(0x43, 0x04) - unlock_door(0x44, 0x04) - unlock_door(0x45, 0x04) - unlock_door(0x46, 0x04) - - // New set of doors - wait until not closed - beginloop(0x08) - if_door_state(0x34, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x35, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x36, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x37, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - endloop(0x08) - - // Unlock them - label(0x2c) - unlock_door(0x34, 0x04) - unlock_door(0x35, 0x04) - unlock_door(0x36, 0x04) - unlock_door(0x37, 0x04) - - // Third set of doors - beginloop(0x09) - if_door_state(0x3f, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - if_door_state(0x40, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2c) - endloop(0x09) - - label(0x2c) - unlock_door(0x3f, 0x10) - unlock_door(0x40, 0x10) - - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0410_invincible[] = { - label(0x04) - yield - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0411_hide[] = { - label(0x04) - yield - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1027_cloak1_check_one_remaining[] = { - // Wait until either cloak guard dying (in first room) - beginloop(0x04) - if_chr_deadish(CHR_CLOAK_1A, /*goto*/ 0x2c) - if_chr_deadish(CHR_CLOAK_1B, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - set_stage_flag(STAGEFLAG_CLOAK1_ONE_REMAINING) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1028_cloak2_check_one_remaining[] = { - // Count number of dead cloak guards in second room - beginloop(0x04) - set_morale(0) - if_chr_deadish(CHR_CLOAK_2A, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - add_morale(1) - label(0x06) - if_chr_deadish(CHR_CLOAK_2B, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - add_morale(1) - label(0x06) - if_chr_deadish(CHR_CLOAK_2C, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - add_morale(1) - label(0x06) - if_chr_deadish(CHR_CLOAK_2D, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - add_morale(1) - label(0x06) - if_morale_lt(3, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_CLOAK2_ONE_REMAINING) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - endloop(0x04) - - endlist -}; - -u8 func1029_set_secret_weapon_props[] = { - yield - set_object_flag3(OBJ_NBOMB_CRATE, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_CROSSBOW, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102a_8174[] = { - // Wait until some door opening - beginloop(0x08) - if_door_state(0x3f, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - set_chr_hiddenflag(0x07, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x0c, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x0d, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x0e, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x0f, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x10, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x11, CHRHFLAG_DONTSHOOTME) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102b_81bc[] = { - // Wait until some door opening - beginloop(0x08) - if_door_state(0x3f, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - set_chr_team(0x08, TEAM_ENEMY) - set_chr_team(0x09, TEAM_ENEMY) - set_chr_team(0x0a, TEAM_ENEMY) - set_chr_team(0x0b, TEAM_ENEMY) - set_chr_team(0x07, TEAM_ENEMY) - set_chr_team(0x0c, TEAM_ENEMY) - set_chr_team(0x0d, TEAM_ENEMY) - set_chr_team(0x0e, TEAM_ENEMY) - set_chr_team(0x0f, TEAM_ENEMY) - set_chr_team(0x10, TEAM_ENEMY) - set_chr_team(0x11, TEAM_ENEMY) - set_chr_team(0x12, TEAM_ENEMY) - set_chr_team(0x13, TEAM_ENEMY) - set_chr_team(0x14, TEAM_ENEMY) - set_chr_team(0x15, TEAM_ENEMY) - set_chr_team(0x16, TEAM_ENEMY) - set_chr_team(0x17, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * I suspect Rare screwed up here. I think the lightswitch guard starts off as - * an ally so that he won't respond to Jo making noise in the first cloak room. - * Then when he becomes alerted to you (such as you shooting near him) he'd - * become an enemy. - * - * However, it's checking if the alertness is less than, so this condition - * passes immediately and he becomes an enemy. This could be why he's sometimes - * left his pad by the time you leave the first room. - */ -u8 func102c_set_lightswitch_guard_team[] = { - beginloop(0x08) - if_chr_alertness_lt(99, CHR_LIGHTSWITCH_GUARD, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_chr_team(CHR_LIGHTSWITCH_GUARD, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_init_swat1, 0x0401 }, - { func0402_init_swat2, 0x0402 }, - { func0403_walk_from_meeting, 0x0403 }, - { func0404_run_from_meeting, 0x0404 }, - { func0405_cloak2_hide, 0x0405 }, - { func0406_init_type1_guard, 0x0406 }, - { func0407_init_type2_guard, 0x0407 }, - { func0408_init_cloak1_guard, 0x0408 }, - { func0409_start_path00, 0x0409 }, - { func040a_start_path01, 0x040a }, - { func040b_start_path02, 0x040b }, - { func040c_start_path03, 0x040c }, - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_set_ai, 0x1002 }, - { func1003_laser_switch_1, 0x1003 }, - { func1004_laser_switch_2, 0x1004 }, - { func1005_laser_switch_3, 0x1005 }, - { func1006_laser_switch_4, 0x1006 }, - { func1007_init_lasers, 0x1007 }, - { func1008_check_generator, 0x1008 }, - { func1009_spawner_during_decode, 0x1009 }, - { func100a_give_keycards, 0x100a }, - { func100b_check_backup_collected, 0x100b }, - { func100c_check_for_meeting_trigger, 0x100c }, - { func100e_check_conspirators_alerted, 0x100e }, - { func100f_alarm_switches, 0x100f }, - { func1010_safe_cracking, 0x1010 }, - { func1012_check_for_end, 0x1012 }, - { func1013_check_escape_doors, 0x1013 }, - { func1014_check_camspy_location, 0x1014 }, - { func1017_check_lasers_closed, 0x1017 }, - { func1018_intro_from_menu, 0x1018 }, - { func1019_generator_hum, 0x1019 }, - { func101a_init_laser_switch_guards, 0x101a }, - { func101b_cloak2_entry, 0x101b }, - { func101c_check_visited_top_door, 0x101c }, - { func101d_init_mines, 0x101d }, - { func101e_msg_nowaythrough, 0x101e }, - { func101f_msg_meetingroomahead, 0x101f }, - { func1020_msg_heavilyencrypted, 0x1020 }, - { func1021_blow_mines, 0x1021 }, - { func1022_light_switch, 0x1022 }, - { func1023_hide_nbomb_crate, 0x1023 }, - { func1026_unlock_doors, 0x1026 }, - { func1027_cloak1_check_one_remaining, 0x1027 }, - { func1028_cloak2_check_one_remaining, 0x1028 }, - { func1029_set_secret_weapon_props, 0x1029 }, - { func102a_8174, 0x102a }, - { func102b_81bc, 0x102b }, - { func102c_set_lightswitch_guard_team, 0x102c }, - { func040d_intro, 0x040d }, - { func040e_meeting_cutscene, 0x040e }, - { func040f_outro, 0x040f }, - { func0410_invincible, 0x0410 }, - { func0411_hide, 0x0411 }, - { func0412_cloak_guard, 0x0412 }, - { func0413_cloak1_guard, 0x0413 }, - { func0414_init_cloak2_guard, 0x0414 }, - { func1018_intro_from_menu, 0x0c00 }, - { func040e_meeting_cutscene, 0x0c01 }, - { func040f_outro_from_menu, 0x0c02 }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, PATHFLAG_CIRCULAR }, { path01, 1, PATHFLAG_CIRCULAR }, diff --git a/src/setups/setupdest.c b/src/setups/setupdest.c index 8d98f48a9..ca5b7d1da 100644 --- a/src/setups/setupdest.c +++ b/src/setups/setupdest.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupdish.c b/src/setups/setupdish.c index 42079f3d0..9a73182dc 100644 --- a/src/setups/setupdish.c +++ b/src/setups/setupdish.c @@ -106,7 +106,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -557,5360 +557,6 @@ u32 props[] = { endprops }; -/** - * Wait until seeing player (without cloak) then assign colleague. - */ -u8 func041d_init_collegue_when_sighted[] = { - restart_timer - - beginloop(0x04) - if_can_see_target(/*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - - label(0x2f) - goto_first(0x04) - - endlist -}; - -u8 func041e_colleague[] = { - set_returnlist(CHR_SELF, AILIST_COLLEAGUE) - if_alertness(1, OPERATOR_LESS_THAN, /*goto*/ 0x04) - if_alertness(2, OPERATOR_LESS_THAN, /*goto*/ 0x7c) - if_alertness(3, OPERATOR_LESS_THAN, /*goto*/ 0x7d) - - beginloop(0x04) - // Wait until player in sight and not doing idle animations already - if_target_in_sight(/*goto*/ 0x2f) - if_chr_idle(/*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f) - chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - reloop(0x04) - - // Player not in sight - 2 in 255 chance of doing a bored animation - label(0x7f) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) - label(0x06) - reloop(0x04) - - // Player is in sight - prepare to talk - label(0x2f) - restart_timer - label(0x08) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x06) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) - do_preset_animation(PRESETANIM_TALK3) - goto_next(0x2f) - - label(0x7f) - chr_do_animation(ANIM_SITTING_0265, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - label(0x2f) - play_cistaff_quip(CIQUIP_GREETING, CHANNEL_6) - restart_timer - - beginloop(0x57) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - if_morale_lt(6, /*goto*/ 0x06) - goto_next(0x7e) - - label(0x06) - restart_timer - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x59) - - beginloop(0x59) - if_target_in_sight(/*goto*/ 0x06) - endloop(0x59) - - label(0x06) - if_timer_gt(120, /*goto*/ 0x06) - goto_first(0x59) - - label(0x06) - if_within_targets_fovx_by_angle(20, /*goto*/ 0x06) - goto_first(0x59) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - label(0x06) - play_cistaff_quip(CIQUIP_MAIN, CHANNEL_6) - restart_timer - - beginloop(0x5b) - if_sound_finished(CHANNEL_6, /*goto*/ 0x7e) - endloop(0x5b) - - label(0x7e) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) - stop_chr - label(0x7f) - set_alertness(1) - label(0x7c) - restart_timer - - beginloop(0x0a) - if_timer_lt(600, /*goto*/ 0x2f) - if_target_in_sight(/*goto*/ 0x06) - goto_next(0x2f) - - label(0x06) - if_within_targets_fovx_by_angle(20, /*goto*/ 0x30) - label(0x2f) - if_chr_idle(/*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f) - set_ailist(CHR_SELF, GAILIST_DO_SITTING_ANIMATION) - reloop(0x04) - - label(0x7f) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) - label(0x06) - endloop(0x0a) - - label(0x30) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) - do_preset_animation(PRESETANIM_TALKRANDOM) - goto_next(0x06) - - label(0x7f) - chr_do_animation(ANIM_SITTING_0265, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - label(0x06) - play_cistaff_quip(CIQUIP_ANNOYED, CHANNEL_6) - restart_timer - - beginloop(0x5c) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x5c) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x7f) - stop_chr - label(0x7f) - set_alertness(2) - label(0x7d) - yield - if_chr_idle(/*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, FALSE, BANK_1, /*goto*/ 0x7f) - set_ailist(CHR_SELF, GAILIST_DO_SITTING_ANIMATION) - endloop(0x04) - - label(0x7f) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) - - label(0x06) - goto_first(0x7d) - - endlist -}; - -u8 func041f_colleague1[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(0) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0420_colleague2[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(1) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0421_colleague3[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(2) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0422_colleague4[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(3) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0423_colleague5[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(4) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0424_colleague6[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(5) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0425_colleague7[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(6) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0426_colleague8[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(7) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0427_colleague9[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(8) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func0428_colleague10[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_morale(9) - set_ailist(CHR_SELF, AILIST_COLLEAGUE) - endlist -}; - -u8 func1001_set_jo_team[] = { - yield - set_chr_team(CHR_BOND, TEAM_32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_devicetraining_camspy[] = { - label(0x80) - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CAMSPY, TRUE, /*goto*/ 0x81) - endloop(0x0f) - - label(0x81) - disable_object(0x0e) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(OBJ_CAMSPY) - move_object_to_pad(OBJ_CAMSPY, PAD_DISH_011D) - unset_object_flag(OBJ_CAMSPY, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_CAMSPY, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - yield - enable_object(0x0e) - - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_020) // "Collect CamSpy from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, OBJ_CAMSPY, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_chr_weapon_equipped(CHR_BOND, WEAPON_EYESPY, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_057) // "Select the CamSpy. - Hold A Button. - Use Control Stick to change selection. - Highlight CamSpy and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_player_using_device(CHR_BOND, WEAPON_EYESPY, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_021) // "Locate Info Room PC and holograph it." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_training_pc_holographed(/*goto*/ 0x09) - endloop(0x82) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_022) // "Info Room PC successfully holographed." - restart_timer - - beginloop(0x0c) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0c) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - set_savefile_flag(GAMEFILEFLAG_CI_CAMSPY_DONE) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) - remove_hudmsgs - disable_object(OBJ_CAMSPY) - goto_first(0x0f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_devicetraining_nightvision[] = { - label(0x80) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_lights_state(0x0030, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x002e, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x002f, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0020, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0024, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0025, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0026, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0022, LIGHTOP_1, 0x00, 0x00, 0x00) - set_stage_flag(STAGEFLAG_IN_TRAINING) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x27) - move_object_to_pad(0x27, PAD_DISH_011D) - unset_object_flag(0x27, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x27, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_008) // "Collect Night Vision from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x27, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_chr_weapon_equipped(CHR_BOND, WEAPON_NIGHTVISION, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_058) // "Select the Night Vision. - Hold A Button. - Use Control Stick to change selection. - Highlight Night Vision and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_player_using_device(CHR_BOND, WEAPON_NIGHTVISION, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_009) // "Activate the Night Vision. Locate the light switch. Turn the lights back on." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) -#if VERSION >= VERSION_NTSC_1_0 - play_sound(SFX_PRESS_SWITCH, -1) - set_lights_state(0x0030, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x002e, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x002f, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0020, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0024, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0025, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0026, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0022, LIGHTOP_1, 0xff, 0x00, 0x00) -#endif - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_023) // "Lights have been reactivated." - restart_timer - - beginloop(0x0d) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0d) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_NIGHTVISION_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - set_lights_state(0x0030, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x002e, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x002f, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0020, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0024, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0025, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0026, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0022, LIGHTOP_1, 0xff, 0x00, 0x00) - yield - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x27) - - beginloop(0x59) - if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, FALSE, /*goto*/ 0x2f) - endloop(0x59) - - label(0x2f) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_devicetraining_doordecoder[] = { - label(0x80) - - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DOORDECODER, TRUE, /*goto*/ 0x81) - endloop(0x0f) - - label(0x81) - set_object_flag2(0x88, OBJFLAG2_INVISIBLE) - set_stage_flag(STAGEFLAG_IN_TRAINING) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x28) - move_object_to_pad(0x28, PAD_DISH_011D) - unset_object_flag(0x28, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x28, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_024) // "Collect Door Decoder from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x28, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_chr_weapon_equipped(CHR_BOND, WEAPON_DOORDECODER, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_059) // "Select the Door Decoder. - Hold A Button. - Use Control Stick to change selection. - Highlight Door Decoder and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_weapon_equipped(CHR_BOND, WEAPON_DOORDECODER, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - if_chr_activated_object(CHR_BOND, 0x35, /*goto*/ 0x2f) - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_025) // "Use Decoder on door pad to unlock it." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_chr_activated_object(CHR_BOND, 0x35, /*goto*/ 0x09) - endloop(0x82) - - label(0x09) - if_chr_weapon_equipped(CHR_BOND, WEAPON_DOORDECODER, /*goto*/ 0x06) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_026) // "You need to be holding the Door Decoder." - restart_timer - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(60, /*goto*/ 0x2f) - endloop(0x0e) - - label(0x2f) - goto_first(0x82) - - label(0x06) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_027) // "Decoder attached. Initiating cracking routines..." - unset_object_flag2(0x88, OBJFLAG2_INVISIBLE) - assign_sound(SFX_8144, CHANNEL_1) - play_sound_from_object(CHANNEL_1, 0x35, 1, 300, 400) - restart_timer - - beginloop(0x0c) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x2f) - endloop(0x0c) - - label(0x2f) - mute_channel(CHANNEL_1) - assign_sound(SFX_8145, CHANNEL_1) - control_sound_from_object(CHANNEL_1, 0x35, TRUE) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_028) // "Decoding complete. Door has been unlocked." - unlock_door(0x41, 0x40) - restart_timer - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0d) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_DOORDECODER_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - unset_object_flag2(0x88, OBJFLAG2_INVISIBLE) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - mute_channel(CHANNEL_1) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x28) - goto_first(0x0f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_devicetraining_xray[] = { - label(0x80) - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_XRAY, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x29) - move_object_to_pad(0x29, PAD_DISH_011D) - unset_object_flag(0x29, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x29, OBJFLAG2_INVISIBLE) - unset_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_035) // "Collect X-Ray Scanner from table to begin." - restart_timer - - beginloop(0x86) - if_player_using_device(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) - set_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) - goto_next(0x30) - - label(0x2f) - unset_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) - unset_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) - label(0x30) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x29, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x8d) - remove_hudmsgs - if_chr_weapon_equipped(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_060) // "Select the X-Ray Scanner. - Hold A Button. - Use Control Stick to change selection. - Highlight X-Ray Scanner and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_player_using_device(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_036) // "Find hidden switches to shut down laser grid." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_player_using_device(CHR_BOND, WEAPON_XRAYSCANNER, /*goto*/ 0x2f) - set_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) - goto_next(0x30) - - label(0x2f) - unset_object_flag(0x38, OBJFLAG_CANNOT_ACTIVATE) - unset_object_flag(0x39, OBJFLAG_CANNOT_ACTIVATE) - label(0x30) - if_chr_activated_object(CHR_BOND, 0x38, /*goto*/ 0x5b) - if_chr_activated_object(CHR_BOND, 0x39, /*goto*/ 0x5c) - endloop(0x82) - - label(0x5b) - if_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x87) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_041) // "Laser Grid 1 has been deactivated." - set_object_image(0x38, 0, TVCMDLIST_12) - set_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI) - open_door(0x3a) - label(0x87) - restart_timer - - beginloop(0x89) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x85) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x85) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x85) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x89) - - label(0x5c) - if_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x88) - set_object_image(0x39, 0, TVCMDLIST_12) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_042) // "Laser Grid 2 has been deactivated." - set_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI) - open_door(0x3b) - label(0x88) - restart_timer - - beginloop(0x8a) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x8a) - - label(0x8b) - disable_object(0x3a) - goto_next(0x06) - - label(0x07) - disable_object(0x3b) - goto_next(0x06) - - label(0x06) - if_object_flag2(0x38, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_first(0x82) - - label(0x2f) - if_object_flag2(0x39, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_first(0x82) - - label(0x09) - restart_timer - - beginloop(0x5b) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x5b) - - label(0x2f) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_037) // "All laser grids have been deactivated." - restart_timer - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0e) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_XRAY_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x29) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_devicetraining_disguise[] = { - label(0x80) - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - unset_stage_flag(STAGEFLAG_DISGUISE_FAILED) - unset_stage_flag(STAGEFLAG_DISGUISE_COMPLETE) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x2a) - move_object_to_pad(0x2a, PAD_DISH_011D) - unset_object_flag(0x2a, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x2a, OBJFLAG2_INVISIBLE) - set_ailist(0x03, AILIST_GRIMSHAW_DISGUISE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_038) // "Collect Disguise from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DISGUISE_FAILED, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x2a, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_061) // "Select the Disguise. - Hold A Button. - Use Control Stick to change selection. - Highlight Disguise and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DISGUISE_FAILED, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_039) // "Fool someone into giving you Cloaking Device." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_DISGUISE_COMPLETE, TRUE, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_DISGUISE_FAILED, TRUE, /*goto*/ 0x0a) - endloop(0x82) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_040) // "Cloaking Device successfully retrieved." - restart_timer - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0e) - - label(0x0a) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_047) // "You're meant to use the Disguise, remember?" - restart_timer - - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - label(0x59) - if_timer_gt(240, /*goto*/ 0x85) - endloop(0x0f) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_DISGUISE_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x2a) - - beginloop(0x6d) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, FALSE, /*goto*/ 0x2f) - endloop(0x6d) - - label(0x2f) - set_ailist(0x03, AILIST_INIT_COLLEAGUE_WHEN_SIGHTED) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_devicetrainign_ir[] = { - label(0x80) - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - if_chr_activated_object(CHR_BOND, 0x37, /*goto*/ 0x2f) - label(0x2f) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x2b) - move_object_to_pad(0x2b, PAD_DISH_011D) - unset_object_flag(0x2b, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x2b, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_032) // "Collect IR Scanner from table to begin." - restart_timer - - beginloop(0x86) - if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) - set_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) - goto_next(0x30) - label(0x2f) - unset_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) - label(0x30) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x2b, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_062) // "Select the IR Scanner. - Hold A Button. - Use Control Stick to change selection. - Highlight IR Scanner and release A Button." - restart_timer - - beginloop(0x8e) - if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) - set_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) - goto_next(0x30) - - label(0x2f) - unset_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) - label(0x30) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_033) // "Locate secret door using IR Scanner." - - beginloop(0x82) - if_player_using_device(CHR_BOND, WEAPON_IRSCANNER, /*goto*/ 0x2f) - set_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) - goto_next(0x30) - label(0x2f) - unset_object_flag(0x37, OBJFLAG_CANNOT_ACTIVATE) - label(0x30) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_chr_activated_object(CHR_BOND, 0x37, /*goto*/ 0x09) - endloop(0x82) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_034) // "Secret door has been successfully located." - restart_timer - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0e) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_IR_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x2b) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_devicetraining_rtracker[] = { - label(0x80) - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_RTRACKER, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x2c) - move_object_to_pad(0x2c, PAD_DISH_011D) - unset_object_flag(0x2c, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x2c, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_029) // "Collect Tracker from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x2c, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_player_using_device(CHR_BOND, WEAPON_RTRACKER, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_063) // "Select the Tracker. - Hold A Button. - Use Control Stick to change selection. - Highlight Tracker and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_player_using_device(CHR_BOND, WEAPON_RTRACKER, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - unset_object_flag(0x36, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x36, OBJFLAG2_INVISIBLE) - enable_object(0x36) - move_object_to_pad(0x36, PAD_DISH_011E) - set_object_flag3(0x36, OBJFLAG3_RTRACKED_YELLOW) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_030) // "Locate IR Scanner using Tracker." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_chr_has_object(CHR_BOND, 0x36, /*goto*/ 0x09) - endloop(0x82) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_031) // "IR Scanner has been successfully located." - restart_timer - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0e) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_RTRACKER_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x2c) - disable_object(0x36) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_devicetraining_cloak[] = { - label(0x80) - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - deactivate_alarm - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - restart_timer - enable_object(0x2d) - move_object_to_pad(0x2d, PAD_DISH_011D) - unset_stage_flag(STAGEFLAG_CLOAK_FAILED) - unset_stage_flag(STAGEFLAG_CLOAK_COMPLETE) - unset_object_flag(0x2d, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x2d, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_051) // "Collect Cloaking Device from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_CLOAK_COMPLETE, TRUE, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x0a) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x2d, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - set_ailist(CHR_CARRINGTON, AILIST_CARRINGTON_CLOAK) - label(0x8d) - remove_hudmsgs - if_player_using_device(CHR_BOND, WEAPON_CLOAKINGDEVICE, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_064) // "Select the Cloaking Device. - Hold A Button. - Use Control Stick to change selection. - Highlight Device and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_CLOAK_COMPLETE, TRUE, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_player_using_device(CHR_BOND, WEAPON_CLOAKINGDEVICE, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_052) // "Use Cloaking Device and locate Carrington." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_door_state(0x31, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x8a, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_door_state(0x89, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_CLOAK_COMPLETE, TRUE, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x0a) - endloop(0x82) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_054) // "Mission complete - Device Training passed!" - restart_timer - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0e) - - label(0x0a) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_055) // "Mission failed - you have been detected." - restart_timer - - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x85) - endloop(0x0f) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_CLOAK_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x2d) - - beginloop(0x5c) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x2f) - endloop(0x5c) - - label(0x2f) - set_ailist(CHR_CARRINGTON, AILIST_INIT_COLLEAGUE_WHEN_SIGHTED) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_devicetraining_ecmmine[] = { - label(0x80) - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_ECMMINE, TRUE, /*goto*/ 0x81) - endloop(0x0f) - - label(0x81) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - enable_object(0x2e) - move_object_to_pad(0x2e, PAD_DISH_011D) - unset_object_flag(0x2e, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x2e, OBJFLAG2_INVISIBLE) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_016) // "Collect ECM Mine from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x2e, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_chr_weapon_equipped(CHR_BOND, WEAPON_ECMMINE, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_065) // "Select the ECM Mine. - Hold A Button. - Use Control Stick to change selection. - Highlight ECM Mine and release A Button." - restart_timer - - beginloop(0x8e) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_weapon_equipped(CHR_BOND, WEAPON_ECMMINE, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_017) // "Locate Hub and throw ECM Mine onto Hub." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_ECM_MINE, 1, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - yield - yield - yield - yield - yield - if_weapon_thrown(WEAPON_ECMMINE, /*goto*/ 0x06) - goto_first(0x82) - - label(0x06) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_weapon_thrown_on_object(WEAPON_ECMMINE, 0x32, /*goto*/ 0x09) - if_timer_gt(120, /*goto*/ 0x0a) - endloop(0x08) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_019) // "ECM Mine has been placed correctly." - restart_timer - - beginloop(0x0c) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_timer_gt(240, /*goto*/ 0x83) - endloop(0x0c) - - label(0x0a) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_018) // "ECM Mine has been placed incorrectly." - restart_timer - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_timer_gt(240, /*goto*/ 0x85) - endloop(0x0d) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_ECMMINE_DONE) - yield - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - disable_object(0x2e) - goto_first(0x0f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_devicetraining_uplink[] = { - label(0x80) - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_UPLINK, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - lock_door(0x31, 0x40) - lock_door(0x8a, 0x40) - lock_door(0x89, 0x40) - unset_stage_flag(STAGEFLAG_DEVICE_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - enable_object(0x2f) - move_object_to_pad(0x2f, PAD_DISH_0131) - unset_object_flag(0x2f, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(0x2f, OBJFLAG2_INVISIBLE) - close_door(0x31) - close_door(0x8a) - close_door(0x89) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x8c) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x8c) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x8c) - label(0x8c) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_010) // "Collect Data Uplink from table to begin." - restart_timer - - beginloop(0x86) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_chr_has_object(CHR_BOND, 0x2f, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x86) - - label(0x06) - goto_first(0x8c) - - label(0x2f) - label(0x8d) - remove_hudmsgs - if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_056) // "Select the Uplink. - Hold A Button. - Use Control Stick to change selection. - Highlight Data Uplink and release A Button." - restart_timer - - beginloop(0x8e) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x8e) - - label(0x06) - goto_first(0x8d) - - label(0x2f) - if_chr_activated_object(CHR_BOND, 0x30, /*goto*/ 0x2f) - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_011) // "Stand next to the terminal and use the Uplink." - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x30, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - endloop(0x82) - - label(0x2f) - if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - play_sound(SFX_8116, -1) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_012) // "You need to be holding the Data Uplink." - goto_first(0x82) - - label(0x2f) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_013) // "Connection established..." - restart_timer - - label(0x08) - yield - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - assign_sound(SFX_01BF, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x30, TRUE) - label(0x14) - yield - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(400, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_BOND, 400, PAD_DISH_0227, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_BOND, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - goto_first(0x09) - - label(0x2f) - goto_first(0x14) - - label(0x06) - restart_timer - mute_channel(CHANNEL_5) - assign_sound(SFX_01C1, CHANNEL_7) - control_sound_from_object(CHANNEL_7, 0x30, TRUE) - remove_hudmsgs - show_hudmsg(CHR_TARGET, L_DISH_014) // "Terminal has been successfully hacked." - - beginloop(0x15) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x15) - - label(0x06) - goto_next(0x83) - - label(0x09) - remove_hudmsgs - show_hudmsg(CHR_BOND, L_DISH_015) // "Connection broken - too far from PC." - mute_channel(CHANNEL_5) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, 0x30, TRUE) - restart_timer - - beginloop(0x16) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x90) - if_chr_activated_object(CHR_BOND, 0x31, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x8a, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x89, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x16) - - label(0x06) - mute_channel(CHANNEL_6) - goto_first(0x82) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_UPLINK_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) - unlock_door(0x31, 0x40) - unlock_door(0x8a, 0x40) - unlock_door(0x89, 0x40) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - disable_object(0x2f) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_move_jo_to_training_room[] = { - // Wait for flag to be set while not in training - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, TRUE, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) -#if VERSION >= VERSION_NTSC_1_0 - if_stage_flag_eq(STAGEFLAG_TRIGGER_UPLINK, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_ECMMINE, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CAMSPY, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DOORDECODER, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_RTRACKER, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_XRAY, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - reloop(0x04) - - label(0x06) -#endif - unset_stage_flag(STAGEFLAG_CONSIDER_WARP) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x2f) - goto_next(0x30) - - // In room - label(0x2f) - endloop(0x04) - - // Not in room - label(0x30) - revoke_control(CHR_BOND, 0) - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 5000) - restart_timer - - beginloop(0x08) - if_timer_gt(30, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x0016, /*goto*/ 0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x0017, /*goto*/ 0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x0018, /*goto*/ 0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x0019, /*goto*/ 0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x0014, /*goto*/ 0x2f) - enter_camera_and_move_to_pad(PAD_DISH_0151) - set_ailist(CHR_P1P2, AILIST_MOVE_TO_DEVICEROOM) - goto_next(0x06) - - label(0x2f) - enter_camera_and_move_to_pad(PAD_DISH_020A) - set_ailist(CHR_P1P2, AILIST_MOVE_TO_HOLOROOM) - - label(0x06) - yield - yield - yield - yield - enter_firstperson - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - restart_timer - - beginloop(0x09) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - grant_control(CHR_BOND) - enter_firstperson - unset_stage_flag(STAGEFLAG_CONSIDER_WARP) - goto_first(0x04) - - endlist -}; - -u8 func0401_move_to_deviceroom[] = { - chr_move_to_pad(CHR_SELF, PAD_DEVICEROOM, 0x01, /*goto*/ 0x06) - label(0x06) - stop_chr - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_move_to_holoroom[] = { - chr_move_to_pad(CHR_SELF, PAD_HOLOROOM, 0x01, /*goto*/ 0x06) - label(0x06) - stop_chr - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0429_grimshaw_disguise[] = { - set_returnlist(CHR_SELF, AILIST_GRIMSHAW_DISGUISE) - restart_timer - - beginloop(0x0f) - if_timer_gt(60, /*goto*/ 0x8f) - endloop(0x0f) - - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, FALSE, /*goto*/ 0x04) - endloop(0x8f) - - // Wait until Jo in sight - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_target_in_sight(/*goto*/ 0x2f) - if_chr_idle(/*goto*/ 0x06) - label(0x7f) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) - label(0x06) - endloop(0x04) - - label(0x2f) - restart_timer - label(0x08) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x06) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - do_preset_animation(PRESETANIM_TALK3) - play_cistaff_quip(CIQUIP_GREETING, CHANNEL_6) - restart_timer - - beginloop(0x57) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - restart_timer - - beginloop(0x58) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x58) - - label(0x06) - speak(CHR_BOND, L_DISH_043, MP3_0517, CHANNEL_6, COLOR_09_BLUE) // "I'm here to pick up the equipment." - - beginloop(0x59) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x59) - - label(0x06) - restart_timer - - beginloop(0x5b) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x5b) - - label(0x06) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ 0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_044, MP3_0518, CHANNEL_6, COLOR_05_GREEN) // "Go away, Joanna. You're not fooling anybody!" - - beginloop(0x5c) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x5c) - - label(0x06) - set_stage_flag(STAGEFLAG_DISGUISE_FAILED) - goto_next(0x0d) - - label(0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_045, MP3_0519, CHANNEL_6, COLOR_05_GREEN) // "Here you go. Don't drop it now." - - beginloop(0x5d) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x0d) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x5d) - - label(0x06) - give_object_to_chr(0x3c, CHR_BOND) - set_stage_flag(STAGEFLAG_DISGUISE_COMPLETE) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_cloak_detection[] = { - beginloop(0x04) - deactivate_alarm - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x8f) - reloop(0x04) - - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x5d) - if_chr_distance_to_pad_lt(CHR_BOND, 200, PAD_DISH_027B, /*goto*/ 0x06) - endloop(0x8f) - - beginloop(0x5d) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) - endloop(0x5d) - - label(0x30) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - endloop(0x04) - - label(0x06) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_CLOAKED, /*goto*/ 0x30) - activate_alarm - yield - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x59) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - speak(CHR_TARGET, L_DISH_048, MP3_051A, CHANNEL_6, COLOR_05_GREEN) // "You'll have to do better than that, Joanna." - show_hudmsg(CHR_BOND, L_DISH_050) // "You have been detected by the camera." - restart_timer - - beginloop(0x0a) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_stage_flag(STAGEFLAG_CLOAK_FAILED) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) - if_timer_gt(120, /*goto*/ 0x59) - endloop(0x08) - - label(0x59) - deactivate_alarm - - beginloop(0x5a) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, FALSE, /*goto*/ 0x30) - endloop(0x5a) - - label(0x30) - deactivate_alarm - restart_timer - - beginloop(0x5c) - yield - if_timer_gt(60, /*goto*/ 0x2f) - endloop(0x5c) - - label(0x2f) - goto_first(0x04) - - label(0x06) - goto_first(0x8f) - - endlist -}; - -u8 func042a_carrington_cloak[] = { - set_returnlist(CHR_SELF, AILIST_CARRINGTON_CLOAK) - - beginloop(0x8f) - chr_move_to_pad(CHR_SELF, PAD_CARRINGTON_OFFICE, 0x01, /*goto*/ 0x06) - endloop(0x8f) - - label(0x06) - - beginloop(0x04) - if_target_in_sight(/*goto*/ 0x2f) - if_chr_idle(/*goto*/ 0x06) - label(0x7f) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) - - label(0x06) - endloop(0x04) - - label(0x2f) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - close_door(0x40) - restart_timer - label(0x08) - if_self_flag_bankx_eq(CHRFLAG1_DOINGIDLEANIMATION, TRUE, BANK_1, /*goto*/ 0x06) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - restart_timer - chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - restart_timer - - beginloop(0x57) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_BOND, L_DISH_049, MP3_051B, CHANNEL_6, COLOR_06_WHITE) // "Joanna, where did you spring from?" - - beginloop(0x59) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x59) - - label(0x06) - restart_timer - - beginloop(0x5b) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x5b) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_053, MP3_051C, CHANNEL_6, COLOR_06_WHITE) // "I think we can safely say your training is now complete!" - - beginloop(0x5c) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x5c) - - label(0x06) - stop_chr - set_stage_flag(STAGEFLAG_CLOAK_COMPLETE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_training_unlockables[] = { - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_UPLINK_DONE, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - unlock_door(0x3e, 0x40) - - beginloop(0x08) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_ECMMINE_DONE, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - unlock_door(0x3d, 0x40) - unlock_door(0x3f, 0x40) - goto_next(0x2f) - - beginloop(0x09) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_CAMSPY_DONE, /*goto*/ 0x2f) - endloop(0x09) - - label(0x2f) - unset_object_flag2(OBJ_LIGHTSWITCH, OBJFLAG2_INVISIBLE) - - beginloop(0x0a) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_NIGHTVISION_DONE, /*goto*/ 0x2f) - endloop(0x0a) - - label(0x2f) - set_lights_state(0x0030, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x002e, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x002f, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0020, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0024, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0025, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0026, LIGHTOP_1, 0xff, 0x00, 0x00) - set_lights_state(0x0022, LIGHTOP_1, 0xff, 0x00, 0x00) - - beginloop(0x0b) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_DOORDECODER_DONE, /*goto*/ 0x2f) - endloop(0x0b) - - label(0x2f) - unlock_door(0x41, 0x40) - - beginloop(0x0e) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_IR_DONE, /*goto*/ 0x2f) - endloop(0x0e) - - label(0x2f) - unlock_door(0x37, 0x40) - - beginloop(0x0f) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_XRAY_DONE, /*goto*/ 0x2f) - endloop(0x0f) - - label(0x2f) - disable_object(0x3a) - disable_object(0x3b) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define do_door_proxy(eepromflag, pad, door) \ - /* If training flag is done, open/close a door automatically as Jo nears it */ \ - beginloop(0x04) \ - if_savefile_flag_is_set(eepromflag, /*goto*/ 0x2f) \ - reloop(0x04) \ - \ - label(0x2f) \ - if_chr_distance_to_pad_lt(CHR_BOND, 350, pad, /*goto*/ 0x06) \ - close_door(door) \ - reloop(0x04) \ - \ - label(0x06) \ - if_door_state(door, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2f) \ - open_door(door) \ - set_object_flag(door, OBJFLAG_DOOR_KEEPOPEN) \ - restart_timer \ - \ - beginloop(0x08) \ - if_timer_gt(120, /*goto*/ 0x2f) \ - endloop(0x08) \ - \ - label(0x2f) \ - endloop(0x04) - -u8 func100f_doorproxy_unused1[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - do_door_proxy(GAMEFILEFLAG_CI_ECMMINE_DONE, 0x0185, 0x3d) - endlist -}; - -u8 func1010_doorproxy[] = { - do_door_proxy(GAMEFILEFLAG_CI_UPLINK_DONE, 0x0186, 0x3e) - endlist -}; - -u8 func1010_doorproxy_unused2[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - do_door_proxy(GAMEFILEFLAG_CI_ECMMINE_DONE, 0x0187, 0x3f) - endlist -}; - -u8 func1012_cloak_doorproxy[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_CLOAK_FAILED, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_DEVICE_ABORTING, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DEVICE_SUCCESS, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DEVICE_FAILURE, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 350, PAD_DISH_0188, /*goto*/ 0x06) - close_door(0x40) - label(0x2f) - endloop(0x04) - - label(0x06) - if_door_state(0x40, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2f) - open_door(0x40) - set_object_flag(0x40, OBJFLAG_DOOR_KEEPOPEN) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - goto_first(0x04) - - endlist -}; - -#if VERSION >= VERSION_NTSC_1_0 -u8 func101b_ir_door[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x06) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_IR_DONE, /*goto*/ 0x2f) - label(0x06) - reloop(0x04) - - label(0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 350, PAD_DISH_0192, /*goto*/ 0x06) - close_door(0x37) - endloop(0x04) - - label(0x06) - if_door_state(0x37, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2f) - open_door(0x37) - set_object_flag(0x37, OBJFLAG_DOOR_KEEPOPEN) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - goto_first(0x04) - - endlist -}; -#endif - -u8 func042b_init_carrington[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - yield - set_morale(0) - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) -#if VERSION >= VERSION_NTSC_1_0 - set_savefile_flag(GAMEFILEFLAG_CI_TOUR_DONE) -#endif - - beginloop(0x08) - chr_move_to_pad(CHR_SELF, PAD_CARRINGTON_OFFICE, 0x01, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_ailist(CHR_SELF, 0x041e) - - label(0x06) - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_DONE, /*goto*/ 0x8f) - goto_first(0x08) - - beginloop(0x8f) - chr_move_to_pad(CHR_SELF, PAD_OUTSIDE_JO_OFFICE, 0x01, /*goto*/ 0x2f) - endloop(0x8f) - - label(0x2f) - stop_chr - set_ailist(CHR_SELF, AILIST_CARRINGTON_TOUR) - endlist -}; - -u8 func1019_setup_carrington[] = { - beginloop(0x04) - if_chr_has_hiddenflag(CHR_CARRINGTON, CHRHFLAG_INFINITESHIELD, /*goto*/ 0x06) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x2f) - endloop(0x04) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2f) - set_ailist(CHR_CARRINGTON, AILIST_INIT_CARRINGTON) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042c_carrington_tour[] = { - set_returnlist(CHR_SELF, AILIST_CARRINGTON_TOUR) - set_self_chrflag(CHRCFLAG_00040000) - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, 0x0054, /*goto*/ 0x04) - - beginloop(0x04) - if_timer_gt(1200, /*goto*/ 0x2f) - if_can_see_target(/*goto*/ 0x2f) - if_chr_idle(/*goto*/ 0x06) - label(0x7f) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_DO_BORED_ANIMATION) - - label(0x06) - endloop(0x04) - - label(0x2f) - if_can_see_target(/*goto*/ 0x06) - try_jog_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_can_see_target(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) - set_savefile_flag(GAMEFILEFLAG_CI_TOUR_STARTED) - do_preset_animation(PRESETANIM_TALKRANDOM) - remove_hudmsgs - speak(CHR_TARGET, L_DISH_066, SFX_8029, CHANNEL_6, COLOR_06_WHITE) // "Joanna, it's good to see you." - restart_timer - - beginloop(0x57) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_067, MP3_051D, CHANNEL_6, COLOR_06_WHITE) // "Come with me. I'll walk you round the training rooms." - restart_timer - - beginloop(0x59) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x59) - - label(0x06) - walk_to_pad(PAD_DISH_0064) - - beginloop(0x5b) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x5b) - - label(0x06) - stop_chr - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, 0x0068, /*goto*/ 0x5c) - - beginloop(0x5c) - if_timer_lt(60, /*goto*/ 0x06) - if_can_see_target(/*goto*/ 0x2f) - label(0x06) - endloop(0x5c) - - label(0x2f) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - goto_first(0x5c) - - label(0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - remove_hudmsgs - speak(CHR_TARGET, L_DISH_068, MP3_0520, CHANNEL_6, COLOR_06_WHITE) // "The information center is through this door." - restart_timer - - beginloop(0x5d) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x5d) - -#if VERSION < VERSION_NTSC_1_0 - label(0x06) - walk_to_pad(PAD_DISH_0068) - - beginloop(0x5e) - if_chr_stopped(/*goto */ 0x06) - endloop(0x5e) - - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATCHR, 0x03, /*goto*/ 0x5f) - - beginloop(0x5f) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0x5f) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - play_sound(SFX_802A, CHANNEL_6) - set_ailist(0x03, 0x042d) - restart_timer - - beginloop(0x60) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0x60) - - label(0x06) - mute_channel(CHANNEL_6) - stop_chr - yield - yield - - beginloop(0x61) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x61) -#endif - - label(0x06) - walk_to_pad(PAD_DISH_0065) - - beginloop(0x62) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x62) - - label(0x06) - stop_chr - - beginloop(0x63) - if_can_see_target(/*goto*/ 0x2f) - endloop(0x63) - - label(0x2f) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - goto_first(0x63) - - label(0x2f) -#if VERSION >= VERSION_NTSC_1_0 - set_ailist(0x01, GAILIST_IDLE) -#endif - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_069, MP3_051F, CHANNEL_6, COLOR_06_WHITE) // "In here we have the device lab." - restart_timer - - beginloop(0x64) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x64) - - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATCHR, 0x01, /*goto*/ 0x65) - - beginloop(0x65) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0x65) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - play_sound(SFX_CARR_HELLO_JOANNA, CHANNEL_6) - set_ailist(0x01, AILIST_DEVICEGIRL_REPLY_TO_CARRINGTON) - restart_timer - - beginloop(0x66) - if_timer_gt(20, /*goto*/ 0x06) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x66) - - label(0x06) - mute_channel(CHANNEL_6) - stop_chr - yield - yield - - beginloop(0x68) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x68) - - label(0x06) - walk_to_pad(PAD_DISH_0020) - - beginloop(0x69) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x69) - - label(0x06) - stop_chr - - beginloop(0x6a) - if_can_see_target(/*goto*/ 0x2f) - endloop(0x6a) - - label(0x2f) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - goto_first(0x6a) - - label(0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_070, MP3_0521, CHANNEL_6, COLOR_06_WHITE) // "This leads to the simulant training room." - restart_timer - - beginloop(0x6b) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x6b) - - label(0x06) - stop_chr - yield - yield - - beginloop(0x6c) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x6c) - - label(0x06) - walk_to_pad(PAD_DISH_0010) - - beginloop(0x6d) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x6d) - - label(0x06) - stop_chr - - beginloop(0x6e) - if_can_see_target(/*goto*/ 0x2f) - endloop(0x6e) - - label(0x2f) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - goto_first(0x6e) - - label(0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_071, MP3_051E, CHANNEL_6, COLOR_06_WHITE) // "This is the firing range, Jo." - restart_timer - - beginloop(0x6f) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x6f) - - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATCHR, 0x01, /*goto*/ 0x70) - - beginloop(0x70) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0x70) - - label(0x06) -#if VERSION < VERSION_NTSC_1_0 - set_ailist(0x01, 0x042e) -#endif - restart_timer - - beginloop(0x71) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x71) - - label(0x06) - stop_chr - yield - yield - - beginloop(0x72) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x72) - - label(0x06) - label(0x06) - walk_to_pad(PAD_DISH_0009) - - beginloop(0x73) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x73) - - label(0x06) - stop_chr - - beginloop(0x74) - if_can_see_target(/*goto*/ 0x2f) - endloop(0x74) - - label(0x2f) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - goto_first(0x74) - - label(0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_072, MP3_0522, CHANNEL_6, COLOR_06_WHITE) // "This corridor leads down to the hangar." - restart_timer - - beginloop(0x75) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x75) - - label(0x06) - restart_timer - set_target_chr(CHR_BOND) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x79) - - beginloop(0x79) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x79) - - label(0x2f) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_DISH_124, MP3_07DC, CHANNEL_6, COLOR_06_WHITE) // "Okay, Jo, I'll leave you to prepare for the mission." - - beginloop(0x7a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - endloop(0x7a) - - label(0x2f) - set_savefile_flag(GAMEFILEFLAG_CI_TOUR_DONE) - walk_to_pad(PAD_CARRINGTON_OFFICE) - - beginloop(0x76) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x76) - - label(0x06) - set_ailist(CHR_SELF, 0x041e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042d_unused[] = { - set_alertness(1) - set_self_chrflag(CHRCFLAG_00040000) - restart_timer - try_face_entity(ATTACKFLAG_AIMATCHR, CHR_CARRINGTON, /*goto*/ 0x5f) - - beginloop(0x5f) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0x5f) - - label(0x06) - - beginloop(0x60) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x60) - - label(0x06) - assign_sound(SFX_GRIMSHAW_HI_THERE, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - - beginloop(0x61) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x61) - - label(0x06) - set_ailist(CHR_SELF, 0x041e) - endlist -}; - -u8 func042e_devicegirl_reply_to_carrington[] = { - set_alertness(1) - set_self_chrflag(CHRCFLAG_00040000) - restart_timer - try_face_entity(ATTACKFLAG_AIMATCHR, CHR_CARRINGTON, /*goto*/ 0x5f) - - beginloop(0x5f) - if_timer_gt(40, /*goto*/ 0x06) - endloop(0x5f) - - label(0x06) - - beginloop(0x60) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x60) - - label(0x06) - yield - yield - yield - assign_sound(MP3_CIFEM_PATIENCE, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - - beginloop(0x61) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - endloop(0x61) - - label(0x06) - set_ailist(CHR_SELF, 0x041e) - endlist -}; - -u8 func1013_msg_hovercrate[] = { -#if VERSION >= VERSION_PAL_BETA - beginloop(0x8f) - if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_HOVERCRATE, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_HOVERCRATE, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0141, /*goto*/ 0x2f) - endloop(0x04) -#else - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0141, /*goto*/ 0x2f) - endloop(0x04) -#endif - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2f) -#if VERSION >= VERSION_PAL_BETA - set_savefile_flag(GAMEFILEFLAG_HOWTO_HOVERCRATE) -#endif - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_073) // "HOVERCRATE Press B Button next to Hovcrate to grab it..." - restart_timer - - beginloop(0x08) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_074) // "Press B Button when crate grabbed to release it." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_msg_hoverbike[] = { -#if VERSION >= VERSION_PAL_BETA - beginloop(0x8f) - if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_HOVERBIKE, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_HOVERBIKE, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_01F9, /*goto*/ 0x2f) - endloop(0x04) -#else - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_01F9, /*goto*/ 0x2f) - endloop(0x04) -#endif - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2f) -#if VERSION >= VERSION_PAL_BETA - set_savefile_flag(GAMEFILEFLAG_HOWTO_HOVERBIKE) -#endif - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_075) // "HOVERBIKE Double tap B Button next to Hovbike to ride it..." - restart_timer - - beginloop(0x08) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_076) // "Double tap B Button when on Hovbike to dismount." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_msg_doors[] = { -#if VERSION >= VERSION_PAL_BETA - beginloop(0x8f) - if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_DOORS, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_DOORS, /*goto*/ 0x06) - endloop(0x04) -#else - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) - endloop(0x04) -#endif - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2f) -#if VERSION >= VERSION_PAL_BETA - set_savefile_flag(GAMEFILEFLAG_HOWTO_DOORS) -#endif - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_077) // "OPENING DOORS Press B Button next to door to open it." - restart_timer - - beginloop(0x08) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_078) // "B Button will also activate any object nearby." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_msg_elevators[] = { -#if VERSION >= VERSION_PAL_BETA - beginloop(0x8f) - if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_ELEVATORS, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_ELEVATORS, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0160, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0162, /*goto*/ 0x2f) - endloop(0x04) -#else - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0160, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0162, /*goto*/ 0x2f) - endloop(0x04) -#endif - - label(0x2f) -#if VERSION >= VERSION_PAL_BETA - set_savefile_flag(GAMEFILEFLAG_HOWTO_ELEVATORS) -#endif - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_079) // "ELEVATORS Press B Button next to door to call elevator." - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_msg_terminals[] = { -#if VERSION >= VERSION_PAL_BETA - beginloop(0x8f) - if_savefile_flag_is_unset(GAMEFILEFLAG_HOWTO_TERMINALS, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_HOWTO_TERMINALS, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0227, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_022A, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021C, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021E, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0221, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0224, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_023E, /*goto*/ 0x2f) - endloop(0x04) -#else - if_savefile_flag_is_unset(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_savefile_flag_is_set(GAMEFILEFLAG_CI_TOUR_STARTED, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0227, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_022A, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021C, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_021E, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0221, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_0224, /*goto*/ 0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_DISH_023E, /*goto*/ 0x2f) - endloop(0x04) -#endif - - label(0x2f) -#if VERSION >= VERSION_PAL_BETA - set_savefile_flag(GAMEFILEFLAG_HOWTO_TERMINALS) -#endif - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_114) // "TERMINALS - Press B Button next to terminal to use it." - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_lightswitch[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, FALSE, /*goto*/ 0x2f) - if_player_using_device(CHR_BOND, WEAPON_NIGHTVISION, /*goto*/ 0x2f) - set_object_flag2(OBJ_LIGHTSWITCH, OBJFLAG2_INVISIBLE) - reloop(0x04) - - label(0x2f) - unset_object_flag2(OBJ_LIGHTSWITCH, OBJFLAG2_INVISIBLE) - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_holo1_main[] = { - label(0x80) - disable_object(0x48) - disable_object(0x49) - disable_object(0x4a) - disable_object(0x4b) - disable_object(0x4c) - disable_object(0x4d) - disable_object(0x4e) - disable_object(0x4f) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - restart_timer - - beginloop(0x13) - if_timer_gt(30, /*goto*/ 0x2f) - endloop(0x13) - - label(0x2f) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - enable_object(0x48) - enable_object(0x49) - enable_object(0x4a) - enable_object(0x4b) - enable_object(0x4c) - enable_object(0x4d) - enable_object(0x4e) - enable_object(0x4f) - unset_object_flag2(0x48, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x49, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x4a, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x4b, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x4d, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x4e, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI) - disable_chr(0x04) - label(0x91) - if_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x4d, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x4e, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - label(0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_100) // "Get the access codes by examining terminals. - Use the codes on the wall terminals." - goto_next(0x06) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_115) // "Now activate the red terminals on the wall." - label(0x06) - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO1_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - if_chr_in_room(CHR_BOND, 0x00, 0x001e, /*goto*/ 0x90) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - disable_object(0x48) - disable_object(0x49) - disable_object(0x4a) - disable_object(0x4b) - disable_object(0x4c) - disable_object(0x4d) - disable_object(0x4e) - disable_object(0x4f) - enable_object(0x45) - remove_hudmsgs - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define holo1_some_terminal(object, function) \ - beginloop(0x8f) \ - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) \ - endloop(0x8f) \ - \ - label(0x2f) \ - set_object_image(object, 0, TVCMDLIST_12) \ - unset_object_flag2(object, OBJFLAG2_00040000) \ - \ - beginloop(0x04) \ - if_chr_activated_object(CHR_ANY, object, /*goto*/ 0x2f) \ - reloop(0x04) \ - \ - label(0x2f) \ - if_object_flag2(object, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) \ - endloop(0x04) \ - \ - label(0x2f) \ - set_object_image(object, 0, TVCMDLIST_13) \ - set_object_flag2(object, OBJFLAG2_00040000) \ - assign_sound(SFX_043A, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, object, TRUE) \ - set_returnlist(CHR_SELF, function) \ - set_ailist(CHR_SELF, AILIST_HOLO1_CHECK_DONE) - -u8 func101d_holo1_switch1[] = { - holo1_some_terminal(0x4c, AILIST_HOLO1_SWITCH1) - endlist -}; - -u8 func101e_holo1_switch2[] = { - holo1_some_terminal(0x4d, AILIST_HOLO1_SWITCH2) - endlist -}; - -u8 func101f_holo1_switch3[] = { - holo1_some_terminal(0x4e, AILIST_HOLO1_SWITCH3) - endlist -}; - -u8 func1020_holo1_monitor_switches[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) - endloop(0x8f) - - label(0x2f) - set_object_image(0x4f, 0, TVCMDLIST_12) - unset_object_flag2(0x4f, OBJFLAG2_00040000) - - beginloop(0x04) - if_chr_activated_object(CHR_ANY, 0x4f, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - set_object_image(0x4f, 0, TVCMDLIST_13) - set_object_flag2(0x4f, OBJFLAG2_00040000) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, 0x4f, TRUE) - set_returnlist(CHR_SELF, AILIST_HOLO1_MONITOR_SWITCHES) - set_ailist(CHR_SELF, AILIST_HOLO1_CHECK_DONE) - endlist -}; - -#define holo1_code_thing_p1(object1, object2, pad) \ - yield \ - yield \ - yield \ - \ - beginloop(0x04) \ - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) \ - reloop(0x04) \ - \ - label(0x2f) \ - if_object_in_good_condition(object1, /*goto*/ 0x2f) \ - reloop(0x04) \ - \ - label(0x2f) \ - if_object_flag2(object1, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) \ - if_chr_distance_to_pad_lt(CHR_BOND, 400, pad, /*goto*/ 0x09) \ - label(0x2f) \ - if_chr_looking_at_object(CHR_BOND, object1, /*goto*/ 0x2f) \ - endloop(0x04) \ - \ - label(0x09) - -#define holo1_code_thing_p2(object1, object2, hint, msg) \ - remove_hudmsgs \ - show_hudmsg_middle(0x01, COLOR_04_ORANGE, hint) \ - goto_first(0x04) \ - \ - label(0x2f) \ - set_object_image(object2, 0, TVCMDLIST_12) \ - set_object_image(object1, 0, TVCMDLIST_13) \ - remove_hudmsgs \ - show_hudmsg(CHR_BOND, msg) \ - assign_sound(SFX_DOOR_81B0, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, object1, TRUE) \ - restart_timer \ - \ - beginloop(0x57) \ - if_timer_gt(60, /*goto*/ 0x2f) \ - goto_first(0x57) \ - \ - label(0x2f) \ - set_object_flag2(object2, OBJFLAG2_IMMUNETOANTI) \ - \ - beginloop(0x59) \ - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x2f) \ - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) \ - reloop(0x59) \ - \ - label(0x2f) \ - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, FALSE, /*goto*/ 0x2f) \ - endloop(0x59) \ - \ - label(0x2f) \ - goto_first(0x8f) - -u8 func1021_holo1_code1[] = { - label(0x8f) - set_object_image(0x48, 0, TVCMDLIST_12) - unset_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI) - - holo1_code_thing_p1(0x48, 0x4c, 0x0240) - - set_object_flag2(0x48, OBJFLAG2_IMMUNETOANTI) - set_object_flag2(0x4c, OBJFLAG2_IMMUNETOANTI) - - // 0x1c55 = "LOOK UP - Press Down C Button to look up at the target." - // 0x1c65 = "Code 1 has been obtained." - holo1_code_thing_p2(0x48, 0x4c, 0x1c55, 0x1c65) - - endlist -}; - -u8 func1021_holo1_code2[] = { - label(0x8f) - set_object_image(0x49, 0, TVCMDLIST_12) - unset_object_flag2(0x4d, OBJFLAG2_IMMUNETOANTI) - - holo1_code_thing_p1(0x49, 0x4d, 0x0241) - - set_object_flag2(0x49, OBJFLAG2_IMMUNETOANTI) - - // 0x1c56 = "LOOK DOWN - Press Up C Button to look down at the target." - // 0x1c66 = "Code 2 has been obtained." - holo1_code_thing_p2(0x49, 0x4d, 0x1c56, 0x1c66) - endlist -}; - -u8 func1021_holo1_code3[] = { - label(0x8f) - unset_object_flag2(0x4e, OBJFLAG2_IMMUNETOANTI) - set_object_image(0x4a, 0, TVCMDLIST_12) - - holo1_code_thing_p1(0x4a, 0x4e, 0x0242) - - set_object_flag2(0x4a, OBJFLAG2_IMMUNETOANTI) - - // 0x1c55 = "LOOK UP - Press Down C Button to look up at the target." - // 0x1c67 = "Code 3 has been obtained." - holo1_code_thing_p2(0x4a, 0x4e, 0x1c55, 0x1c67) - endlist -}; - -u8 func1021_holo1_code4[] = { - label(0x8f) - unset_object_flag2(0x4f, OBJFLAG2_IMMUNETOANTI) - set_object_image(0x4b, 0, TVCMDLIST_12) - - holo1_code_thing_p1(0x4b, 0x4f, 0x0243) - - set_object_flag2(0x4b, OBJFLAG2_IMMUNETOANTI) - - // 0x1c55 = "LOOK UP - Press Down C Button to look up at the target." - // 0x1c68 = "Code 4 has been obtained." - holo1_code_thing_p2(0x4b, 0x4f, 0x1c55, 0x1c68) - endlist -}; - -u8 func0430_holo1_check_done[] = { - label(0x04) - yield - if_object_flag2(0x4c, OBJFLAG2_00040000, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x4d, OBJFLAG2_00040000, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x4e, OBJFLAG2_00040000, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x4f, OBJFLAG2_00040000, /*goto*/ 0x2f) - goto_next(0x06) - - // All flags are set - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_106) // "Holoprogram 1 has been completed successfully." - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - - label(0x06) - - beginloop(0x57) - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, FALSE, /*goto*/ 0x2f) - endloop(0x57) - - label(0x2f) - return - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_holo2_main[] = { - label(0x80) - disable_object(0x54) - disable_object(0x55) - disable_object(0x56) - disable_object(0x57) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - restart_timer - - beginloop(0x13) - if_timer_gt(30, /*goto*/ 0x2f) - endloop(0x13) - - label(0x2f) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_object_flag2(0x54, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x55, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x56, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x57, OBJFLAG2_IMMUNETOANTI) - set_object_image(0x54, 0, TVCMDLIST_14) - set_object_image(0x55, 0, TVCMDLIST_14) - set_object_image(0x56, 0, TVCMDLIST_14) - set_object_image(0x57, 0, TVCMDLIST_14) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - enable_object(0x54) - enable_object(0x55) - enable_object(0x56) - enable_object(0x57) - disable_chr(0x04) - label(0x2f) - label(0x91) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_099) // "Activate all of the wall switches. - Be quick, as they will quickly reset." - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x90) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO2_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - remove_hudmsgs - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - disable_object(0x54) - disable_object(0x55) - disable_object(0x56) - disable_object(0x57) - enable_object(0x45) - restart_timer - - beginloop(0x09) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - remove_hudmsgs - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define holo2_do_thing(object, function) \ - restart_timer \ - beginloop(0x04) \ - if_chr_activated_object(CHR_ANY, object, /*goto*/ 0x2f) \ - if_object_flag2(object, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x06) \ - reloop(0x04) \ - \ - label(0x06) \ - if_timer_gt(300, /*goto*/ 0x06) \ - reloop(0x04) \ - \ - label(0x06) \ - set_object_image(object, 0, TVCMDLIST_14) \ - unset_object_flag2(object, OBJFLAG2_IMMUNETOANTI) \ - endloop(0x04) \ - \ - label(0x2f) \ - assign_sound(SFX_043A, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, object, TRUE) \ - set_object_image(object, 0, TVCMDLIST_13) \ - set_object_flag2(object, OBJFLAG2_IMMUNETOANTI) \ - set_returnlist(CHR_SELF, function) \ - set_ailist(CHR_SELF, 0x041b) - -u8 func1023_holo2_object1[] = { - holo2_do_thing(0x54, 0x0431) - endlist -}; - -u8 func1024_holo2_object2[] = { - holo2_do_thing(0x55, 0x0432) - endlist -}; - -u8 func1025_holo2_object3[] = { - holo2_do_thing(0x56, 0x0433) - endlist -}; - -u8 func1026_holo2_object4[] = { - holo2_do_thing(0x57, 0x0434) - endlist -}; - -u8 func041b_holo2_part1[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x04) - endloop(0x8f) - - label(0x04) - yield - if_object_flag2(0x54, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x55, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x56, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x57, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_087) // "Holoprogram 2 has been completed successfully." - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - label(0x06) - return - endlist -}; - -u8 func042f_holo2_part2[] = { - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x04) - endloop(0x08) - - beginloop(0x04) - if_within_targets_fovx_by_angle(20, /*goto*/ 0x06) - goto_next(0x2f) - - label(0x06) - endloop(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x09) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - set_stage_flag(STAGEFLAG_HOLO_FAILED) - restart_timer - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_105) // "Training failed - you must face forward." - set_ailist(CHR_SELF, GAILIST_IDLE) - set_object_image(0x54, 0, TVCMDLIST_12) - set_object_image(0x55, 0, TVCMDLIST_12) - set_object_image(0x56, 0, TVCMDLIST_12) - set_object_image(0x57, 0, TVCMDLIST_12) - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_IN_HOLO2, FALSE, /*goto*/ 0x2f) - endloop(0x09) - - label(0x2f) - goto_first(0x08) - - endlist -}; - -u8 func1027_holo3_main[] = { - label(0x80) - disable_object(0x58) - disable_object(0x59) - disable_object(0x5a) - disable_object(0x5b) - disable_object(0x5c) - disable_object(0x5d) - disable_object(0x5e) - disable_object(0x5f) - disable_object(0x60) - disable_object(0x61) - disable_object(0x62) - disable_object(0x63) - disable_object(0x64) - disable_object(0x73) - disable_object(0x74) - disable_object(0x65) - disable_object(0x66) - disable_object(0x67) - disable_object(0x68) - disable_object(0x69) - disable_object(0x6a) - disable_object(0x6b) - disable_object(0x6c) - disable_object(0x6d) - disable_object(0x6e) - disable_object(0x6f) - disable_object(0x70) - disable_object(0x71) - disable_object(0x72) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - restart_timer - - beginloop(0x13) - if_timer_gt(30, /*goto*/ 0x2f) - endloop(0x13) - - label(0x2f) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_object_flag2(0x65, OBJFLAG2_IMMUNETOANTI) - unset_object_flag2(0x66, OBJFLAG2_IMMUNETOANTI) - set_object_image(0x65, 0, TVCMDLIST_14) - set_object_image(0x66, 0, TVCMDLIST_14) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - enable_object(0x58) - enable_object(0x59) - enable_object(0x5a) - enable_object(0x5b) - enable_object(0x5c) - enable_object(0x5d) - enable_object(0x5e) - enable_object(0x5f) - enable_object(0x60) - enable_object(0x61) - enable_object(0x62) - enable_object(0x63) - enable_object(0x64) - enable_object(0x73) - enable_object(0x74) - enable_object(0x65) - enable_object(0x66) - enable_object(0x67) - enable_object(0x68) - enable_object(0x69) - enable_object(0x6a) - enable_object(0x6b) - enable_object(0x6c) - enable_object(0x6d) - enable_object(0x6e) - enable_object(0x6f) - enable_object(0x70) - enable_object(0x71) - enable_object(0x72) - disable_chr(0x04) - open_door(0x67) - open_door(0x68) - open_door(0x69) - open_door(0x6a) - open_door(0x6b) - open_door(0x6c) - open_door(0x6d) - open_door(0x6e) - open_door(0x6f) - open_door(0x70) - open_door(0x71) - open_door(0x72) - yield - close_door(0x67) - close_door(0x68) - close_door(0x69) - close_door(0x6a) - close_door(0x6b) - close_door(0x6c) - close_door(0x6d) - close_door(0x6e) - close_door(0x6f) - close_door(0x70) - close_door(0x71) - close_door(0x72) - label(0x2f) - label(0x91) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_098) // "Activate all the switches." - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO3_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - disable_object(0x58) - disable_object(0x59) - disable_object(0x5a) - disable_object(0x5b) - disable_object(0x5c) - disable_object(0x5d) - disable_object(0x5e) - disable_object(0x5f) - disable_object(0x60) - disable_object(0x61) - disable_object(0x62) - disable_object(0x63) - disable_object(0x64) - disable_object(0x73) - disable_object(0x74) - disable_object(0x65) - disable_object(0x66) - disable_object(0x67) - disable_object(0x68) - disable_object(0x69) - disable_object(0x6a) - disable_object(0x6b) - disable_object(0x6c) - disable_object(0x6d) - disable_object(0x6e) - disable_object(0x6f) - disable_object(0x70) - disable_object(0x71) - disable_object(0x72) - enable_object(0x45) - restart_timer - - beginloop(0x09) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - remove_hudmsgs - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102a_holo3_part1[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 300, PAD_DISH_0123, /*goto*/ 0x09) - endloop(0x04) - - label(0x09) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_095) // "DUCK - Hold R Button, then press Down C Button to duck." - restart_timer - - beginloop(0x0a) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - goto_first(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102b_holo3_part2[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_chr_distance_to_pad_lt(CHR_BOND, 300, PAD_DISH_0124, /*goto*/ 0x09) - endloop(0x04) - - label(0x09) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_096) // "CROUCH - When ducking, hold R Button, then press Down C Button to duck." - restart_timer - - beginloop(0x0a) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - goto_first(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102c_holo3_object1[] = { - beginloop(0x04) - if_chr_activated_object(CHR_ANY, 0x65, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, 0x65, TRUE) - set_object_image(0x65, 0, TVCMDLIST_13) - set_object_flag2(0x65, OBJFLAG2_IMMUNETOANTI) - set_returnlist(CHR_SELF, AILIST_HOLO3_OBJECT1) - set_ailist(CHR_SELF, AILIST_HOLO3_CHECK_DONE) - endlist -}; - -u8 func102d_holo3_object2[] = { - beginloop(0x04) - if_chr_activated_object(CHR_ANY, 0x66, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, 0x65, TRUE) - set_object_image(0x66, 0, TVCMDLIST_13) - set_object_flag2(0x66, OBJFLAG2_IMMUNETOANTI) - set_returnlist(CHR_SELF, AILIST_HOLO3_OBJECT2) - set_ailist(CHR_SELF, AILIST_HOLO3_CHECK_DONE) - endlist -}; - -u8 func041c_holo3_check_done[] = { - label(0x04) - yield - if_object_flag2(0x65, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_object_flag2(0x66, OBJFLAG2_IMMUNETOANTI, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_097) // "Holoprogram 3 has been completed successfully." - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - label(0x06) - return - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1028_holo4_main[] = { - label(0x80) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - disable_chr(0x04) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0274, AILIST_HOLO4_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x08) - label(0x08) - label(0x91) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) - remove_hudmsgs - if_chr_has_chrflag(0x0d, CHRCFLAG_00000040, /*goto*/ 0x61) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_107) // "Unarmed combat - knock out the target. - Press Z Button repeatedly to punch." - goto_next(0x2f) - - label(0x61) - if_chr_has_chrflag(0x0e, CHRCFLAG_00000040, /*goto*/ 0x62) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_108) // "Now try against a moving target..." - goto_next(0x2f) - - label(0x62) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_109) // "And finally against a target that fights back." - goto_next(0x2f) - - label(0x2f) - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO4_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - label(0x84) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - remove_chr(0x0d) - remove_chr(0x0e) - remove_chr(0x0f) - enable_object(0x45) - label(0x06) - remove_hudmsgs - - beginloop(0x6d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO4, FALSE, /*goto*/ 0x2f) - endloop(0x6d) - - label(0x2f) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_holo4_guard1[] = { - set_chr_id(0x0d) - set_shotlist(AILIST_HOLO4_GUARD1) - - beginloop(0x04) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - set_self_chrflag(CHRCFLAG_00000040) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0277, AILIST_HOLO4_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x08) - label(0x08) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_108) // "Now try against a moving target..." - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0404_holo4_guard2[] = { - set_chr_id(0x0e) - set_shotlist(AILIST_HOLO4_GUARD2) - label(0x04) - yield - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - set_self_chrflag(CHRCFLAG_00000040) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_027A, AILIST_HOLO4_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x0a) - label(0x0a) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_109) // "And finally against a target that fights back." - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x06) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - - beginloop(0x08) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - restart_timer - retreat(GOPOSFLAG_RUN, 1) - - beginloop(0x09) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x04) - - endlist -}; - -u8 func0405_holo4_guard3[] = { - set_chr_id(0x0f) - set_shotlist(AILIST_HOLO4_GUARD3) - restart_timer - - beginloop(0x04) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func1033_holo4_part1[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x57) - if_chr_deadish(0x0d, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x57) - if_chr_deadish(0x0e, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x57) - if_chr_deadish(0x0f, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - restart_timer - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_088) // "Holoprogram 4 has been completed successfully." - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x57) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - - beginloop(0x57) - if_stage_flag_eq(STAGEFLAG_IN_HOLO4, FALSE, /*goto*/ 0x2f) - endloop(0x57) - - label(0x2f) - goto_first(0x8f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1029_holo5_main[] = { - label(0x80) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - disable_chr(0x04) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0126, AILIST_HOLO5_INIT_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x06) - label(0x06) - yield - label(0x91) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) - remove_hudmsgs - if_chr_has_chrflag(0x10, CHRCFLAG_00000040, /*goto*/ 0x61) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_092) // "Disarm this live target if you can." - goto_next(0x2f) - - label(0x61) - if_chr_has_chrflag(0x11, CHRCFLAG_00000040, /*goto*/ 0x62) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_093) // "Knock out this target - stealth is the key." - goto_next(0x2f) - - label(0x62) - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_094) // "And the final guard..." - goto_next(0x2f) - - label(0x2f) - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x2f) - goto_first(0x82) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO5_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - remove_chr(0x10) - remove_chr(0x11) - remove_chr(0x12) - enable_object(0x45) - remove_hudmsgs - - beginloop(0x6d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO5, FALSE, /*goto*/ 0x2f) - endloop(0x6d) - - label(0x2f) - goto_first(0x08) - - endlist -}; - -u8 func0406_holo5_init_guard1[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_alertness(100) -#endif - set_chr_id(0x10) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x40000000, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO5_GUARD1) - endlist -}; - -u8 func0407_holo5_guard1[] = { - set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) - set_shotlist(AILIST_HOLO5_GUARD1) - set_chr_maxdamage(CHR_SELF, 300) - add_health_or_armor(300) - label(0x04) - yield - label(0x2f) - if_chr_deadish(CHR_SELF, /*goto*/ 0x30) - if_has_gun(CHR_SELF, /*goto*/ 0x06) - label(0x2f) -#if VERSION >= VERSION_NTSC_1_0 - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) -#else - set_alertness(100) -#endif - set_self_chrflag(CHRCFLAG_00000040) - set_shotlist(GAILIST_IDLE) - goto_next(0x0a) - label(0x30) - restart_timer - set_self_chrflag(CHRCFLAG_INVINCIBLE) - - beginloop(0x62) - if_timer_gt(60, /*goto*/ 0x63) - endloop(0x62) - - label(0x63) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x0a) - set_self_chrflag(CHRCFLAG_00000040) -#if VERSION >= VERSION_NTSC_1_0 - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) -#else - set_alertness(100) -#endif - surrender - show_hudmsg(CHR_BOND, L_DISH_090) // "Guard has been successfully disarmed." - - beginloop(0x59) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0272, AILIST_HOLO5_INIT_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2f) - endloop(0x59) - - label(0x2f) - set_shotlist(GAILIST_IDLE) - - beginloop(0x0b) - endloop(0x0b) - - label(0x06) - if_distance_to_target_lt(300, /*goto*/ 0x2f) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - - beginloop(0x08) - if_distance_to_target_lt(300, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - restart_timer - retreat(GOPOSFLAG_RUN, 1) - - beginloop(0x09) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x04) - - endlist -}; - -u8 func0408_holo5_init_guard2[] = { - set_chr_maxdamage(CHR_SELF, 200) - set_alertness(100) - set_chr_id(0x11) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x40000000, /*goto*/ 0x06) - label(0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_093) // "Knock out this target - stealth is the key." - set_ailist(CHR_SELF, AILIST_HOLO5_GUARD2) - endlist -}; - -u8 func0409_holo5_guard2[] = { - set_shotlist(AILIST_HOLO5_GUARD2) - label(0x04) - yield - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - restart_timer - assign_path(0) - start_patrol - label(0x08) - yield - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - if_target_in_sight(/*goto*/ 0x09) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_alertness(0) - goto_first(0x08) - - label(0x06) - label(0x09) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) - - beginloop(0x0a) - if_can_see_target(/*goto*/ 0x06) - goto_first(0x04) - - label(0x06) - endloop(0x0a) - - label(0x2f) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_00000040) - - beginloop(0x57) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0125, AILIST_HOLO5_INIT_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040a_holo5_init_guard3[] = { - set_reaction_speed(100) - set_chr_id(0x12) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x40000000, /*goto*/ 0x06) - label(0x06) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_094) // "And the final guard..." - set_alertness(100) - set_ailist(CHR_SELF, AILIST_HOLO5_GUARD3) - endlist -}; - -u8 func040b_holo5_guard3[] = { - set_shotlist(AILIST_HOLO_GUARD_ARMED_UNALERT) - restart_timer - - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) - - beginloop(0x04) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - restart_timer - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_089) // "Holoprogram 5 has been completed successfully." - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1034_holo5_part1[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x2f) - endloop(0x8f) - - label(0x2f) - yield - yield - yield - yield - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_has_flag_bankx(0x10, CHRFLAG0_00008000, BANK_0, /*goto*/ 0x2f) -#else - if_chr_alertness_lt(100, 0x10, /*goto*/ 0x06) - goto_next(0x2f) -#endif - label(0x06) - endloop(0x04) - - label(0x2f) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x11, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x12, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - restart_timer - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_089) // "Holoprogram 5 has been completed successfully." - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO5, FALSE, /*goto*/ 0x2f) - endloop(0x0d) - - label(0x2f) - goto_first(0x8f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102e_holo6_main[] = { - label(0x80) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - disable_chr(0x04) - - beginloop(0x57) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0127, AILIST_HOLO6_INIT_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x59) - endloop(0x57) - - beginloop(0x59) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0128, AILIST_HOLO6_INIT_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5b) - endloop(0x59) - - beginloop(0x5b) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_0129, AILIST_HOLO6_INIT_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5c) - endloop(0x5b) - - beginloop(0x5c) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012A, AILIST_HOLO6_INIT_GUARD4, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5d) - endloop(0x5c) - - label(0x5d) - label(0x2f) - label(0x91) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_110) // "Defeat all enemies without getting hit." - label(0x2f) - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO6_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - remove_chr(0x13) - remove_chr(0x14) - remove_chr(0x15) - remove_chr(0x16) - enable_object(0x45) - label(0x06) - remove_hudmsgs - - beginloop(0x6d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO6, FALSE, /*goto*/ 0x2f) - endloop(0x6d) - - label(0x2f) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_holo6_init_guard1[] = { - set_chr_id(0x13) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func040d_holo6_init_guard2[] = { - set_chr_id(0x14) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func040e_holo6_init_guard3[] = { - set_chr_id(0x15) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func040f_holo6_init_guard4[] = { - set_chr_id(0x16) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func0415_holo_guard_unarmed_unalert[] = { - set_alertness(100) - set_chr_maxdamage(CHR_SELF, 100) - yield - yield - yield - rebuild_teams - rebuild_squadrons - yield - yield - yield - yield - set_action(MA_NORMAL, FALSE) - set_shotlist(AILIST_HOLO_GUARD_UNARMED_ALERT) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x04) - if_within_targets_fovx_by_angle(40, /*goto*/ 0x04) - endloop(0x08) - - beginloop(0x04) - if_distance_to_target_lt(500, /*goto*/ 0x06) - call_rng - if_rand_lt(1, /*goto*/ 0x06) - label(0x2f) - endloop(0x04) - - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) - endlist -}; - -u8 func0416_holo_guard_unarmed_alert[] = { - set_shotlist(AILIST_HOLO_GUARD_UNARMED_ALERT) - set_action(MA_UNARMEDATTACK, FALSE) - if_chr_injured_target(CHR_SELF, /*goto*/ 0x09) - label(0x8f) - restart_timer - try_run_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x06) - if_distance_to_target_lt(300, /*goto*/ 0x2f) - if_timer_gt(15, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - goto_first(0x8f) - - label(0x2f) - set_returnlist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT2) - - label(0x09) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0a) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - set_stage_flag(STAGEFLAG_HOLO_FAILED) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_111) // "Training failed - you have been hit." - restart_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x5e) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) - if_timer_gt(180, /*goto*/ 0x2f) - endloop(0x5e) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0416_holo_guard_unarmed_alert2[] = { - set_action(MA_UNARMEDATTACK, FALSE) - restart_timer - - beginloop(0x04) - if_chr_dead(CHR_TARGET, /*goto*/ 0x57) - if_chr_knockedout(CHR_TARGET, /*goto*/ 0x57) - if_distance_to_target_gt(100, /*goto*/ 0x2f) - if_can_see_attack_target(/*goto*/ 0x2f) - if_timer_gt(120, /*goto*/ 0x10) - endloop(0x04) - - label(0x2f) - if_distance_to_target_gt(400, /*goto*/ 0x10) - if_distance_to_target_lt(100, /*goto*/ 0x06) - restart_timer - try_run_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_chr_dead(CHR_TARGET, /*goto*/ 0x57) - if_chr_knockedout(CHR_TARGET, /*goto*/ 0x57) - if_timer_gt(20, /*goto*/ 0x10) - if_chr_stopped(/*goto*/ 0x10) - if_target_is_player(/*goto*/ 0x0e) - label(0x0e) - if_distance_to_target_gt(400, /*goto*/ 0x10) - if_distance_to_target_lt(100, /*goto*/ 0x06) - endloop(0x08) - - label(0x2f) - restart_timer - goto_first(0x04) - - label(0x06) - restart_timer - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_chr_dead(CHR_TARGET, /*goto*/ 0x57) - if_chr_knockedout(CHR_TARGET, /*goto*/ 0x57) - if_distance_to_target_gt(400, /*goto*/ 0x10) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x2f) - restart_timer - goto_first(0x04) - - label(0x06) - try_punch_or_kick(/*goto*/ 0x2f) - restart_timer - goto_first(0x04) - - label(0x2f) - - beginloop(0x0a) - if_timer_gt(180, /*goto*/ 0x06) - if_chr_injured_target(CHR_SELF, /*goto*/ 0x2f) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - if_chr_injured_target(CHR_SELF, /*goto*/ 0x2f) - say_quip(CHR_BOND, QUIP_MISSEDPLAYER1, 0x19, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_MISSEDPLAYER2, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) - goto_next(0x06) - - label(0x2f) - say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0f) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - set_stage_flag(STAGEFLAG_HOLO_FAILED) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_111) // "Training failed - you have been hit." - restart_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x5e) - if_timer_gt(180, /*goto*/ 0x2f) - endloop(0x5e) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - label(0x57) - label(0x10) - return - endlist -}; - -u8 func041a_handle_holo_failure[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_HOLO_FAILED, TRUE, /*goto*/ 0x2f) - endloop(0x8f) - - label(0x2f) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) - if_timer_gt(180, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - label(0x09) - unset_stage_flag(STAGEFLAG_HOLO_FAILED) - goto_first(0x8f) - - endlist -}; - -u8 func102f_holo1_part1[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x13, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x14, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x15, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x16, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_112) // "Holoprogram 6 has been completed successfully." - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO6, FALSE, /*goto*/ 0x2f) - endloop(0x0d) - - label(0x2f) - goto_first(0x8f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1030_holo7_main[] = { - label(0x80) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x81) - endloop(0x08) - - label(0x81) - set_stage_flag(STAGEFLAG_CONSIDER_WARP) - lock_door(0x75, 0x40) - lock_door(0x76, 0x40) - close_door(0x75) - unset_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x2f) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x2f) - label(0x2f) - unset_stage_flag(STAGEFLAG_HOLO_ABORTING) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - unset_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - unset_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - disable_object(0x45) - disable_chr(0x04) - - beginloop(0x57) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012B, AILIST_HOLO7_INIT_GUARD1, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x59) - endloop(0x57) - - beginloop(0x59) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012C, AILIST_HOLO7_INIT_GUARD2, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5b) - endloop(0x59) - - beginloop(0x5b) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012D, AILIST_HOLO7_INIT_GUARD3, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5c) - endloop(0x5b) - - beginloop(0x5c) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012E, AILIST_HOLO7_INIT_GUARD4, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5d) - endloop(0x5c) - - beginloop(0x5d) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_DISH_012F, AILIST_HOLO7_INIT_GUARD5, SPAWNFLAG_00000010 | SPAWNFLAG_00000200 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x5e) - endloop(0x5d) - - label(0x5e) - label(0x2f) - label(0x91) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x2f) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_110) // "Defeat all enemies without getting hit." - label(0x2f) - restart_timer - - beginloop(0x82) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x90) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_FAILURE, TRUE, /*goto*/ 0x85) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HOLO_SUCCESS, TRUE, /*goto*/ 0x83) - if_chr_activated_object(CHR_BOND, 0x75, /*goto*/ 0x57) - if_chr_activated_object(CHR_BOND, 0x76, /*goto*/ 0x57) - goto_next(0x59) - - label(0x57) - set_stage_flag(STAGEFLAG_TRIGGER_CANNOTEXIT_MSG) - label(0x59) - if_timer_gt(1200, /*goto*/ 0x2f) - endloop(0x82) - - label(0x2f) - goto_first(0x91) - - label(0x85) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - goto_next(0x84) - - label(0x83) - set_savefile_flag(GAMEFILEFLAG_CI_HOLO7_DONE) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - yield - goto_next(0x84) - - label(0x84) - label(0x90) -#if VERSION >= VERSION_NTSC_1_0 - set_stage_flag(STAGEFLAG_CONSIDER_WARP) -#endif - unlock_door(0x75, 0x40) - unlock_door(0x76, 0x40) - remove_hudmsgs - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - enable_chr(0x04) - remove_chr(0x19) - remove_chr(0x1a) - remove_chr(0x1b) - remove_chr(0x17) - remove_chr(0x18) - enable_object(0x45) - remove_hudmsgs - - beginloop(0x6d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO7, FALSE, /*goto*/ 0x2f) - endloop(0x6d) - - label(0x2f) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_holo7_init_guard1[] = { - set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) - set_chr_id(0x19) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) - endlist -}; - -u8 func0413_holo7_init_guard2[] = { - set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) - set_chr_id(0x1a) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) - endlist -}; - -u8 func0414_holo7_init_guard3[] = { - set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) - set_chr_id(0x1b) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_UNALERT) - endlist -}; - -u8 func0410_holo7_init_guard4[] = { - set_chr_id(0x17) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func0411_holo7_init_guard5[] = { - set_chr_id(0x18) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_UNALERT) - endlist -}; - -u8 func0418_holo_guard_armed_unalert[] = { - set_accuracy(50) - set_reaction_speed(20) - set_chr_maxdamage(CHR_SELF, 40) - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_action(MA_NORMAL, FALSE) - set_shotlist(AILIST_HOLO_GUARD_UNARMED_ALERT) - restart_timer - - beginloop(0x04) - if_distance_to_target_lt(500, /*goto*/ 0x06) - if_timer_gt(300, /*goto*/ 0x2f) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x06) - endloop(0x04) - - label(0x2f) - call_rng - goto_next(0x06) - - label(0x2f) - goto_first(0x04) - - label(0x06) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_ARMED_ALERT) - endlist -}; - -u8 func0419_holo_guard_armed_alert[] = { - set_shotlist(AILIST_HOLO_GUARD_ARMED_ALERT) - if_has_gun(CHR_SELF, /*goto*/ 0x2f) - increase_squadron_alertness(100) - set_returnlist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) - set_ailist(CHR_SELF, AILIST_HOLO_GUARD_UNARMED_ALERT) - label(0x2f) - label(0x8f) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) - - beginloop(0x04) - if_can_see_attack_target(/*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - - beginloop(0x08) - if_chr_injured_target(CHR_SELF, /*goto*/ 0x2f) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - goto_first(0x8f) - - say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_HITPLAYER, 0x19, 0x03, 0x01, BANK_0, 0x00, 0x00) - label(0x2f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - set_stage_flag(STAGEFLAG_HOLO_FAILED) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_111) // "Training failed - you have been hit." - restart_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x5e) - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x2f) - if_timer_gt(180, /*goto*/ 0x2f) - endloop(0x5e) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1031_holo7_part1[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x04) - endloop(0x8f) - - beginloop(0x04) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x19, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x1a, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x1b, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x17, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - yield - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_HOLO_ABORTING, TRUE, /*goto*/ 0x0d) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - if_chr_deadish(0x18, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_GENERAL_PURPOSE, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_GENERAL_PURPOSE) - remove_hudmsgs - show_hudmsg_middle(0x01, COLOR_04_ORANGE, L_DISH_113) // "Holoprogram 7 has been completed successfully." - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_SUCCESS) - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_IN_HOLO7, FALSE, /*goto*/ 0x2f) - endloop(0x0d) - - label(0x2f) - goto_first(0x8f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1035_manage_music[] = { - beginloop(0x8f) - if_stage_flag_eq(STAGEFLAG_IN_TRAINING, TRUE, /*goto*/ 0x2f) - reloop(0x8f) - - label(0x2f) - play_track_isolated(MUSIC_CI_TRAINING) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_IN_TRAINING, FALSE, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - play_default_tracks - stop_ambient_track - endloop(0x8f) - - endlist -}; - -#define do_gun_msg(object, text) \ - beginloop(0x03) \ - if_chr_activated_object(CHR_ANY, object, /*goto*/ 0x2f) \ - reloop(0x03) \ - \ - label(0x2f) \ - show_hudmsg(CHR_BOND, text) \ - restart_timer \ - \ - beginloop(0x08) \ - if_timer_gt(120, /*goto*/ 0x06) \ - endloop(0x08) \ - \ - label(0x06) \ - endloop(0x03) - -u8 func1038_msg_pp7[] = { - do_gun_msg(0x1e, L_DISH_116) // "PP7" - endlist -}; - -u8 func1039_msg_tt33[] = { - do_gun_msg(0x1f, L_DISH_117) // "TT33" - endlist -}; - -u8 func103a_msg_skorpion[] = { - do_gun_msg(0x20, L_DISH_118) // "Skorpion" - endlist -}; - -u8 func103b_msg_ak47[] = { - do_gun_msg(0x21, L_DISH_119) // "AK47" - endlist -}; - -u8 func103c_msg_uzi9mm[] = { - do_gun_msg(0x22, L_DISH_120) // "Uzi 9mm" - endlist -}; - -u8 func103d_msg_mp5k[] = { - do_gun_msg(0x23, L_DISH_121) // "MP5K" - endlist -}; - -u8 func103e_msg_m16[] = { - do_gun_msg(0x24, L_DISH_122) // "M-16" - endlist -}; - -u8 func103f_msg_fnp90[] = { - do_gun_msg(0x25, L_DISH_123) // "FNP90" - endlist -}; - -u8 func1000_jo_typing[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - camera_movement(ANIM_CUT_DISH_INTRO_CAM) - cmd0175(60) - if_controller_button_pressed(/*goto*/ 0x7b) - play_cutscene_track(MUSIC_CI_INTRO) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DISH_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - - beginloop(0x57) - if_controller_button_pressed(/*goto*/ 0x7b) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - play_sound(SFX_8116, CHANNEL_5) - - beginloop(0x59) - if_controller_button_pressed(/*goto*/ 0x7b) - if_timer_gt(175, /*goto*/ 0x06) - endloop(0x59) - - label(0x06) - play_sound(SFX_TYPING_8118, CHANNEL_6) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2f) - goto_next(0x7b) - - label(0x2f) - if_controller_button_pressed(/*goto*/ 0x7b) - label(0x2f) - endloop(0x08) - - label(0x7b) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_DISH_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - enter_firstperson - passive_mode(TRUE) - fade_to_color(0x00000000, 0) - yield - yield - yield - yield - stop_cutscene_track - stop_ambient_track - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1040_lift_door_sounds[] = { - // Disable autoguns - yield - set_autogun_target_team(0x8b, TEAM_ENEMY) - set_autogun_target_team(0x8c, TEAM_ENEMY) - set_autogun_target_team(0x8d, TEAM_ENEMY) - restart_timer - - beginloop(0x57) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x57) - - label(0x2f) - set_object_flag(0x8b, OBJFLAG_DEACTIVATED) - set_object_flag(0x8c, OBJFLAG_DEACTIVATED) - set_object_flag(0x8d, OBJFLAG_DEACTIVATED) - - // Play sounds when lift doors activated - beginloop(0x8f) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x80, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x81, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x82, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x83, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x84, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x85, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x86, /*goto*/ 0x2f) - if_chr_activated_object(CHR_P1P2, 0x87, /*goto*/ 0x2f) - reloop(0x8f) - - label(0x2f) - play_sound(SFX_DOOR_81B0, -1) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - endloop(0x8f) - - endlist -}; - s32 intro[] = { spawn(PAD_DISH_00F5) outfit(OUTFIT_DEFAULT) @@ -5923,281 +569,6 @@ s32 path00[] = { -1, }; -u8 func1032_setup_lifts[] = { - activate_lift(1, 0x43) - activate_lift(2, 0x44) - set_lights_state(0x0007, LIGHTOP_1, 0x32, 0x00, 0x00) - set_lights_state(0x0008, LIGHTOP_1, 0x32, 0x00, 0x00) - set_lights_state(0x0009, LIGHTOP_1, 0x32, 0x00, 0x00) - set_lights_state(0x000a, LIGHTOP_1, 0x19, 0x00, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1042_check_jo_in_training_room[] = { - beginloop(0x04) - // Wait until player in training -#if VERSION >= VERSION_NTSC_1_0 -#endif - if_stage_flag_eq(STAGEFLAG_TRIGGER_UPLINK, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_ECMMINE, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CAMSPY, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_NIGHTVISION, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DOORDECODER, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_RTRACKER, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_IR, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_XRAY, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_DISGUISE, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CLOAK, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x2f) - reloop(0x04) - - // And has exited the training rooms - // 0x0014 = lobby outside holo room - // 0x001d = entry to device training room - // 0x001a = entry to information room - // 0x000b = entry to carrington's office - label(0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x0014, /*goto*/ 0x30) - if_chr_in_room(CHR_BOND, 0x00, 0x001d, /*goto*/ 0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x001a, /*goto*/ 0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x000b, /*goto*/ 0x2f) - reloop(0x04) - - label(0x30) - set_stage_flag(STAGEFLAG_TRIGGER_HOLO_FAILURE) - label(0x2f) - set_stage_flag(STAGEFLAG_TRIGGER_DEVICE_FAILURE) - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 -#endif - yield - yield - yield - yield - - label(0x57) -#if VERSION >= VERSION_NTSC_1_0 -#endif - yield - if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, TRUE, /*goto*/ 0x2f) - goto_first(0x57) - - label(0x2f) - label(0x59) -#if VERSION >= VERSION_NTSC_1_0 -#endif - yield - if_stage_flag_eq(STAGEFLAG_CONSIDER_WARP, FALSE, /*goto*/ 0x2f) - goto_first(0x59) - - label(0x2f) -#if VERSION >= VERSION_NTSC_1_0 -#endif - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - endloop(0x04) - - // Unreachable - label(0x5b) - restart_timer - label(0x5c) -#if VERSION >= VERSION_NTSC_1_0 -#endif - yield - if_timer_gt(60, /*goto*/ 0x2f) - goto_first(0x5c) - label(0x2f) - goto_first(0x04) - - endlist -}; - -u8 func1041_setup_environment[] = { - yield - configure_environment(0x0045, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0055, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0056, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1043_remove_hovercrate[] = { - yield - beginloop(0x8f) - if_object_in_room(OBJ_HOVERCRATE, 0x0016, /*goto*/ 0x08) - if_object_in_room(OBJ_HOVERCRATE, 0x0017, /*goto*/ 0x08) - if_object_in_room(OBJ_HOVERCRATE, 0x0018, /*goto*/ 0x08) - if_object_in_room(OBJ_HOVERCRATE, 0x0019, /*goto*/ 0x08) - goto_first(0x8f) - - label(0x08) - if_stage_flag_eq(STAGEFLAG_IN_HOLO1, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO2, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO3, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO4, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO5, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO6, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_IN_HOLO7, TRUE, /*goto*/ 0x2f) - goto_first(0x8f) - - label(0x2f) - move_object_to_pad(OBJ_HOVERCRATE, PAD_DISH_0141) - endloop(0x8f) - - endlist -}; - -struct ailist ailists[] = { - { func1000_jo_typing, 0x1000 }, - { func1001_set_jo_team, 0x1001 }, - { func1002_devicetraining_camspy, 0x1002 }, - { func1003_devicetraining_nightvision, 0x1003 }, - { func1004_devicetraining_doordecoder, 0x1004 }, - { func1005_devicetraining_xray, 0x1005 }, - { func1006_devicetraining_disguise, 0x1006 }, - { func1007_devicetrainign_ir, 0x1007 }, - { func1008_devicetraining_rtracker, 0x1008 }, - { func1009_devicetraining_cloak, 0x1009 }, - { func100a_devicetraining_ecmmine, 0x100a }, - { func100b_devicetraining_uplink, 0x100b }, - { func100c_cloak_detection, 0x100c }, - { func100e_training_unlockables, 0x100e }, - { func100f_doorproxy_unused1, 0x100f }, - { func1010_doorproxy, 0x1010 }, - { func1010_doorproxy_unused2, 0x1011 }, - { func1012_cloak_doorproxy, 0x1012 }, - { func1013_msg_hovercrate, 0x1013 }, - { func1014_msg_hoverbike, 0x1014 }, - { func1015_msg_doors, 0x1015 }, - { func1016_msg_elevators, 0x1016 }, - { func1017_msg_terminals, 0x1017 }, - { func1018_lightswitch, 0x1018 }, - { func1019_setup_carrington, 0x1019 }, - { func101a_move_jo_to_training_room, 0x101a }, -#if VERSION >= VERSION_NTSC_1_0 - { func101b_ir_door, 0x101b }, -#endif - { func101c_holo1_main, 0x101c }, - { func101d_holo1_switch1, 0x101d }, - { func101e_holo1_switch2, 0x101e }, - { func101f_holo1_switch3, 0x101f }, - { func1020_holo1_monitor_switches, 0x1020 }, - { func1021_holo1_code1, 0x1021 }, - { func1021_holo1_code2, 0x1021 }, - { func1021_holo1_code3, 0x1021 }, - { func1021_holo1_code4, 0x1021 }, - { func1022_holo2_main, 0x1022 }, - { func1023_holo2_object1, 0x1023 }, - { func1024_holo2_object2, 0x1024 }, - { func1025_holo2_object3, 0x1025 }, - { func1026_holo2_object4, 0x1026 }, - { func1027_holo3_main, 0x1027 }, - { func1028_holo4_main, 0x1028 }, - { func1029_holo5_main, 0x1029 }, - { func102a_holo3_part1, 0x102a }, - { func102b_holo3_part2, 0x102b }, - { func102c_holo3_object1, 0x102c }, - { func102d_holo3_object2, 0x102d }, - { func102e_holo6_main, 0x102e }, - { func102f_holo1_part1, 0x102f }, - { func1030_holo7_main, 0x1030 }, - { func1031_holo7_part1, 0x1031 }, - { func1032_setup_lifts, 0x1032 }, - { func1033_holo4_part1, 0x1033 }, - { func1034_holo5_part1, 0x1034 }, - { func1035_manage_music, 0x1035 }, - { func041a_handle_holo_failure, 0x1037 }, - { func1038_msg_pp7, 0x1038 }, - { func1039_msg_tt33, 0x1039 }, - { func103a_msg_skorpion, 0x103a }, - { func103b_msg_ak47, 0x103b }, - { func103c_msg_uzi9mm, 0x103c }, - { func103d_msg_mp5k, 0x103d }, - { func103e_msg_m16, 0x103e }, - { func103f_msg_fnp90, 0x103f }, - { func1040_lift_door_sounds, 0x1040 }, - { func1041_setup_environment, 0x1041 }, - { func1042_check_jo_in_training_room, 0x1042 }, - { func1043_remove_hovercrate, 0x1043 }, - { func041b_holo2_part1, 0x041b }, - { func041c_holo3_check_done, 0x041c }, - { func0430_holo1_check_done, 0x0430 }, - { func0401_move_to_deviceroom, 0x0401 }, - { func0402_move_to_holoroom, 0x0402 }, - { func041e_colleague, 0x041e }, - { func041d_init_collegue_when_sighted, 0x041d }, - { func041f_colleague1, 0x041f }, - { func0420_colleague2, 0x0420 }, - { func0421_colleague3, 0x0421 }, - { func0422_colleague4, 0x0422 }, - { func0423_colleague5, 0x0423 }, - { func0424_colleague6, 0x0424 }, - { func0425_colleague7, 0x0425 }, - { func0426_colleague8, 0x0426 }, - { func0427_colleague9, 0x0427 }, - { func0428_colleague10, 0x0428 }, - { func0429_grimshaw_disguise, 0x0429 }, - { func042a_carrington_cloak, 0x042a }, - { func042b_init_carrington, 0x042b }, - { func042c_carrington_tour, 0x042c }, - { func042f_holo2_part2, 0x042f }, - { func042d_unused, 0x042d }, - { func042e_devicegirl_reply_to_carrington, 0x042e }, - { func0403_holo4_guard1, 0x0403 }, - { func0404_holo4_guard2, 0x0404 }, - { func0405_holo4_guard3, 0x0405 }, - { func0406_holo5_init_guard1, 0x0406 }, - { func0407_holo5_guard1, 0x0407 }, - { func0408_holo5_init_guard2, 0x0408 }, - { func0409_holo5_guard2, 0x0409 }, - { func040a_holo5_init_guard3, 0x040a }, - { func040b_holo5_guard3, 0x040b }, - { func040c_holo6_init_guard1, 0x040c }, - { func040d_holo6_init_guard2, 0x040d }, - { func040e_holo6_init_guard3, 0x040e }, - { func040f_holo6_init_guard4, 0x040f }, - { func0410_holo7_init_guard4, 0x0410 }, - { func0411_holo7_init_guard5, 0x0411 }, - { func0412_holo7_init_guard1, 0x0412 }, - { func0413_holo7_init_guard2, 0x0413 }, - { func0414_holo7_init_guard3, 0x0414 }, - { func0415_holo_guard_unarmed_unalert, 0x0415 }, - { func0416_holo_guard_unarmed_alert, 0x0416 }, - { func0416_holo_guard_unarmed_alert2, 0x0417 }, - { func0418_holo_guard_armed_unalert, 0x0418 }, - { func0419_holo_guard_armed_alert, 0x0419 }, - { func041a_handle_holo_failure, 0x041a }, - { func1023_holo2_object1, 0x0431 }, - { func1024_holo2_object2, 0x0432 }, - { func1025_holo2_object3, 0x0433 }, - { func1026_holo2_object4, 0x0434 }, - { func102c_holo3_object1, 0x0435 }, - { func102d_holo3_object2, 0x0436 }, - { func101d_holo1_switch1, 0x0437 }, - { func101e_holo1_switch2, 0x0438 }, - { func101f_holo1_switch3, 0x0439 }, - { func1020_holo1_monitor_switches, 0x043a }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, PATHFLAG_CIRCULAR }, { NULL, 0, 0 }, diff --git a/src/setups/setupear.c b/src/setups/setupear.c index 8c32e3316..2d5f6bc99 100644 --- a/src/setups/setupear.c +++ b/src/setups/setupear.c @@ -101,7 +101,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -845,2529 +845,6 @@ s32 path13[] = { -1, }; -#define init_path(pathid) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(1) \ - set_reaction_speed(20) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - -u8 func040c_start_path00[] = { - init_path(0) - endlist -}; - -u8 func040d_start_path01[] = { - init_path(1) - endlist -}; - -u8 func040e_start_path02[] = { - init_path(2) - endlist -}; - -u8 func040f_start_path03[] = { - init_path(3) - endlist -}; - -u8 func0410_start_path04[] = { - init_path(4) - endlist -}; - -/** - * @unused - * - * The function doesn't do any checks for detecting Jo, so the guard would - * ignore you if it were assigned. - */ -u8 func0414_walk_3_pads[] = { - label(0x03) - walk_to_pad(PAD_EAR_0002) - - beginloop(0x06) - if_chr_stopped(/*goto*/ 0x2f) - endloop(0x06) - - label(0x2f) - walk_to_pad(PAD_EAR_0003) - - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x04) - - label(0x08) - walk_to_pad(PAD_EAR_0001) - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x0a) - endloop(0x09) - - label(0x0a) - goto_first(0x03) - - endlist -}; - -/** - * Unused. - */ -u8 func0401_init_chr_with_flag[] = { - set_self_chrflag(CHRCFLAG_00000200) - set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) - endlist -}; - -u8 func0405_init_scientist[] = { - set_chr_maxdamage(CHR_SELF, 20) - set_ailist(CHR_SELF, AILIST_SCIENTIST) - endlist -}; - -u8 func0404_scientist[] = { - set_shotlist(AILIST_SCIENTIST) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x2f) - endloop(0x10) - - label(0x2f) - set_ailist(CHR_SELF, AILIST_INIT_NASTY_SCIENTIST) - - label(0x06) - stop_chr - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x2f) - if_distance_to_target_lt(500, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_ONE_SCIENTIST_DONE, TRUE, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_ONE_SCIENTIST_DONE) - goto_next(0x03) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_TWO_SCIENTISTS_DONE, TRUE, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_TWO_SCIENTISTS_DONE) - goto_next(0x03) - - label(0x06) - set_stage_flag(STAGEFLAG_THREE_SCIENTISTS_DONE) - if_stage_flag_eq(STAGEFLAG_THREE_SCIENTISTS_DONE, FALSE, /*goto*/ 0x03) - set_ailist(CHR_SELF, AILIST_INIT_NASTY_SCIENTIST) - - label(0x03) - if_chr_in_room(CHR_P1P2, 0x00, 0x0031, /*goto*/ 0x6a) - if_chr_in_room(CHR_P1P2, 0x00, 0x0032, /*goto*/ 0x6a) - if_chr_in_room(CHR_P1P2, 0x00, 0x0042, /*goto*/ 0x6d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0043, /*goto*/ 0x6d) - goto_next(0x06) - - label(0x6a) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x6b) - if_chr_deadish(0x2b, /*goto*/ 0x2f) - if_chr_stopped(/*goto*/ 0x6c) - reloop(0x6b) - - label(0x2f) - if_chr_deadish(0x2c, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x6c) - endloop(0x6b) - - label(0x6c) - goto_first(0x6a) - - label(0x6d) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x6e) - if_chr_deadish(0x2d, /*goto*/ 0x2f) - if_chr_stopped(/*goto*/ 0x6f) - reloop(0x6e) - - label(0x2f) - if_chr_deadish(0x2e, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x6f) - endloop(0x6e) - - label(0x6f) - goto_first(0x6d) - - label(0x06) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - endloop(0x09) - - label(0x2f) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - goto_first(0x09) - - label(0x06) - say_quip(CHR_TARGET, 0x0a, 0xff, 0x00, 0xff, 0x81, 0x03, 0x08) - restart_timer - stop_chr - - beginloop(0x56) - if_timer_lt(120, /*goto*/ 0x2f) - if_chr_in_view(/*goto*/ 0x06) - label(0x2f) - endloop(0x56) - - label(0x06) - say_quip(CHR_TARGET, 0x0b, 0xff, 0x00, 0xff, 0x81, 0x04, 0x09) - restart_timer - - beginloop(0x57) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - label(0x0a) - say_quip(CHR_TARGET, 0x0c, 0xff, 0x00, 0xff, 0x81, 0x05, 0x08) - restart_timer - chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0b) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) - set_pad_preset_to_investigation_terminal(OBJ_GOODTERM3) - goto_next(0x12) - - label(0x06) - set_pad_preset_to_investigation_terminal(OBJ_GOODTERM1) - goto_next(0x12) - - label(0x2f) - set_pad_preset_to_investigation_terminal(OBJ_GOODTERM2) - label(0x12) - go_to_target_pad(GOPOSFLAG_JOG) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) - if_object_in_good_condition(OBJ_GOODTERM3, /*goto*/ 0x19) - say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) - show_hudmsg_top_middle(CHR_TARGET, L_EAR_044, COLOR_00_GREEN) // "It appears someone has broken my PC." - goto_next(0x0e) - - label(0x19) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, FALSE, /*goto*/ 0x15) - say_quip(CHR_TARGET, 0x0f, 0xff, 0x00, 0xff, 0x81, 0x08, 0x08) - goto_next(0x0e) - - label(0x15) - set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT3) - say_quip(CHR_TARGET, 0x0d, 0xff, 0x00, 0xff, 0x81, 0x06, 0x08) - assign_sound(SFX_01C3, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_GOODTERM3, TRUE) - goto_next(0x0f) - - label(0x06) - if_object_in_good_condition(OBJ_GOODTERM1, /*goto*/ 0x19) - say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) - goto_next(0x0e) - - label(0x19) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, FALSE, /*goto*/ 0x16) - say_quip(CHR_TARGET, 0x0f, 0xff, 0x00, 0xff, 0x81, 0x08, 0x08) - goto_next(0x0e) - - label(0x16) - set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT1) - say_quip(CHR_TARGET, 0x0d, 0xff, 0x00, 0xff, 0x81, 0x06, 0x08) - assign_sound(SFX_01C3, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_GOODTERM1, TRUE) - goto_next(0x0f) - - label(0x2f) - if_object_in_good_condition(OBJ_GOODTERM1, /*goto*/ 0x19) - say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) - goto_next(0x0e) - - label(0x19) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, FALSE, /*goto*/ 0x17) - say_quip(CHR_TARGET, 0x0f, 0xff, 0x00, 0xff, 0x81, 0x08, 0x08) - goto_next(0x0e) - - label(0x17) - set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT2) - say_quip(CHR_TARGET, 0x0d, 0xff, 0x00, 0xff, 0x81, 0x06, 0x08) - assign_sound(SFX_01C3, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_GOODTERM2, TRUE) - goto_next(0x0f) - - label(0x0f) - show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." - stop_chr - - beginloop(0x0e) - endloop(0x0e) - - endlist -}; - -u8 func0407_init_nasty_scientist[] = { - set_ailist(CHR_SELF, AILIST_NASTY_SCIENTIST) - endlist -}; - -u8 func0406_nasty_scientist[] = { - set_shotlist(AILIST_NASTY_SCIENTIST) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2f) - if_num_times_shot_lt(1, /*goto*/ 0x06) - label(0x2f) - play_sound(MP3_028C, CHANNEL_7) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x10) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) - set_pad_preset_to_investigation_terminal(OBJ_ALARMTERM3) - goto_next(0x12) - - label(0x06) - set_pad_preset_to_investigation_terminal(OBJ_ALARMTERM1) - goto_next(0x12) - - label(0x2f) - set_pad_preset_to_investigation_terminal(OBJ_ALARMTERM2) - label(0x12) - if_num_times_shot_lt(1, /*goto*/ 0x13) - go_to_target_pad(GOPOSFLAG_JOG) - goto_next(0x55) - - label(0x13) - label(0x08) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - reloop(0x09) - - label(0x2f) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - say_quip(CHR_TARGET, 0x0a, 0xff, 0x00, 0xff, 0x81, 0x03, 0x08) - restart_timer - - beginloop(0x56) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x56) - - label(0x06) - say_quip(CHR_TARGET, 0x0b, 0xff, 0x00, 0xff, 0x81, 0x04, 0x09) - restart_timer - - beginloop(0x57) - if_timer_gt(120, /*goto*/ 0x0a) - endloop(0x57) - - label(0x0a) - restart_timer - stop_chr - say_quip(CHR_TARGET, 0x0c, 0xff, 0x00, 0xff, 0x81, 0x05, 0x08) - - beginloop(0x0b) - if_timer_gt(90, /*goto*/ 0x55) - endloop(0x0b) - - label(0x55) - go_to_target_pad(GOPOSFLAG_JOG) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) - if_object_in_good_condition(OBJ_ALARMTERM3, /*goto*/ 0x30) - goto_next(0x11) - - label(0x30) - set_stage_flag(STAGEFLAG_ALARM3_ACTIVE) - assign_sound(SFX_TYPING_8118, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_GOODTERM3, TRUE) - goto_next(0x0f) - - label(0x06) - if_object_in_good_condition(OBJ_ALARMTERM1, /*goto*/ 0x30) - goto_next(0x11) - - label(0x30) - set_stage_flag(STAGEFLAG_ALARM1_ACTIVE) - assign_sound(SFX_TYPING_8118, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_GOODTERM1, TRUE) - goto_next(0x0f) - - label(0x2f) - if_object_in_good_condition(OBJ_ALARMTERM2, /*goto*/ 0x30) - goto_next(0x11) - - label(0x30) - set_stage_flag(STAGEFLAG_ALARM2_ACTIVE) - assign_sound(SFX_TYPING_8118, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_GOODTERM2, TRUE) - goto_next(0x0f) - - label(0x11) - say_quip(CHR_TARGET, 0x10, 0xff, 0x00, 0xff, 0x81, 0x09, 0x08) - goto_next(0x78) - - label(0x0f) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - say_quip(CHR_TARGET, 0x0e, 0xff, 0x00, 0xff, 0x81, 0x07, 0x08) - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x30) - endloop(0x0d) - - label(0x30) - activate_alarm - label(0x78) - label(0x06) - stop_chr - - beginloop(0x0e) - endloop(0x0e) - - endlist -}; - -u8 func1009_weaponscache[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_CACHETERMINAL, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DETECTED, /*goto*/ 0x2f) - show_hudmsg(CHR_TARGET, L_EAR_098) // "Secret weapons compartment opened." - play_sound(SFX_00F7, -1) - assign_sound(SFX_043B, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_CMP150_1, TRUE) - disable_object(OBJ_CACHEDOOR1) - disable_object(OBJ_CACHEDOOR2) - unset_object_flag(OBJ_CMP150_1, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_CMP150_1, OBJFLAG2_INVISIBLE) - unset_object_flag(OBJ_CMP150_2, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_CMP150_2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_CMP150_1, OBJFLAG2_PICKUPWITHOUTLOS) - set_object_flag2(OBJ_CMP150_2, OBJFLAG2_PICKUPWITHOUTLOS) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_099) // "Enemy detected - weapon cache locked." - play_sound(SFX_00F7, -1) - unset_stage_flag(STAGEFLAG_BOT_ACTIVE) - unset_stage_flag(STAGEFLAG_BOT_REPROGRAMMED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * The second terminal you're supposed to activate. - * - * If turning the bot on without reprogramming it first, the bot will run - * without a program where it moves in a small circle at slow speed. - * - * If turning the bot on after reprogramming it will start the maintenance - * cycle (lasers). - */ -u8 func1002_bot_activation_terminal[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - goto_next(0x04) - - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_BOT_ACTIVATION_TERMINAL, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_objective_failed(1, /*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_BOT_REPROGRAMMED, TRUE, /*goto*/ 0x2f) - - // Activating prior to reprogramming - play_sound(SFX_01CA, -1) - assign_sound(SFX_01C5, CHANNEL_3) - play_sound_from_object(CHANNEL_3, OBJ_PURPLEBOT, 1, 600, 800) - show_hudmsg(CHR_TARGET, L_EAR_015) // "Maintenance robots activated." - set_stage_flag(STAGEFLAG_BOT_ACTIVE) - set_stage_flag(STAGEFLAG_BOT_ACTIVE_NOPROGRAM) - reloop(0x04) - - // Activating after reprogramming - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_015) // "Maintenance robots activated." - set_stage_flag(STAGEFLAG_BOT_ACTIVE) - yield - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_018) // "Maintenance cycle activated." - set_stage_flag(STAGEFLAG_BOT_ACTIVE_MAINTENANCE) - reloop(0x04) - - // Attempting to deactivate while bot reprogrammed and running - label(0x08) - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_020) // "Operation not allowed - robots busy." - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - reloop(0x04) - - // Deactivating - label(0x0a) - show_hudmsg(CHR_TARGET, L_EAR_021) // "Maintenance robots deactivated." - unset_stage_flag(STAGEFLAG_BOT_ACTIVE) - unset_stage_flag(STAGEFLAG_BOT_ACTIVE_CLEANING) - unset_stage_flag(STAGEFLAG_BOT_ACTIVE_NOPROGRAM) - play_sound(SFX_01C9, -1) - mute_channel(CHANNEL_3) - reloop(0x04) - - label(0x0b) - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_023) // "Maintenance robot system offline." - endloop(0x04) - - endlist -}; - -/** - * The first terminal you're supposed to activate. - * - * If activated while the bot is offline, the bot is reprogrammed with the - * maintenance cycle (ie. lasers) but still needs to be started. - * - * If activated while the bot is running with no program, the bot is - * reprogrammed with the cleaning cycle (up and down the room at medium speed). - */ -u8 func1003_bot_programming_terminal[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - goto_next(0x04) - - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_BOT_PROGRAMMING_TERMINAL, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_objective_failed(1, /*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x09) - - // Reprogramming - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_016) // "Maintenance robots reprogrammed." - set_stage_flag(STAGEFLAG_BOT_REPROGRAMMED) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE, TRUE, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - yield - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_019) // "Routine cleaning cycle activated." - set_stage_flag(STAGEFLAG_BOT_ACTIVE_CLEANING) - restart_timer - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - reloop(0x04) - - // Attempting to reprogram while bot already reprogrammed and running - label(0x09) - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_020) // "Operation not allowed - robots busy." - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - reloop(0x04) - - label(0x0b) - show_hudmsg(CHR_TARGET, L_EAR_023) // "Maintenance robot system offline." - endloop(0x04) - - endlist -}; - -u8 func1004_check_items_collected[] = { - yield - set_object_flag3(OBJ_K7AVENGER, OBJFLAG3_PLAYERUNDROPPABLE) - set_object_flag3(OBJ_NIGHTVISION, OBJFLAG3_PLAYERUNDROPPABLE) - set_object_flag3(OBJ_SHIELD, OBJFLAG3_PLAYERUNDROPPABLE) - - beginloop(0x04) - if_chr_has_object(CHR_BOND, OBJ_K7AVENGER, /*goto*/ 0x2f) - if_chr_has_object(CHR_COOP, OBJ_K7AVENGER, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_chr_has_object(CHR_BOND, OBJ_NIGHTVISION, /*goto*/ 0x2f) - if_chr_has_object(CHR_COOP, OBJ_NIGHTVISION, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_chr_has_object(CHR_BOND, OBJ_SHIELD, /*goto*/ 0x2f) - if_chr_has_object(CHR_COOP, OBJ_SHIELD, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - yield - set_stage_flag(STAGEFLAG_ALL_ITEMS_COLLECTED) - unset_stage_flag(STAGEFLAG_ITEMS_UNCOLLECTABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_item_pickup_messages[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_HAS_K7AVENGER, TRUE, /*goto*/ 0x2f) - if_chr_has_object(CHR_P1P2, OBJ_K7AVENGER, /*goto*/ 0x06) - goto_next(0x2f) - - label(0x06) - show_hudmsg(CHR_P1P2, L_EAR_086) // "Experimental item 1 acquired." - set_stage_flag(STAGEFLAG_HAS_K7AVENGER) - label(0x2f) - if_stage_flag_eq(STAGEFLAG_HAS_NIGHTVISION, TRUE, /*goto*/ 0x2f) - if_chr_has_object(CHR_P1P2, OBJ_NIGHTVISION, /*goto*/ 0x06) - goto_next(0x2f) - - label(0x06) - show_hudmsg(CHR_P1P2, L_EAR_087) // "Experimental item 2 acquired." - set_stage_flag(STAGEFLAG_HAS_NIGHTVISION) - label(0x2f) - if_stage_flag_eq(STAGEFLAG_HAS_SHIELD, TRUE, /*goto*/ 0x2f) - if_chr_has_object(CHR_P1P2, OBJ_SHIELD, /*goto*/ 0x06) - goto_next(0x2f) - - label(0x06) - show_hudmsg(CHR_P1P2, L_EAR_088) // "Experimental item 3 acquired." - set_stage_flag(STAGEFLAG_HAS_SHIELD) - label(0x2f) - endloop(0x04) - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_check_unacceptable_casualties[] = { - beginloop(0x04) - if_chr_dead(0x35, /*goto*/ 0x08) - if_chr_death_animation_finished(0x35, /*goto*/ 0x08) - if_chr_dead(0x36, /*goto*/ 0x09) - if_chr_death_animation_finished(0x36, /*goto*/ 0x09) - if_chr_dead(0x37, /*goto*/ 0x0a) - if_chr_death_animation_finished(0x37, /*goto*/ 0x0a) - if_chr_dead(0x38, /*goto*/ 0x0a) - if_chr_death_animation_finished(0x38, /*goto*/ 0x0a) - reloop(0x04) - - label(0x08) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) - goto_next(0x0f) - - if_chr_dead(0x36, /*goto*/ 0x0b) - if_chr_death_animation_finished(0x36, /*goto*/ 0x0b) - if_chr_dead(0x37, /*goto*/ 0x0c) - if_chr_death_animation_finished(0x37, /*goto*/ 0x0c) - label(0x0b) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - goto_next(0x0f) - - label(0x2f) - if_chr_dead(0x37, /*goto*/ 0x0f) - if_chr_death_animation_finished(0x37, /*goto*/ 0x0f) - reloop(0x04) - - label(0x0c) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - goto_next(0x0f) - label(0x2f) - reloop(0x04) - - label(0x09) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) - goto_next(0x0f) - label(0x2f) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - if_chr_dead(0x37, /*goto*/ 0x0f) - if_chr_death_animation_finished(0x37, /*goto*/ 0x0f) - label(0x2f) - endloop(0x04) - - label(0x0a) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2f) - goto_next(0x0f) - - label(0x2f) - label(0x0f) - set_stage_flag(STAGEFLAG_UNACCEPTABLE_CASUALTIES) - show_hudmsg(CHR_BOND, L_EAR_026) // "Unacceptable scientist casualties." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_terminal_activation[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_GOODTERM1, /*goto*/ 0x08) - if_chr_activated_object(CHR_TARGET, OBJ_ALARMTERM1, /*goto*/ 0x09) - if_chr_activated_object(CHR_TARGET, OBJ_GOODTERM2, /*goto*/ 0x0d) - if_chr_activated_object(CHR_TARGET, OBJ_ALARMTERM2, /*goto*/ 0x0b) - if_chr_activated_object(CHR_TARGET, OBJ_GOODTERM3, /*goto*/ 0x0f) - if_chr_activated_object(CHR_TARGET, OBJ_ALARMTERM3, /*goto*/ 0x0c) - if_chr_activated_object(CHR_TARGET, 0x0b, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x0c, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x0d, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x0e, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x10, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x11, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x12, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x13, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x15, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x16, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x17, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x18, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x1a, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x1b, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x1c, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x1d, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x1e, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x1f, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x20, /*goto*/ 0x2f) - if_chr_activated_object(CHR_TARGET, 0x21, /*goto*/ 0x2f) - endloop(0x04) - - // Inactive terminal - label(0x2f) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - show_hudmsg(CHR_TARGET, L_EAR_027) // "Terminal is not active." - restart_timer - - beginloop(0x56) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x56) - - label(0x2f) - reloop(0x04) - - // Good terminal 0x07 - label(0x08) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, FALSE, /*goto*/ 0x2f) - restart_timer - - beginloop(0x56) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x56) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_042) // "Experiment already powered down." - reloop(0x04) - - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." - assign_sound(SFX_01C3, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_GOODTERM1, TRUE) - restart_timer - - beginloop(0x0a) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." - set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT1) - reloop(0x04) - - // Good terminal 0x08 - label(0x0d) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, FALSE, /*goto*/ 0x2f) - restart_timer - - beginloop(0x57) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x57) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_042) // "Experiment already powered down." - goto_first(0x04) - - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." - assign_sound(SFX_01C3, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_GOODTERM2, TRUE) - restart_timer - - beginloop(0x0e) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." - set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT2) - reloop(0x04) - - // Good terminal 0x09 - label(0x0f) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, FALSE, /*goto*/ 0x2f) - restart_timer - - beginloop(0x58) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x58) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_042) // "Experiment already powered down." - reloop(0x04) - - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_028) // "Powering down active systems." - assign_sound(SFX_01C3, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_GOODTERM3, TRUE) - restart_timer - - beginloop(0x10) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x10) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_029) // "Experiment has been shut down." - set_stage_flag(STAGEFLAG_SHUT_DOWN_EXPERIMENT3) - reloop(0x04) - - // Alarm terminal 0x0f - label(0x09) - if_alarm_active(/*goto*/ 0x06) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - show_hudmsg(CHR_TARGET, L_EAR_030) // "Alarm activated." - set_stage_flag(STAGEFLAG_ALARM1_ACTIVE) - activate_alarm - reloop(0x04) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_031) // "Alarm deactivated." - unset_stage_flag(STAGEFLAG_ALARM1_ACTIVE) - deactivate_alarm - reloop(0x04) - - // Alarm terminal 0x14 - label(0x0b) - if_alarm_active(/*goto*/ 0x06) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - show_hudmsg(CHR_TARGET, L_EAR_030) // "Alarm activated." - set_stage_flag(STAGEFLAG_ALARM2_ACTIVE) - activate_alarm - reloop(0x04) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_031) // "Alarm deactivated." - unset_stage_flag(STAGEFLAG_ALARM2_ACTIVE) - deactivate_alarm - reloop(0x04) - - // Alarm terminal 0x19 - label(0x0c) - if_alarm_active(/*goto*/ 0x06) - speak(CHR_TARGET, 0xffff, SFX_TYPING_8118, CHANNEL_9, COLOR_00_GREEN) // unknown text - show_hudmsg(CHR_TARGET, L_EAR_030) // "Alarm activated." - set_stage_flag(STAGEFLAG_ALARM3_ACTIVE) - activate_alarm - reloop(0x04) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_031) // "Alarm deactivated." - unset_stage_flag(STAGEFLAG_ALARM3_ACTIVE) - deactivate_alarm - reloop(0x04) - - label(0x2f) - endloop(0x04) - - endlist -}; - -u8 func1007_uplink[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x30) - goto_next(0x0d) - - label(0x30) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_UPLINKPC, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_UPLINK_FINISHED, FALSE, /*goto*/ 0x06) - - // Activating a second time - speak(CHR_TARGET, 0xffff, SFX_8116, CHANNEL_9, COLOR_00_GREEN) // unknown text - show_hudmsg(CHR_TARGET, L_EAR_041) // "Security door already unlocked." - reloop(0x04) - - label(0x06) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - - // Activated computer without uplink - speak(CHR_TARGET, 0xffff, SFX_8116, CHANNEL_9, COLOR_00_GREEN) // unknown text - show_hudmsg(CHR_TARGET, L_EAR_036) // "ACCESS DENIED - security code required." - reloop(0x04) - - // Uplinking - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_060) // "Connection established." - restart_timer - - // First second of uplinking - beginloop(0x08) - if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x30) - goto_next(0x0d) - - label(0x30) - if_timer_gt(60, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_TARGET, 200, PAD_EAR_025A, /*goto*/ 0x09) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, FALSE, /*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, FALSE, /*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, FALSE, /*goto*/ 0x0b) - label(0x2f) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - goto_next(0x09) - label(0x2f) - endloop(0x08) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_037) // "Searching for password." - restart_timer - set_stage_flag(STAGEFLAG_UPLINK_SEARCHING) - assign_sound(SFX_01BF, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_UPLINKPC, TRUE) - - beginloop(0x14) - if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x30) - goto_next(0x0d) - - label(0x30) - if_timer_gt(400, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_TARGET, 200, PAD_EAR_025A, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2f) - goto_next(0x09) - label(0x2f) - endloop(0x14) - - label(0x06) - mute_channel(CHANNEL_5) - assign_sound(SFX_01C1, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_UPLINKPC, TRUE) - show_hudmsg(CHR_TARGET, L_EAR_039) // "Password located - bypassing lock." - yield - show_hudmsg(CHR_TARGET, L_EAR_017) // "Security doors unlocked." - set_stage_flag(STAGEFLAG_UPLINK_FINISHED) - unlock_door(OBJ_UPLINKDOOR, 0x02) - - beginloop(0x15) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x15) - - label(0x06) - assign_sound(SFX_043B, CHANNEL_6) - control_sound_from_object(CHANNEL_6, 0x22, TRUE) - reloop(0x04) - - // Moved away from PC or switched weapon - label(0x09) - show_hudmsg(CHR_TARGET, L_EAR_040) // "Contact broken - reestablish link." - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_UPLINKPC, TRUE) - restart_timer - - beginloop(0x16) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x16) - - label(0x06) - mute_channel(CHANNEL_6) - reloop(0x04) - - label(0x0b) - restart_timer - - beginloop(0x0c) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_085) // "Connection broken - experiments still active." - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_UPLINKPC, TRUE) - restart_timer - - beginloop(0x17) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x17) - - label(0x06) - mute_channel(CHANNEL_6) - endloop(0x04) - - label(0x0d) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_check_bot_terminals_destroyed[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVATION_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x2f) - if_object_in_good_condition(OBJ_BOT_ACTIVATION_TERMINAL, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_BOT_ACTIVATION_TERMINAL_DESTROYED) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - label(0x2f) - if_stage_flag_eq(STAGEFLAG_BOT_PROGRAMMING_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x2f) - if_object_in_good_condition(OBJ_BOT_PROGRAMMING_TERMINAL, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_BOT_PROGRAMMING_TERMINAL_DESTROYED) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - label(0x2f) - endloop(0x04) - - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - // These are scientist chrs - set_chr_chrflag(0x35, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x36, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x37, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x38, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func100a_spawn_alarm_responders[] = { - beginloop(0x04) - if_alarm_active(/*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_ALARM_RESPONDERS_SPAWNED, TRUE, /*goto*/ 0x0c) - set_stage_flag(STAGEFLAG_ALARM_RESPONDERS_SPAWNED) - restart_timer - - beginloop(0x56) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x08) - endloop(0x56) - - beginloop(0x08) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - beginloop(0x57) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x09) - endloop(0x57) - - beginloop(0x09) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - beginloop(0x58) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x0a) - endloop(0x58) - - beginloop(0x0a) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - beginloop(0x59) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_005D, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x0b) - endloop(0x59) - - beginloop(0x0b) - if_timer_gt(30, /*goto*/ 0x0c) - endloop(0x0b) - - set_stage_flag(STAGEFLAG_ALARM_RESPONDERS_SPAWNED) - label(0x0c) - endloop(0x04) - - endlist -}; - -u8 func0408_alarm_responder[] = { - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - set_accuracy(20) - goto_next(0x06) - - label(0x2f) - set_accuracy(10) - - label(0x06) - try_inherit_properties(0x19, /*goto*/ 0x06) - label(0x06) - try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_squadron(SQUADRON_09) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) - set_alertness(90) - set_self_chrflag(CHRCFLAG_00000200) - - // Run to scientist based on which alarm was triggered - if_stage_flag_eq(STAGEFLAG_ALARM1_ACTIVE, TRUE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_ALARM2_ACTIVE, TRUE, /*goto*/ 0x09) - try_run_to_chr(0x37, /*goto*/ 0x06) - goto_next(0x06) - - label(0x08) - try_run_to_chr(0x35, /*goto*/ 0x06) - goto_next(0x06) - - label(0x09) - try_run_to_chr(0x36, /*goto*/ 0x06) - goto_next(0x06) - - label(0x06) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_UNALERTED_0001) - endlist -}; - -u8 func100b_check_uplink_pc_destroyed[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_UPLINK_FINISHED, TRUE, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_UPLINKPC, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_UPLINKPC_DESTROYED) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - goto_next(0x08) - label(0x2f) - endloop(0x04) - - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0411_yellowbot[] = { - label(0x03) - begin_hovercar_path(0x05) - set_vehicle_speed(512, 120) - - beginloop(0x04) - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 10, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - begin_hovercar_path(0x06) - set_vehicle_speed(512, 120) - - beginloop(0x08) - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 8, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - goto_first(0x03) - - endlist -}; - -u8 func0412_purplebot_programs[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x04) - - // Agent - move_object_to_pad(OBJ_PURPLEBOT, PAD_EAR_00BE) - goto_next(0x14) - - // SA or PA - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x0c) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x08) - endloop(0x04) - - // Cleaning cycle (up and down the terminal room at medium speed) - label(0x08) - begin_hovercar_path(0x07) - set_vehicle_speed(512, 120) - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, FALSE, /*goto*/ 0x0e) - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 1, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x08) - - // No program (small circles at low speed) - label(0x0a) - begin_hovercar_path(0x08) - set_vehicle_speed(128, 120) - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, FALSE, /*goto*/ 0x0e) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x10) - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 1, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - goto_first(0x0a) - - // Maintenance cycle - on route to lasers (high speed) - label(0x0c) - begin_hovercar_path(0x09) - set_vehicle_speed(768, 120) - - beginloop(0x0d) - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 24, /*goto*/ 0x06) - endloop(0x0d) - - label(0x14) - label(0x06) - set_ailist(CHR_SELF, AILIST_PURPLEBOT_AT_LASERS) - - // Returning to offline - label(0x0e) - begin_hovercar_path(0x0b) - set_vehicle_speed(512, 120) - unset_stage_flag(STAGEFLAG_BOT_ACTIVE_CLEANING) - unset_stage_flag(STAGEFLAG_BOT_REPROGRAMMED) - unset_stage_flag(STAGEFLAG_BOT_ACTIVE) - - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_NOPROGRAM, TRUE, /*goto*/ 0x11) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_MAINTENANCE, TRUE, /*goto*/ 0x12) - if_stage_flag_eq(STAGEFLAG_BOT_ACTIVE_CLEANING, TRUE, /*goto*/ 0x10) - if_hoverbot_next_step(OPERATOR_GREATER_THAN, 1, /*goto*/ 0x06) - endloop(0x0f) - - label(0x06) - set_vehicle_speed(0, 1) - goto_first(0x04) - - label(0x11) - goto_first(0x0a) - - label(0x12) - goto_first(0x0a) - - label(0x10) - goto_first(0x08) - - endlist -}; - -u8 func0413_purplebot_at_lasers[] = { -#if VERSION < VERSION_NTSC_1_0 - open_door(0x45) -#endif - label(0x03) - begin_hovercar_path(0x0a) - set_vehicle_speed(512, 120) - - beginloop(0x13) - endloop(0x13) - - endlist -}; - -u8 func100c_shuffle_terminals[] = { - shuffle_investigation_terminals(OBJ_GOODTERM1, OBJ_ALARMTERM1, 0x1e, 0x1f, 0x20, 0x21) - shuffle_investigation_terminals(OBJ_GOODTERM2, OBJ_ALARMTERM2, 0x1a, 0x1b, 0x1c, 0x1d) - shuffle_investigation_terminals(OBJ_GOODTERM3, OBJ_ALARMTERM3, 0x15, 0x16, 0x17, 0x18) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_experiment_terminals_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_GOODTERM1, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_GOODTERM_DESTROYED, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT1, TRUE, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_GOODTERM_DESTROYED) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - - label(0x2f) - if_object_in_good_condition(OBJ_GOODTERM2, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_GOODTERM_DESTROYED, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT2, TRUE, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_GOODTERM_DESTROYED) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - - label(0x2f) - if_object_in_good_condition(0x09, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_GOODTERM_DESTROYED, TRUE, /*goto*/ 0x2f) - if_stage_flag_eq(STAGEFLAG_SHUT_DOWN_EXPERIMENT3, TRUE, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_GOODTERM_DESTROYED) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - - label(0x2f) - endloop(0x04) - - endlist -}; - -u8 func0416_intro[] = { - play_cutscene_track(MUSIC_INVESTIGATION_INTRO) - camera_movement(ANIM_CUT_EAR_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_chrflag(CHR_BOND, CHRCFLAG_PERIMDISABLEDTMP) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_EAR_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_PERIMDISABLEDTMP) - unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_EAR_INTRO_GUARD_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 4) - - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x77) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(0, 0x56) - play_sound(SFX_01D5, CHANNEL_7) - - wait_until(250, 0x57) - play_sound(SFX_00EC, CHANNEL_10) - - wait_until(270, 0x58) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(290, 0x59) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(320, 0x5a) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(380, 0x5b) - open_door(0x24) - play_sound(SFX_0165, CHANNEL_7) - - wait_until(580, 0x5c) - play_sound(SFX_01D2, CHANNEL_7) - - wait_until(950, 0x5d) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(990, 0x5e) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(1060, 0x5f) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(1090, 0x60) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(1140, 0x61) - play_sound(SFX_01D3, CHANNEL_7) - - wait_until(1190, 0x62) - play_sound(SFX_0031, CHANNEL_7) - - wait_until(1196, 0x68) - play_sound(SFX_ARGH_MALE_008F, CHANNEL_6) - - wait_until(1310, 0x63) - play_sound(SFX_0085, CHANNEL_7) - - wait_until(1370, 0x64) - play_sound(SFX_007B, CHANNEL_7) - - wait_until(1410, 0x65) - play_sound(SFX_0175, CHANNEL_7) - - wait_until(1430, 0x66) - play_sound(SFX_0176, CHANNEL_7) - - wait_until(1600, 0x67) - play_sound(SFX_0171, CHANNEL_7) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2f) - goto_next(0x77) - label(0x2f) - if_controller_button_pressed(/*goto*/ 0x77) - label(0x2f) - endloop(0x08) - - label(0x77) - set_door_open(0x24) - set_door_open(0x40) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_PERIMDISABLEDTMP) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_EAR_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_UNPLAYABLE) - set_chr_chrflag(CHR_INTRO_GUARD, CHRCFLAG_INVINCIBLE) - set_chr_hiddenflag(CHR_INTRO_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_EAR_INTRO_GUARD_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) - - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - stop_cutscene_track - stop_ambient_track - enter_firstperson - yield - chr_do_animation(ANIM_CUT_EAR_INTRO_GUARD_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_GUARD, 2) - yield - kill(CHR_INTRO_GUARD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0417_outro[] = { - play_cutscene_track(MUSIC_INVESTIGATION_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_stage_flag(STAGEFLAG_TRIGGER_OUTRO_AUDIO) - - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - - set_ailist(CHR_DRCAROLL, GAILIST_IDLE) - set_ailist(CHR_K7_GUARD, GAILIST_IDLE) - restart_timer - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_01) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - set_cutscene_weapon(CHR_P1P2, -1, -1) - yield - set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2) - show_nonessential_chrs(FALSE) - - #define wait_for_camera(loopid) \ - beginloop(loopid) \ - if_camera_animating(/*goto*/ 0x2f) \ - goto_next(0x06) \ - label(0x2f) \ - if_controller_button_pressed(/*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_for_camera(0x08) - - if_controller_button_pressed(/*goto*/ 0x06) - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_02) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - - wait_for_camera(0x09) - - if_controller_button_pressed(/*goto*/ 0x06) - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_03) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - - wait_for_camera(0x0a) - - if_controller_button_pressed(/*goto*/ 0x06) - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_04) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_04, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - restart_timer - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2f) - goto_next(0x06) - label(0x2f) - if_controller_button_pressed(/*goto*/ 0x06) - if_timer_gt(282, /*goto*/ 0x2f) - endloop(0x0b) - - label(0x2f) - open_door(0x23) - - beginloop(0x5f) - if_camera_animating(/*goto*/ 0x2f) - goto_next(0x06) - label(0x2f) - if_controller_button_pressed(/*goto*/ 0x06) - endloop(0x5f) - - label(0x2f) - label(0x06) - if_controller_button_pressed(/*goto*/ 0x06) - unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_05) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_05, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) - - wait_for_camera(0x0c) - - if_controller_button_pressed(/*goto*/ 0x06) - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_06) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_06, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) - - wait_for_camera(0x0d) - - if_controller_button_pressed(/*goto*/ 0x06) - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_07) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_07, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) - - wait_for_camera(0x0e) - - camera_movement(ANIM_CUT_EAR_OUTRO_CAM_08) - chr_do_animation(ANIM_CUT_EAR_OUTRO_JO_08, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - chr_do_animation(ANIM_CUT_EAR_OUTRO_DRC_04, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) - - wait_for_camera(0x0f) - - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_intro_from_menu[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, 0x0416) - endlist -}; - -u8 func0417_outro_from_menu[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 unregistered_function1[] = { - set_returnlist(CHR_SELF, 0x0419) - set_ailist(CHR_SELF, 0x0416) - endlist -}; - -u8 unregistered_function2[] = { - set_returnlist(CHR_SELF, 0x041a) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func1415_outro_audio[] = { - label(0x79) - if_stage_flag_eq(STAGEFLAG_TRIGGER_OUTRO_AUDIO, TRUE, /*goto*/ 0x7a) - yield - goto_first(0x79) - - label(0x7a) - unset_stage_flag(STAGEFLAG_TRIGGER_OUTRO_AUDIO) - label(0x2f) - restart_timer - disable_object(0x37) - disable_object(0x38) - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_1) - mute_channel(CHANNEL_2) - mute_channel(CHANNEL_3) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - - #define outro_wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x77) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - outro_wait_until(78, 0x56) - play_sound(SFX_0161, CHANNEL_6) - - outro_wait_until(116, 0x57) - play_sound(SFX_0165, CHANNEL_7) - - outro_wait_until(131, 0x58) - play_sound(SFX_0166, CHANNEL_5) - - outro_wait_until(162, 0x59) - play_sound(SFX_0167, CHANNEL_6) - - outro_wait_until(197, 0x5a) - play_sound(SFX_0168, CHANNEL_7) - - outro_wait_until(236, 0x5b) - play_sound(SFX_0167, CHANNEL_5) - - outro_wait_until(266, 0x5c) - play_sound(SFX_0168, CHANNEL_6) - - outro_wait_until(281, 0x5d) - play_sound(SFX_0165, CHANNEL_7) - - outro_wait_until(335, 0x5e) - play_sound(SFX_0162, CHANNEL_5) - - outro_wait_until(384, 0x5f) - play_sound(SFX_0163, CHANNEL_6) - - outro_wait_until(415, 0x60) - play_sound(SFX_0164, CHANNEL_7) - - outro_wait_until(434, 0x61) - play_sound(SFX_0163, CHANNEL_5) - - outro_wait_until(474, 0x62) - play_sound(SFX_0164, CHANNEL_6) - - outro_wait_until(511, 0x63) - play_sound(SFX_0163, CHANNEL_7) - - outro_wait_until(356, 0x65) - play_sound(SFX_0164, CHANNEL_5) - - outro_wait_until(581, 0x66) - play_sound(SFX_0161, CHANNEL_6) - - outro_wait_until(620, 0x68) - speak(CHR_P1P2, L_EAR_100, MP3_03EC, CHANNEL_7, COLOR_09_BLUE) // "Dr. Caroll?" - - outro_wait_until(676, 0x67) - play_sound(SFX_0162, CHANNEL_6) - - outro_wait_until(747, 0x69) - play_sound(SFX_0163, CHANNEL_5) - - outro_wait_until(750, 0x6a) - speak(CHR_P1P2, L_EAR_101, MP3_03ED, CHANNEL_7, COLOR_09_BLUE) // "Dr. Caroll, are you here?" - - outro_wait_until(864, 0x6b) - speak(CHR_P1P2, L_EAR_102, MP3_03EE, CHANNEL_7, COLOR_04_ORANGE) // "Well, is it safe to come out?" - - outro_wait_until(1027, 0x6c) - speak(CHR_P1P2, L_EAR_103, MP3_03EF, CHANNEL_7, COLOR_09_BLUE) // "Yes, all clear." - - outro_wait_until(1200, 0x6f) - mute_channel(CHANNEL_6) - - play_sound(SFX_DOOR_042C, CHANNEL_4) - outro_wait_until(1219, 0x70) - - outro_wait_until(1254, 0x71) - speak(CHR_P1P2, L_EAR_104, MP3_03F0, CHANNEL_7, COLOR_09_BLUE) // "Wh..what... you're..." - - outro_wait_until(1460, 0x73) - speak(CHR_P1P2, L_EAR_105, MP3_03F1, CHANNEL_7, COLOR_04_ORANGE) // "Very professionally done, my dear, but there's no ..." - - outro_wait_until(1556, 0x74) - mute_channel(CHANNEL_5) - play_sound(SFX_DOOR_042C, CHANNEL_6) - - outro_wait_until(1900, 0x75) - speak(CHR_P1P2, L_EAR_106, MP3_03F2, CHANNEL_7, COLOR_04_ORANGE) // "Come on. I have vital information, and you must pr..." - - outro_wait_until(2200, 0x76) - play_sound(SFX_0161, CHANNEL_6) - - label(0x77) - goto_first(0x79) - - endlist -}; - -u8 func100f_check_for_end_level[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0063, /*goto*/ 0x2f) - if_chr_in_room(CHR_P1P2, 0x00, 0x0065, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_door_state(0x26, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_DRCAROLL_LOCATED) - yield -#if VERSION < VERSION_NTSC_1_0 - yield -#endif - if_all_objectives_complete(/*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2f) - goto_next(0x06) - - label(0x2f) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) - give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1011_spawn_guards_during_uplink[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_UPLINK_SEARCHING, TRUE, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - restart_timer - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_0131, AILIST_UPLINK_RESPONDER, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x09) - - beginloop(0x09) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_RANDOM, PAD_EAR_0132, AILIST_UPLINK_RESPONDER, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0a) - - beginloop(0x0a) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0409_uplink_responder[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - set_accuracy(20) - goto_next(0x06) - - label(0x2f) - set_accuracy(10) - - label(0x06) - try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_squadron(SQUADRON_09) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) - set_alertness(110) - set_self_chrflag(CHRCFLAG_00000200) - label(0x06) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1012_start_laser_sound[] = { - label(0x04) - yield - assign_sound(SFX_8119, CHANNEL_0) - play_sound_from_object(CHANNEL_0, 0x28, 1, 300, 400) - label(0x2f) - assign_sound(SFX_811A, CHANNEL_1) - play_sound_from_object(CHANNEL_1, 0x2d, 1, 300, 400) - label(0x2f) - assign_sound(SFX_8119, CHANNEL_2) - play_sound_from_object(CHANNEL_2, 0x32, 1, 300, 400) - assign_sound(SFX_01C5, CHANNEL_3) - play_sound_from_object(CHANNEL_3, 0x38, 1, 600, 800) - assign_sound(SFX_01C5, CHANNEL_4) - play_sound_from_object(CHANNEL_4, 0x37, 1, 600, 800) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_hatch_pc[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_HATCHPC, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_door_locked(0x3f, 0x08, /*goto*/ 0x56) - goto_next(0x2f) - - label(0x56) - play_sound(SFX_00F7, -1) - show_hudmsg(CHR_TARGET, L_EAR_061) // "Maintenance hatch is now open." - unlock_door(0x3f, 0x08) - reloop(0x04) - - label(0x2f) - show_hudmsg(CHR_TARGET, L_EAR_062) // "Maintenance hatch is already open." - restart_timer - - beginloop(0x57) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x57) - - label(0x2f) - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_radioactivity[] = { - restart_timer - - beginloop(0x04) - if_chr_in_room(CHR_TARGET, 0x00, 0x0014, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0015, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0016, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0017, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0018, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0019, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x001a, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - show_hudmsg(CHR_TARGET, L_EAR_063) // "WARNING - radioactive matter detected." - restart_timer - label(0x08) - yield - add_motion_blur(CHR_TARGET, 10, TRUE) - if_timer_lt(300, /*goto*/ 0x2f) - restart_timer - damage_chr_by_amount(CHR_TARGET, 4, 0) - label(0x2f) - if_chr_in_room(CHR_TARGET, 0x00, 0x0014, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0015, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0016, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0017, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0018, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0019, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x001a, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - goto_first(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_jo_radioactivity[] = { - set_target_chr(CHR_BOND) - set_ailist(CHR_SELF, AILIST_RADIOACTIVITY) - endlist -}; - -u8 func101d_coop_radioactivty[] = { - yield - set_target_chr(CHR_COOP) - if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x2f) - set_ailist(CHR_SELF, AILIST_RADIOACTIVITY) - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1021_counterop_radioactivity[] = { - yield - set_target_chr(CHR_ANTI) - if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x2f) - set_ailist(CHR_SELF, AILIST_RADIOACTIVITY) - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_k7_guard[] = { - set_accuracy(20) - set_reaction_speed(100) - set_shotlist(GAILIST_ALERTED) - - beginloop(0x0f) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - set_chrpreset(CHR_P1P2) - if_chr_in_room(CHR_TARGET, 0x00, 0x0036, /*goto*/ 0x03) - if_chr_in_room(CHR_TARGET, 0x00, 0x0037, /*goto*/ 0x03) - if_chr_in_room(CHR_TARGET, 0x00, 0x003a, /*goto*/ 0x03) - endloop(0x0f) - - label(0x03) - restart_timer - call_rng - if_rand_gt(128, /*goto*/ 0x06) - label(0x2f) - say_quip(CHR_PRESET, 0x09, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - label(0x06) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_near_miss(/*goto*/ 0x0c) - if_num_times_shot_gt(0, /*goto*/ 0x0c) - if_saw_injury(0x00, /*goto*/ 0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - try_attack_stand(ATTACKFLAG_AIMATPAD | ATTACKFLAG_AIMONLY, 0x0159, /*goto*/ 0x2f) - label(0x2f) - try_modify_attack(ATTACKFLAG_AIMATPAD, 0x0159, /*goto*/ 0x2f) - label(0x2f) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x32, 0x02, 0xff, BANK_0, 0x00, 0x00) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_near_miss(/*goto*/ 0x0c) - if_num_times_shot_gt(0, /*goto*/ 0x0c) - if_saw_injury(0x00, /*goto*/ 0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) - if_chr_stopped(/*goto*/ 0x2f) - goto_first(0x08) - - label(0x2f) - call_rng - if_rand_gt(200, /*goto*/ 0x2f) - goto_first(0x03) - - label(0x2f) - stop_chr - restart_timer - call_rng - if_rand_gt(128, /*goto*/ 0x06) - assign_sound(MP3_0299, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - - beginloop(0x0c) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x0c) - - label(0x2f) - say_quip(CHR_PRESET, 0x08, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - label(0x06) - if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_EAR_013B, /*goto*/ 0x2f) - walk_to_pad(PAD_EAR_013B) - label(0x2f) - restart_timer - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_near_miss(/*goto*/ 0x0c) - if_num_times_shot_gt(0, /*goto*/ 0x0c) - if_saw_injury(0x00, /*goto*/ 0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - restart_timer - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_near_miss(/*goto*/ 0x0c) - if_num_times_shot_gt(0, /*goto*/ 0x0c) - if_saw_injury(0x00, /*goto*/ 0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - goto_first(0x03) - - label(0x0c) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0403_k7_scientist[] = { - beginloop(0x14) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_in_room(CHR_TARGET, 0x00, 0x0035, /*goto*/ 0x03) - if_chr_in_room(CHR_TARGET, 0x00, 0x0036, /*goto*/ 0x03) - if_chr_in_room(CHR_TARGET, 0x00, 0x0037, /*goto*/ 0x03) - if_chr_in_room(CHR_TARGET, 0x00, 0x003a, /*goto*/ 0x03) - endloop(0x14) - - label(0x03) - stop_chr - restart_timer - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_near_miss(/*goto*/ 0x0c) - if_num_times_shot_gt(0, /*goto*/ 0x0c) - if_saw_injury(0x00, /*goto*/ 0x0c) - if_saw_death(0x00, /*goto*/ 0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) - call_rng - if_rand_lt(1, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - call_rng - if_rand_lt(64, /*goto*/ 0x09) - if_rand_lt(128, /*goto*/ 0x0a) - if_rand_lt(196, /*goto*/ 0x0b) - chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - goto_next(0x0f) - label(0x09) - chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - goto_next(0x0f) - label(0x0a) - chr_do_animation(ANIM_ROLL_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - goto_next(0x0f) - label(0x0b) - chr_do_animation(ANIM_GRAB_BUTT, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - goto_next(0x0f) - - beginloop(0x0f) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_near_miss(/*goto*/ 0x0c) - if_num_times_shot_gt(0, /*goto*/ 0x0c) - if_saw_injury(0x00, /*goto*/ 0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0c) - if_chr_stopped(/*goto*/ 0x2f) - endloop(0x0f) - - label(0x2f) - goto_first(0x03) - - label(0x0c) - assign_sound(MP3_028F, CHANNEL_6) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) -#endif - increase_squadron_alertness(100) - jog_to_pad(PAD_EAR_0133) - - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x10) - endloop(0x0d) - - label(0x10) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x0e) - if_chr_stopped(/*goto*/ 0x2f) - endloop(0x0e) - - label(0x2f) - goto_first(0x10) - - endlist -}; - -u8 func1016_setup_drcaroll[] = { - set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) - set_ailist(CHR_DRCAROLL, GAILIST_INVINCIBLE_AND_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040a_init_basic_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(1) - set_reaction_speed(20) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040b_init_shock_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(11) - set_reaction_speed(20) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(10) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1019_msg_securitysector[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0052, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - speak(CHR_P1P2, L_EAR_094, SFX_8173, CHANNEL_6, COLOR_09_BLUE) // "That's the highest security sector - Dr. Caroll ha..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_msg_lotofpower[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0031, /*goto*/ 0x2f) - if_chr_in_room(CHR_P1P2, 0x00, 0x0042, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - speak(CHR_P1P2, L_EAR_095, MP3_03A5, CHANNEL_6, COLOR_09_BLUE) // "Something around here's using a lot of power." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101b_msg_reprogram[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0026, /*goto*/ 0x2f) - if_chr_in_room(CHR_P1P2, 0x00, 0x0024, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - speak(CHR_P1P2, L_EAR_096, SFX_8174, CHANNEL_6, COLOR_09_BLUE) // "Reprogram that cleaning bot - it'll give you a way..." - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_msg_radioactive[] = { - beginloop(0x04) - if_objective_complete(0, /*goto*/ 0x06) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0014, /*goto*/ 0x2f) - endloop(0x04) - - label(0x2f) - speak(CHR_P1P2, L_EAR_097, SFX_8175, CHANNEL_6, COLOR_09_BLUE) // "Get out, Jo! The levels are too high. Use the CamS..." - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_unlock_drcaroll_door[] = { - beginloop(0x04) - if_objective_complete(0, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_objective_complete(1, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_objective_complete(2, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - if_objective_complete(3, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unlock_door(0x26, 0x40) - unlock_door(0x5a, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_check_bot_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_PURPLEBOT, /*goto*/ 0x2f) - goto_next(0x08) - label(0x2f) - endloop(0x04) - - // 0x32 is a laser - beginloop(0x08) - if_door_state(0x32, DOORSTATE_CLOSED, /*goto*/ 0x2f) - endloop(0x08) - - label(0x2f) - if_chr_in_room(CHR_BOND, 0x00, 0x004d, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x004e, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x004f, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0050, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0051, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0052, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0053, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0054, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0055, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0056, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0057, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0058, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0059, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x005a, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x005b, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x005c, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x005d, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x005e, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x005f, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0061, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0062, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0063, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x006c, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x006b, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0069, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0068, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x006d, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x006e, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0064, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0065, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0066, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0060, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0067, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x006a, /*goto*/ 0x06) - - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x0b) - if_chr_in_room(CHR_COOP, 0x00, 0x004d, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x004e, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x004f, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0050, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0051, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0052, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0053, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0054, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0055, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0056, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0057, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0058, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0059, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x005a, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x005b, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x005c, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x005d, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x005e, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x005f, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0061, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0062, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0063, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x006c, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x006b, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0069, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0068, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x006d, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x006e, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0064, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0065, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0066, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0060, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x0067, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x006a, /*goto*/ 0x06) - - label(0x0b) - show_hudmsg(CHR_BOND, L_EAR_022) // "Critical mission object destroyed." - set_stage_flag(STAGEFLAG_00000008) - set_stage_flag(STAGEFLAG_00000004) - if_stage_flag_eq(STAGEFLAG_HAS_K7AVENGER, TRUE, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_ITEMS_UNCOLLECTABLE) - label(0x2f) - if_stage_flag_eq(STAGEFLAG_HAS_NIGHTVISION, TRUE, /*goto*/ 0x2f) - set_stage_flag(STAGEFLAG_ITEMS_UNCOLLECTABLE) - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_objective_complete(0, /*goto*/ 0x2f) - goto_first(0x0b) - - label(0x2f) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - if_objective_complete(2, /*goto*/ 0x2f) - goto_first(0x0b) - - label(0x2f) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - if_chr_has_object(CHR_BOND, OBJ_K7AVENGER, /*goto*/ 0x2f) - if_chr_has_object(CHR_COOP, OBJ_K7AVENGER, /*goto*/ 0x2f) - goto_first(0x0b) - - label(0x2f) - if_chr_has_object(CHR_BOND, OBJ_NIGHTVISION, /*goto*/ 0x2f) - if_chr_has_object(CHR_COOP, OBJ_NIGHTVISION, /*goto*/ 0x2f) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_lock_agent_doors[] = { - label(0x04) - yield - if_difficulty_gt(DIFF_A, /*goto*/ 0x2f) - lock_door(0x5b, 0x08) - lock_door(0x5c, 0x08) - lock_door(0x5d, 0x08) - lock_door(0x5e, 0x08) - lock_door(0x5f, 0x08) - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_setup_rtracker[] = { - yield - set_object_flag3(OBJ_CMP150_1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_CMP150_2, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_PROXYMINES, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1423_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x0001, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0060, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0069, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1424_start_lift[] = { - activate_lift(1, 0x60) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_init_chr_with_flag, 0x0401 }, - { func0402_k7_guard, 0x0402 }, - { func0403_k7_scientist, 0x0403 }, - { func0404_scientist, 0x0404 }, - { func0405_init_scientist, 0x0405 }, - { func0406_nasty_scientist, 0x0406 }, - { func0407_init_nasty_scientist, 0x0407 }, - { func0408_alarm_responder, 0x0408 }, - { func0409_uplink_responder, 0x0409 }, - { func040a_init_basic_guard, 0x040a }, - { func040b_init_shock_guard, 0x040b }, - { func040c_start_path00, 0x040c }, - { func040d_start_path01, 0x040d }, - { func040e_start_path02, 0x040e }, - { func040f_start_path03, 0x040f }, - { func0410_start_path04, 0x0410 }, - { func0411_yellowbot, 0x0411 }, - { func0412_purplebot_programs, 0x0412 }, - { func0413_purplebot_at_lasers, 0x0413 }, - { func0415_radioactivity, 0x0415 }, - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_bot_activation_terminal, 0x1002 }, - { func1003_bot_programming_terminal, 0x1003 }, - { func1004_check_items_collected, 0x1004 }, - { func1005_check_unacceptable_casualties, 0x1005 }, - { func1006_terminal_activation, 0x1006 }, - { func1007_uplink, 0x1007 }, - { func1008_check_bot_terminals_destroyed, 0x1008 }, - { func1009_weaponscache, 0x1009 }, - { func100a_spawn_alarm_responders, 0x100a }, - { func100b_check_uplink_pc_destroyed, 0x100b }, - { func100c_shuffle_terminals, 0x100c }, - { func100e_experiment_terminals_destroyed, 0x100e }, - { func100f_check_for_end_level, 0x100f }, - { func1010_intro_from_menu, 0x1010 }, - { func1011_spawn_guards_during_uplink, 0x1011 }, - { func1012_start_laser_sound, 0x1012 }, - { func1013_hatch_pc, 0x1013 }, - { func1014_jo_radioactivity, 0x1014 }, - { func1415_outro_audio, 0x1415 }, - { func1016_setup_drcaroll, 0x1016 }, - { func1018_item_pickup_messages, 0x1018 }, - { func1019_msg_securitysector, 0x1019 }, - { func101a_msg_lotofpower, 0x101a }, - { func101b_msg_reprogram, 0x101b }, - { func101c_msg_radioactive, 0x101c }, - { func101d_coop_radioactivty, 0x101d }, - { func101e_unlock_drcaroll_door, 0x101e }, - { func101f_check_bot_destroyed, 0x101f }, - { func1020_lock_agent_doors, 0x1020 }, - { func1021_counterop_radioactivity, 0x1021 }, - { func1022_setup_rtracker, 0x1022 }, - { func1423_setup_environment, 0x1423 }, - { func1424_start_lift, 0x1424 }, - { func0414_walk_3_pads, 0x0414 }, - { func0416_intro, 0x0416 }, - { func0417_outro, 0x0417 }, - { func1010_intro_from_menu, 0x0c00 }, - { func0417_outro_from_menu, 0x0c01 }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, 0 }, diff --git a/src/setups/setupeld.c b/src/setups/setupeld.c index a9c200d00..96199c5f1 100644 --- a/src/setups/setupeld.c +++ b/src/setups/setupeld.c @@ -97,7 +97,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -755,2504 +755,6 @@ s32 path01[] = { -1, }; -u8 func1001_objectives_failed_msg[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_20) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1002_intro_from_menu[] = { - set_stage_flag(STAGEFLAG_PLAYING_INTRO_FROM_MENU) - set_ailist(CHR_SELF, AILIST_INTRO) - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - camera_movement(ANIM_CUT_ELD_INTRO_CAM_01) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - if_stage_flag_eq(STAGEFLAG_PLAYING_INTRO_FROM_MENU, TRUE, /*goto*/ 0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - label(0x2e) - chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - remove_chr(CHR_NEGOTIATOR) - play_cutscene_track(MUSIC_VILLA_INTRO3) - goto_next(0x06) - label(0x2d) - play_cutscene_track(MUSIC_VILLA_INTRO2) - chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 4) - label(0x06) - set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) - set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) - enable_object(OBJ_DROPSHIP) - set_object_flag2(OBJ_DROPSHIP, OBJFLAG2_04000000) - set_object_flag3(OBJ_DROPSHIP, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_ELD_INTRO_DROPSHIP_01, OBJ_DROPSHIP, 0x04, 0xffff) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x56) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - \ - label(0x06) - - wait_until(205, 0xab) - speak(CHR_BOND, L_ELD_039, MP3_03FF, CHANNEL_4, COLOR_09_BLUE) // "Agent Dark Mission Log, 1846 hours. Last night we ..." - - wait_until(680, 0x66) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(687, 0x67) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(708, 0x68) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(716, 0x69) - play_sound(SFX_0164, CHANNEL_7) - - wait_until(914, 0x6a) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(1010, 0x6b) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(1048, 0x6c) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(1075, 0x6d) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(1100, 0xac) - speak(CHR_BOND, L_ELD_040, MP3_0400, CHANNEL_4, COLOR_09_BLUE) // "Unfortunately, we don't have it. Daniel and Dr. Ca..." - - wait_until(1118, 0x6e) - play_sound(SFX_0162, CHANNEL_7) - - wait_until(1148, 0x6f) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(1175, 0x70) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(1193, 0x71) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(1214, 0x72) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(1313, 0x73) - play_sound(SFX_0164, CHANNEL_7) - - wait_until(1313, 0x74) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(1331, 0x75) - play_sound(SFX_0174, CHANNEL_7) - - wait_until(1348, 0x76) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(1366, 0x77) - play_sound(SFX_0162, CHANNEL_7) - - wait_until(1386, 0x78) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(1390, 0x79) - play_sound(SFX_0164, CHANNEL_7) - - wait_until(1450, 0x7a) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(1458, 0x7b) - play_sound(SFX_0164, CHANNEL_7) - - wait_until(1519, 0x7c) - play_sound(SFX_0162, CHANNEL_7) - - wait_until(1544, 0x7d) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(1554, 0x7e) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(1592, 0x7f) - play_sound(SFX_0162, CHANNEL_7) - - wait_until(1618, 0x81) - play_sound(SFX_0163, CHANNEL_7) - - wait_until(1645, 0x82) - play_sound(SFX_0162, CHANNEL_7) - - wait_until(1654, 0x83) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(1657, 0x84) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(1679, 0x85) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(1683, 0x86) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(1692, 0x87) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(1716, 0x88) - play_sound(SFX_0164, CHANNEL_6) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x56) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x56) - label(0x2d) - endloop(0x08) - - label(0x56) - if_controller_button_pressed(/*goto*/ 0x56) - camera_movement(ANIM_CUT_ELD_INTRO_CAM_02) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - if_stage_flag_eq(STAGEFLAG_PLAYING_INTRO_FROM_MENU, TRUE, /*goto*/ 0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - label(0x2e) - chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - goto_next(0x06) - label(0x2d) - chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 4) - label(0x06) - - set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) - - set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) - - restart_timer - - wait_until(50, 0xaa) - speak(CHR_BOND, L_ELD_041, MP3_0401, CHANNEL_4, COLOR_09_BLUE) // "Hopefully our phoney negotiator ploy will give me ..." - - restart_timer - wait_until(295, 0x89) - play_sound(SFX_0179, CHANNEL_6) - - wait_until(302, 0x8a) - play_sound(SFX_017A, CHANNEL_7) - - wait_until(333, 0x8b) - play_sound(SFX_017B, CHANNEL_7) - - wait_until(338, 0x8c) - play_sound(SFX_017A, CHANNEL_6) - - wait_until(344, 0x8d) - play_sound(SFX_017C, CHANNEL_7) - - wait_until(353, 0x8e) - play_sound(SFX_0179, CHANNEL_6) - - wait_until(372, 0x8f) - play_sound(SFX_017A, CHANNEL_6) - - wait_until(412, 0x90) - play_sound(SFX_017A, CHANNEL_6) - - wait_until(415, 0x91) - play_sound(SFX_017B, CHANNEL_7) - - wait_until(466, 0x92) - play_sound(SFX_0179, CHANNEL_6) - - wait_until(472, 0x93) - play_sound(SFX_017C, CHANNEL_7) - - wait_until(515, 0x94) - play_sound(SFX_017A, CHANNEL_6) - - wait_until(533, 0x95) - play_sound(SFX_017B, CHANNEL_6) - - wait_until(535, 0x96) - - wait_until(561, 0x97) - play_sound(SFX_017B, CHANNEL_6) - - wait_until(570, 0x98) - play_sound(SFX_017C, CHANNEL_7) - - wait_until(572, 0x99) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x56) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x56) - label(0x2d) - endloop(0x09) - - label(0x56) - if_stage_flag_eq(STAGEFLAG_PLAYING_INTRO_FROM_MENU, TRUE, /*goto*/ 0x4f) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x4e) - goto_next(0x4f) - label(0x4e) - camera_movement(ANIM_CUT_ELD_INTRO_CAM_03) - cmd0175(60) - if_controller_button_pressed(/*goto*/ 0x56) - - set_chr_chrflag(CHR_NEGOTIATOR, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_NEGOTIATOR, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_NEGOTIATOR, CHRHFLAG_00020000) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 4) - - set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) - - set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - enable_object(OBJ_DROPSHIP) - set_object_flag2(OBJ_DROPSHIP, OBJFLAG2_04000000) - set_object_flag3(OBJ_DROPSHIP, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_ELD_INTRO_DROPSHIP_02, OBJ_DROPSHIP, 0x04, 0xffff) - - restart_timer - - wait_until(238, 0x9e) - play_sound(SFX_046E, CHANNEL_6) - - wait_until(305, 0x9f) - play_sound(SFX_JO_LANDING_046F, CHANNEL_6) - - wait_until(313, 0xa0) - play_sound(SFX_04AE, CHANNEL_7) - - wait_until(350, 0xa1) - play_sound(SFX_0085, CHANNEL_6) - - wait_until(380, 0xa2) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(381, 0xa3) - play_sound(SFX_0162, CHANNEL_7) - - wait_until(400, 0xa4) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(429, 0xa5) - play_sound(SFX_0164, CHANNEL_6) - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x56) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x56) - label(0x2d) - endloop(0x0a) - - label(0x56) - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - label(0x06) - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_1) - mute_channel(CHANNEL_2) - mute_channel(CHANNEL_3) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_JO_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(CHR_NEGOTIATOR, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_NEGOTIATOR, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_NEG_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_NEGOTIATOR, 2) - - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 2) - - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 2) - - disable_object(OBJ_DROPSHIP) - stop_cutscene_track - stop_ambient_track - play_x_track(XREASON_DEFAULT, 10, 30) - unset_stage_flag(STAGEFLAG_PLAYING_INTRO_FROM_MENU) - enter_firstperson - yield - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_NEGOTIATOR, 2) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_TAKER1, 2) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_TAKER2, 2) - set_ailist(CHR_TAKER1, AILIST_INIT_TAKER) - set_ailist(CHR_TAKER2, AILIST_INIT_TAKER) - set_ailist(CHR_NEGOTIATOR, AILIST_NEGOTIATOR) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x4f) - camera_movement(ANIM_CUT_ELD_INTRO_CAM_04) - cmd0175(60) - disable_object(OBJ_DROPSHIP) - if_controller_button_pressed(/*goto*/ 0x56) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 4) - set_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 4) - restart_timer - - beginloop(0xa6) - if_controller_button_pressed(/*goto*/ 0x56) - if_timer_gt(17, /*goto*/ 0x06) - goto_first(0xa6) - - label(0x06) - play_sound(SFX_0179, CHANNEL_6) - - beginloop(0xa7) - if_controller_button_pressed(/*goto*/ 0x56) - if_timer_gt(60, /*goto*/ 0x06) - goto_first(0xa7) - - label(0x06) - play_sound(SFX_017A, CHANNEL_6) - - beginloop(0xa8) - if_controller_button_pressed(/*goto*/ 0x56) - if_timer_gt(96, /*goto*/ 0x06) - goto_first(0xa8) - - label(0x06) - play_sound(SFX_017B, CHANNEL_6) - - beginloop(0xa9) - if_controller_button_pressed(/*goto*/ 0x56) - if_timer_gt(144, /*goto*/ 0x06) - goto_first(0xa9) - - label(0x06) - play_sound(SFX_017C, CHANNEL_6) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x56) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x56) - label(0x2d) - goto_first(0x0b) - - label(0x56) - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - - label(0x06) - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_1) - mute_channel(CHANNEL_2) - mute_channel(CHANNEL_3) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_00020000) - set_chr_chrflag(CHR_TAKER1, CHRCFLAG_00000001) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER1_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER1, 2) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_TAKER2, CHRHFLAG_00020000) - set_chr_chrflag(CHR_TAKER2, CHRCFLAG_00000001) - chr_do_animation(ANIM_CUT_ELD_INTRO_TAKER2_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TAKER2, 2) - disable_object(OBJ_DROPSHIP) - stop_cutscene_track - stop_ambient_track - play_x_track(XREASON_DEFAULT, 10, 30) - enter_firstperson - yield - set_ailist(CHR_TAKER1, AILIST_TAKER) - set_ailist(CHR_TAKER2, AILIST_TAKER) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c02_outro_from_menu[] = { - set_ailist(CHR_CARRINGTON, GAILIST_IDLE) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func0408_outro[] = { - camera_movement(ANIM_CUT_ELD_OUTRO_CAM) - play_cutscene_track(MUSIC_VILLA_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNEXPLODABLE) - - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_CARRINGTON, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_ELD_OUTRO_CARR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 4) - - show_nonessential_chrs(FALSE) - restart_timer - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - - #define outro_wait_until1(time, msg, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x56) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - #define outro_wait_until2(time, msg1, msg2, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x56) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - outro_wait_until1(14, '1', 0x66) - play_sound(SFX_FOOTSTEP_80D0, CHANNEL_7) - - outro_wait_until1(36, '2', 0x67) - play_sound(SFX_FOOTSTEP_80D1, CHANNEL_6) - - outro_wait_until1(40, '3', 0x68) - speak(CHR_P1P2, L_ELD_042, MP3_0402, CHANNEL_4, COLOR_09_BLUE) // "Sir? Are you injured?" - - outro_wait_until1(58, '4', 0xad) - play_sound(SFX_FOOTSTEP_80D2, CHANNEL_7) - - outro_wait_until1(80, '5', 0x69) - play_sound(SFX_FOOTSTEP_80D3, CHANNEL_7) - - outro_wait_until1(102, '6', 0x6a) - play_sound(SFX_FOOTSTEP_80D0, CHANNEL_7) - - outro_wait_until1(142, '7', 0x6b) - play_sound(SFX_FOOTSTEP_80D1, CHANNEL_7) - - outro_wait_until1(164, '8', 0x6c) - play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) - - outro_wait_until1(165, '9', 0xae) - speak(CHR_P1P2, L_ELD_043, MP3_0403, CHANNEL_4, COLOR_05_GREEN) // "No, Joanna, I'm okay, but those dataDyne thugs mad..." - - outro_wait_until2(195, '1','0', 0x6d) - play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) - - outro_wait_until2(213, '1','1', 0x6e) - play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) - - outro_wait_until2(231, '1','2', 0x6f) - play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) - - outro_wait_until2(235, '1','3', 0x70) - play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) - - // @bug: No check for button presses for about 8 seconds while Carrington is - // saying the above line. - beginloop(0xaf) - if_timer_gt(738, /*goto*/ 0x06) - endloop(0xaf) - - label(0x06) - speak(CHR_P1P2, L_ELD_044, MP3_0404, CHANNEL_4, COLOR_09_BLUE) // "It's not your fault, sir. I should have been quick..." - - outro_wait_until2(956, '1','5', 0xb0) - speak(CHR_P1P2, L_ELD_045, MP3_0405, CHANNEL_4, COLOR_05_GREEN) // "Don't blame yourself, Joanna. Dr. Caroll told me t..." - - outro_wait_until2(2280, '2','2', 0xb1) - speak(CHR_P1P2, L_ELD_046, MP3_0406, CHANNEL_4, COLOR_09_BLUE) // "That won't be a problem, sir. So, did Dr. Caroll h..." - - outro_wait_until2(2457, '1','6', 0x71) - play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) - - outro_wait_until2(2496, '1','7', 0x72) - play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) - - outro_wait_until2(2620, '2','6', 0x7a) - speak(CHR_P1P2, L_ELD_047, MP3_0407, CHANNEL_5, COLOR_05_GREEN) // "Oh, yes, indeed. He certainly did, and I'll brief ..." - - outro_wait_until2(2730, '1','8', 0x73) - play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) - - outro_wait_until2(2808, '1','9', 0x74) - play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) - - outro_wait_until2(2861, '2','0', 0x75) - play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) - - outro_wait_until2(3030, '2','1', 0x76) - play_sound(SFX_FOOTSTEP_80D1, CHANNEL_7) - - outro_wait_until2(3098, '2','3', 0x77) - play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) - - outro_wait_until2(3194, '2','4', 0x78) - play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) - - outro_wait_until2(3276, '2','5', 0x79) - play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) - - outro_wait_until2(3370, '2','7', 0x7b) - play_sound(SFX_FOOTSTEP_80CC, CHANNEL_7) - - outro_wait_until2(3463, '2','8', 0x7c) - play_sound(SFX_FOOTSTEP_80CD, CHANNEL_7) - - outro_wait_until2(3503, '2','9', 0x7d) - play_sound(SFX_FOOTSTEP_80CE, CHANNEL_7) - - outro_wait_until2(3545, '3','0', 0x7e) - play_sound(SFX_FOOTSTEP_80CF, CHANNEL_7) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x56) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x56) - label(0x2d) - endloop(0x08) - - label(0x56) - label(0x06) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - stop_cutscene_track - stop_ambient_track - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_give_items[] = { - yield - yield - yield - yield - label(0x04) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - - // PA - give_object_to_chr(0x01, CHR_BOND) - give_object_to_chr(0x89, CHR_COOP) - chr_draw_weapon(CHR_BOND, WEAPON_UNARMED) - chr_draw_weapon(CHR_COOP, WEAPON_UNARMED) - disable_object(0x02) - disable_object(0x8a) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // A and SA - label(0x06) - give_object_to_chr(0x02, CHR_BOND) - give_object_to_chr(0x8a, CHR_COOP) - chr_draw_weapon(CHR_BOND, WEAPON_SNIPERRIFLE) - chr_draw_weapon(CHR_COOP, WEAPON_SNIPERRIFLE) - disable_object(0x01) - disable_object(0x89) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Velvet doesn't exist - label(0x08) - disable_object(0x8a) - disable_object(0x89) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_check_negotiator[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x04) - goto_next(0x2d) - - // A and SA - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_NEGOTIATOR_ESCAPED, TRUE, /*goto*/ 0x2d) - if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - show_hudmsg(CHR_BOND, L_ELD_011) // "Negotiator has been killed." - set_stage_flag(STAGEFLAG_NEGOTIATOR_DEAD) - - // PA - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0401_init_taker[] = { - set_chr_maxdamage(CHR_SELF, 1) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) - unset_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) - label(0x2d) - set_ailist(CHR_SELF, AILIST_TAKER) - endlist -}; - -u8 func0402_taker[] = { - set_self_chrflag(CHRCFLAG_00000040) - yield - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - - // PA - set_shotlist(GAILIST_ALERTED) - goto_next(0x06) - - // A and SA - label(0x2d) - set_shotlist(AILIST_TAKER) - - // All difficulties - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x61) - goto_next(0x03) - - // Wait for injury recovery - beginloop(0x61) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x61) - - // Injury recovered - label(0x2d) - goto_next(0x6f) - - label(0x03) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) - if_self_flag_bankx_eq(CHRFLAG0_HOLD_POSITION, TRUE, BANK_0, /*goto*/ 0x6f) - set_self_flag_bankx(CHRFLAG0_HOLD_POSITION, BANK_0) - label(0x2d) - restart_timer - if_difficulty_lt(DIFF_PA, /*goto*/ 0x63) - - label(0x60) - if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x06) - goto_next(0x03) - label(0x06) - set_target_chr(CHR_BOND) - label(0x03) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x05) - - beginloop(0x05) - if_distance_to_target_gt(1000, /*goto*/ 0x2e) - if_distance_to_target_lt(300, /*goto*/ 0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - if_chr_weapon_equipped(CHR_BOND, WEAPON_LAPTOPGUN, /*goto*/ 0x0b) - label(0x2d) - if_timer_gt(600, /*goto*/ 0x06) - endloop(0x05) - - // Jo got away - label(0x2e) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - // Jo got too close - label(0x06) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - // Laptop gun equipped - label(0x0b) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - restart_timer - chr_do_animation(ANIM_SURPRISED_0202, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x5f) - if_timer_gt(180, /*goto*/ 0x5e) - endloop(0x5f) - - label(0x5e) - goto_first(0x60) - - label(0x63) - restart_timer - set_target_chr(CHR_NEGOTIATOR) - label(0x03) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_ELD_0236, /*goto*/ 0x06) - label(0x2d) - if_self_flag_bankx_eq(CHRFLAG0_CAN_FLEESURRENDER, TRUE, BANK_0, /*goto*/ 0x06) - set_target_chr(CHR_NEGOTIATOR) - if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x10) - if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x10) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - if_timer_gt(600, /*goto*/ 0x06) - reloop(0x04) - - label(0x2d) - if_timer_gt(900, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_chr_flag_bankx(CHR_TAKER1, CHRFLAG0_CAN_FLEESURRENDER, BANK_0) - set_chr_flag_bankx(CHR_TAKER2, CHRFLAG0_CAN_FLEESURRENDER, BANK_0) - restart_timer - - beginloop(0x0c) - if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x10) - if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x10) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - if_timer_gt(600, /*goto*/ 0x06) - reloop(0x0c) - - label(0x2d) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x0c) - - // Shoot - label(0x6f) - label(0x06) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - - beginloop(0x08) - if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x06) - if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - if_chr_death_animation_finished(CHR_NEGOTIATOR, /*goto*/ 0x10) - if_chr_dead(CHR_NEGOTIATOR, /*goto*/ 0x10) - goto_first(0x03) - - label(0x10) - try_walk_to_target(/*goto*/ 0x0d) - - beginloop(0x0d) - if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, FALSE, BANK_0, /*goto*/ 0x06) - if_distance_to_target_lt(200, /*goto*/ 0x2d) - reloop(0x0d) - - label(0x06) - if_distance_to_target_lt(200, /*goto*/ 0x2d) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x0d) - - label(0x2d) - if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x06) - chr_do_animation(ANIM_01FD, 0, -1, 0, 10, CHR_SELF, 2) - goto_next(0x0e) - label(0x06) - chr_do_animation(ANIM_TALKING_0232, 0, -1, 0, 10, CHR_SELF, 2) - - beginloop(0x0e) - if_saw_injury(0x00, /*goto*/ 0x2e) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x0e) - - label(0x2d) - if_self_flag_bankx_eq(CHRFLAG0_NOHEAR, TRUE, BANK_0, /*goto*/ 0x2d) - walk_to_pad(PAD_ELD_004F) - goto_next(0x11) - label(0x2d) - walk_to_pad(PAD_ELD_004F) - - beginloop(0x11) - if_saw_injury(0x00, /*goto*/ 0x2e) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x11) - - label(0x2d) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2e) - stop_chr - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_check_takers_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_TAKER1, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_deadish(CHR_TAKER2, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - set_stage_flag(STAGEFLAG_TAKERS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_negotiator[] = { - set_chr_maxdamage(CHR_SELF, 1) - stop_chr - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_TAKERS_DEAD, TRUE, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - run_to_pad(PAD_ELD_004F) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - show_hudmsg(CHR_BOND, L_ELD_013) // "Negotiator has escaped to safety." - set_stage_flag(STAGEFLAG_NEGOTIATOR_ESCAPED) - stop_x_track(XREASON_DEFAULT) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_toggle_snipers[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - goto_next(0x2e) - - // A and SA - label(0x2d) - disable_chr(CHR_SNIPER1) - disable_chr(CHR_SNIPER2) - disable_chr(CHR_SNIPER3) - disable_chr(CHR_SNIPER4) - disable_chr(CHR_SNIPER5) - disable_chr(CHR_SNIPER6) - disable_chr(CHR_SNIPER7) - disable_chr(CHR_SNIPER8) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x06) - endloop(0x08) - - // PA - label(0x2e) - disable_chr(CHR_SNIPER1) - disable_chr(CHR_SNIPER2) - disable_chr(CHR_SNIPER3) - disable_chr(CHR_SNIPER4) - disable_chr(CHR_SNIPER6) - disable_chr(CHR_SNIPER7) - set_ailist(CHR_SNIPER5, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER8, AILIST_ENABLE_SNIPER) - - // Room 0x004e is the dock, ramp, and wooden floor at the top of the ramp. - // @bug: When using small characters or play as Elvis cheats, the height - // criteria is not met so the snipers cannot be unhidden. Fixed in PAL. - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) -#if VERSION >= VERSION_PAL_FINAL - if_chr_y(CHR_P1P2, -550, OPERATOR_LESS_THAN, /*goto*/ 0x2d) -#else - if_chr_y(CHR_P1P2, -500, OPERATOR_LESS_THAN, /*goto*/ 0x2d) -#endif - if_chr_in_room(CHR_P1P2, 0x00, 0x004e, /*goto*/ 0x06) - label(0x2d) - endloop(0x09) - - // All difficulties - label(0x06) - enable_chr(CHR_SNIPER1) - yield - enable_chr(CHR_SNIPER2) - yield - enable_chr(CHR_SNIPER3) - yield - enable_chr(CHR_SNIPER4) - yield - enable_chr(CHR_SNIPER6) - yield - enable_chr(CHR_SNIPER7) - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - goto_next(0x06) - - // A and SA - label(0x2d) - yield - enable_chr(CHR_SNIPER5) - yield - enable_chr(CHR_SNIPER8) - rebuild_teams - rebuild_squadrons - - // All difficulties - label(0x06) - set_ailist(CHR_SNIPER1, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER2, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER3, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER4, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER5, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER6, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER7, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SNIPER8, AILIST_ENABLE_SNIPER) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0404_sniper[] = { - stop_chr - set_shotlist(AILIST_SNIPER) - set_target_chr(CHR_BOND) - if_chr_dead(CHR_SELF, /*goto*/ 0x64) - if_self_flag_bankx_eq(CHRFLAG0_COVER_TYPE2, TRUE, BANK_0, /*goto*/ 0x04) - - beginloop(0x60) - if_near_miss(/*goto*/ 0x04) - if_stage_flag_eq(STAGEFLAG_TAKERS_DEAD, TRUE, /*goto*/ 0x2d) - endloop(0x60) - - label(0x2d) - restart_timer - - beginloop(0x11) - if_near_miss(/*goto*/ 0x04) - if_chr_in_view(/*goto*/ 0x04) - if_timer_gt(300, /*goto*/ 0x04) - endloop(0x11) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x58) - - // Choose a direction to face - call_rng - if_rand_lt(64, /*goto*/ 0x59) - if_rand_lt(128, /*goto*/ 0x5a) - if_rand_lt(196, /*goto*/ 0x5b) - try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0, /*goto*/ 0x06) - reloop(0x04) - - label(0x59) - try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0x4000, /*goto*/ 0x06) - reloop(0x04) - - label(0x5a) - try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0x8000, /*goto*/ 0x06) - reloop(0x04) - - label(0x5b) - try_face_entity(ATTACKFLAG_AIMATDIRECTION, 0xc000, /*goto*/ 0x06) - reloop(0x04) - - // Not actually running to a pad. Just waiting 2 seconds for the change - // in direction, or until detected player. - label(0x06) - restart_timer - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x58) - if_saw_death(0x00, /*goto*/ 0x58) - if_saw_injury(0x00, /*goto*/ 0x58) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - // 2 seconds passed - label(0x06) - restart_timer - - label(0x10) - // 4 in 255 chance of looking around, - // and the animation used is random too. - call_rng - if_rand_gt(3, /*goto*/ 0x0b) - call_rng - if_rand_lt(64, /*goto*/ 0x59) - if_rand_lt(128, /*goto*/ 0x5a) - if_rand_lt(196, /*goto*/ 0x5b) - chr_do_animation(ANIM_LOOK_AROUND_025B, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) - goto_next(0x0b) - label(0x59) - chr_do_animation(ANIM_LOOK_AROUND_025C, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) - goto_next(0x0b) - label(0x5a) - chr_do_animation(ANIM_LOOK_AROUND_025D, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) - goto_next(0x0b) - label(0x5b) - chr_do_animation(ANIM_LOOK_AROUND_025E, 0, -1, CHRANIMFLAG_SLOWUPDATE | CHRANIMFLAG_LOCKPOS, 10, CHR_SELF, 2) - - label(0x0b) - yield - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x58) - if_saw_death(0x00, /*goto*/ 0x58) - if_saw_injury(0x00, /*goto*/ 0x58) - call_rng - if_rand_gt(3, /*goto*/ 0x2d) - if_timer_gt(600, /*goto*/ 0x06) - label(0x2d) - if_chr_idle(/*goto*/ 0x2d) - goto_first(0x10) - - label(0x2d) - goto_first(0x0b) - - label(0x06) - goto_first(0x04) - - // Detected player - label(0x58) - if_can_see_attack_target(/*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - restart_timer - label(0x06) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x08) - reloop(0x04) - - label(0x08) - yield - label(0x06) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - reloop(0x04) - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x09) - - label(0x06) - endloop(0x04) - - label(0x64) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_check_snipers_dead[] = { - beginloop(0x04) - if_chr_dead(CHR_SNIPER1, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER1, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER2, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER2, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER3, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER3, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER4, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER4, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER5, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER5, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER6, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER6, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER7, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER7, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_dead(CHR_SNIPER8, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_SNIPER8, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - show_hudmsg(CHR_BOND, L_ELD_012) // "Snipers have been eliminated." - set_stage_flag(STAGEFLAG_SNIPERS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_cooling_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_COOLING_SWITCH, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_COOLING_SWITCH, TRUE) - if_stage_flag_eq(STAGEFLAG_COOLING_ACTIVE, TRUE, /*goto*/ 0x06) - show_hudmsg(CHR_P1P2, L_ELD_014) // "Cooling systems have been activated." - set_stage_flag(STAGEFLAG_COOLING_ACTIVE) - assign_sound(SFX_8148, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_COOLING_SWITCH, TRUE) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - assign_sound(SFX_811C, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_COOLING_SWITCH, 1, 1200, 1600) - reloop(0x04) - - label(0x06) - mute_channel(CHANNEL_1) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_COOLING_SWITCH, TRUE) - if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, FALSE, /*goto*/ 0x2d) - show_hudmsg(CHR_P1P2, L_ELD_048) // "Operation denied - windmill is active." - goto_next(0x67) - label(0x2d) - assign_sound(SFX_8149, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_COOLING_SWITCH, TRUE) - show_hudmsg(CHR_P1P2, L_ELD_015) // "Cooling systems have been deactivated." - unset_stage_flag(STAGEFLAG_COOLING_ACTIVE) - label(0x67) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func1008_power_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_POWER_SWITCH, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_POWER_SWITCH, TRUE) - if_stage_flag_eq(STAGEFLAG_POWER_ACTIVE, TRUE, /*goto*/ 0x06) - show_hudmsg(CHR_P1P2, L_ELD_016) // "Power systems have been activated." - set_stage_flag(STAGEFLAG_POWER_ACTIVE) - assign_sound(SFX_8148, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_POWER_SWITCH, TRUE) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - assign_sound(SFX_8146, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_POWER_SWITCH, 1, 1200, 1600) - reloop(0x04) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_POWER_SWITCH, TRUE) - if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, FALSE, /*goto*/ 0x2d) - show_hudmsg(CHR_P1P2, L_ELD_048) // "Operation denied - windmill is active." - goto_next(0x67) - label(0x2d) - assign_sound(SFX_8149, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_POWER_SWITCH, TRUE) - show_hudmsg(CHR_P1P2, L_ELD_017) // "Power systems have been deactivated." - unset_stage_flag(STAGEFLAG_POWER_ACTIVE) - label(0x67) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func1009_windmill_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_WINDMILL_SWITCH, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_COOLING_ACTIVE, FALSE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_POWER_ACTIVE, FALSE, /*goto*/ 0x06) - - // Activating - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_WINDMILL_SWITCH, TRUE) - assign_sound(SFX_8148, CHANNEL_2) - control_sound_from_object(CHANNEL_2, OBJ_WINDMILL_SWITCH, TRUE) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - assign_sound(SFX_0438, CHANNEL_2) - play_sound_from_object(CHANNEL_2, OBJ_WINDMILL_SWITCH, 1, 1800, 2400) - show_hudmsg(CHR_P1P2, L_ELD_018) // "Windmill has been reactivated." - yield - set_stage_flag(STAGEFLAG_WINDMILL_ACTIVATED) - set_object_flag2(OBJ_WINDMILL, OBJFLAG2_AICANNOTUSE) - unlock_door(0x06, 0x02) - unlock_door(0x07, 0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Cooling and power not active - label(0x06) - assign_sound(SFX_MENU_SUBFOCUS, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_WINDMILL_SWITCH, TRUE) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func100a_check_switches_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(0x03, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_COOLING_ACTIVE, TRUE, /*goto*/ 0x2d) - show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - if_object_in_good_condition(0x04, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_POWER_ACTIVE, TRUE, /*goto*/ 0x2d) - show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - if_object_in_good_condition(0x05, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, TRUE, /*goto*/ 0x2d) - show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_WINDMILL_SWITCH_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func100b_invoke_hackers[] = { - yield - yield - yield - yield - yield - disable_chr(CHR_HACKER1) - disable_chr(CHR_HACKER2) - disable_chr(CHR_HACKER3) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - goto_next(0x04) - - // A or SA - exit - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // PA - wait for windmill - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_WINDMILL_ACTIVATED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - // Wait 10 seconds - label(0x06) - restart_timer - - beginloop(0x08) - if_timer_gt(600, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - speak(CHR_BOND, L_ELD_022, SFX_819F, CHANNEL_4, COLOR_05_GREEN) // "Joanna! It's Grimshaw. We've got hackers at the vi..." - set_stage_flag(STAGEFLAG_HACKERS_STARTED) - set_object_flag3(0x0b, OBJFLAG3_RTRACKED_YELLOW) - set_object_flag3(0x0d, OBJFLAG3_RTRACKED_YELLOW) - enable_chr(CHR_HACKER1) - yield - enable_chr(CHR_HACKER2) - yield - enable_chr(CHR_HACKER3) - yield - set_ailist(CHR_HACKER1, AILIST_HACKER) - set_ailist(CHR_HACKER2, AILIST_HACKER) - set_ailist(CHR_HACKER3, AILIST_HACKER) - unset_chr_chrflag(CHR_HACKER1, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_HACKER2, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_HACKER3, CHRCFLAG_HIDDEN) - rebuild_teams - rebuild_squadrons - play_x_track(XREASON_DEFAULT, 10, 60) - set_countdown_timer(60) - show_countdown_timer - start_countdown_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_HACKERS_DEAD, TRUE, /*goto*/ 0x2d) - if_countdown_timer_lt(1, /*goto*/ 0x06) - endloop(0x09) - - // Timer expired - label(0x06) - show_hudmsg(CHR_BOND, L_ELD_023) // "Hackers have uploaded vital data." - set_stage_flag(STAGEFLAG_HACKERS_SUCCEEDED) - - // Hackers dead - label(0x2d) - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0406_init_hacker[] = { - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0405_hacker[] = { - chr_do_animation(ANIM_SITTING_TYPING, 0, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_HACKERS_SUCCEEDED, TRUE, /*goto*/ 0x2d) - if_can_see_target(/*goto*/ 0x09) - endloop(0x04) - - // Hackers succeeded - label(0x2d) - run_to_pad(PAD_ELD_0070) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x09) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - // Reached pad - label(0x06) - stop_chr - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Sees player - label(0x09) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func100c_check_hackers_dead[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - - beginloop(0x04) - // Wait for hackers to start - if_stage_flag_eq(STAGEFLAG_HACKERS_STARTED, TRUE, /*goto*/ 0x2d) - reloop(0x04) - - // Wait until they're all dead - label(0x2d) - yield - yield - yield - yield - yield - yield - if_chr_deadish(CHR_HACKER1, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_deadish(CHR_HACKER2, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_deadish(CHR_HACKER3, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - if_stage_flag_eq(STAGEFLAG_HACKERS_SUCCEEDED, TRUE, /*goto*/ 0x2d) - show_hudmsg(CHR_BOND, L_ELD_024) // "Hackers have been eliminated." - set_stage_flag(STAGEFLAG_HACKERS_DEAD) - - // Hackers succeeded - label(0x2d) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_check_objectives_complete[] = { - // @bug: This loop waits until the door is fully open, which allows the - // player to enter the cellar while closing the door behind them and then - // mess with Carrington. - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_door_state(0x09, DOORSTATE_OPEN, /*goto*/ 0x2d) - if_door_state(0x08, DOORSTATE_OPEN, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - show_hudmsg(CHR_P1P2, L_ELD_025) // "Carrington has been rescued." - set_stage_flag(STAGEFLAG_CARRINGTON_RESCUED) - yield - yield - set_invincible(CHR_BOND) - revoke_control(CHR_BOND, 4) - hide_countdown_timer - stop_countdown_timer - if_all_objectives_complete(/*goto*/ 0x5c) - show_hudmsg(CHR_BOND, L_ELD_026) // "All objectives not completed - mission failed." - - // If all objectives aren't complete, the player is shown the message, but - // if the objective completes within the next 4 seconds you pass the level - // anyway. - label(0x2d) - restart_timer - - beginloop(0x5d) - if_timer_gt(280, /*goto*/ 0x5c) - endloop(0x5d) - - label(0x5c) - if_all_objectives_complete(/*goto*/ 0x2d) - - // Mission failed - objectives incomplete - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) - goto_next(0x06) - label(0x2d) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x06) - - // Mission failed - players dead - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_chr_deadish(CHR_CARRINGTON, /*goto*/ 0x2d) - - // Mission complete - set_ailist(CHR_SELF, AILIST_OUTRO) - - // Carrington died... somehow - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_set_pa_negotiator_flag[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_NEGOTIATOR_ESCAPED) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_setup_snipers[] = { - set_chr_special_death_animation(CHR_SNIPER7, SPECIALDIE_FALLBACK) - set_chr_special_death_animation(CHR_SNIPER4, SPECIALDIE_ROLL1) - set_chr_special_death_animation(CHR_SNIPER5, SPECIALDIE_ROLL2) - set_chr_special_death_animation(CHR_SNIPER3, SPECIALDIE_ROLL3) - set_chr_chrflag(CHR_SNIPER3, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER4, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER5, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER7, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER1, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER2, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER6, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_SNIPER8, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_check_guard_subdued[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - - beginloop(0x04) - if_num_subdued(0, OPERATOR_GREATER_THAN, /*goto*/ 0x06) - - // @bug? I think this is supposed to be if_stage_flag_eq... - // CHRFLAG0_ALERT_ON_HEARSPAWN uses the same bitmask as STAGEFLAG_GUARD_CAPTURED. - if_self_flag_bankx_eq(CHRFLAG0_ALERT_ON_HEARSPAWN, FALSE, BANK_0, /*goto*/ 0x66) - unset_stage_flag(STAGEFLAG_GUARD_CAPTURED) - label(0x66) - reloop(0x04) - - // Captured someone - label(0x06) - if_stage_flag_eq(STAGEFLAG_GUARD_CAPTURED, TRUE, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_ELD_029) // "Enemy guard has been subdued." - label(0x2e) -#if VERSION >= VERSION_NTSC_1_0 - unset_stage_flag(STAGEFLAG_FORGOT_TO_KO_GUARD) - yield -#endif - set_stage_flag(STAGEFLAG_GUARD_CAPTURED) - - beginloop(0x67) - if_num_subdued(1, OPERATOR_LESS_THAN, /*goto*/ 0x06) - endloop(0x67) - - label(0x06) - unset_stage_flag(STAGEFLAG_GUARD_CAPTURED) - endloop(0x04) - - // A and SA - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_give_keycard[] = { - set_chr_chrflag(CHR_BASEMENT1, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT2, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT3, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT4, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT5, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT6, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT7, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT8, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_KILLCOUNTABLE) - set_object_flag(OBJ_KEYCARD, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_KEYCARD, OBJFLAG2_INVISIBLE) - - // Wait until one basement guard remaining - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ONE_BASEMENT_GUARD_REMAINING, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - - #define give_keycard_if_alive(chr) \ - if_chr_deadish(chr, /*goto*/ 0x2d) \ - give_object_to_chr(OBJ_KEYCARD, chr) \ - goto_next(0x09) \ - label(0x2d) - - give_keycard_if_alive(CHR_BASEMENT1) - give_keycard_if_alive(CHR_BASEMENT2) - give_keycard_if_alive(CHR_BASEMENT3) - give_keycard_if_alive(CHR_BASEMENT4) - give_keycard_if_alive(CHR_BASEMENT5) - give_keycard_if_alive(CHR_BASEMENT6) - give_keycard_if_alive(CHR_BASEMENT7) - give_keycard_if_alive(CHR_BASEMENT8) - - give_object_to_chr(OBJ_KEYCARD, CHR_BASEMENT9) - goto_next(0x09) - label(0x2d) - - // Gave key - label(0x09) - unset_object_flag(OBJ_KEYCARD, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_KEYCARD, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_check_computers_destroyed[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) - - beginloop(0x04) - if_object_in_good_condition(OBJ_HACKERPC1, /*goto*/ 0x2d) - goto_next(0x08) - label(0x2d) - if_object_in_good_condition(OBJ_HACKERPC2, /*goto*/ 0x2d) - goto_next(0x08) - label(0x2d) - if_object_in_good_condition(OBJ_HACKERPC3, /*goto*/ 0x2d) - goto_next(0x08) - label(0x2d) - if_object_in_good_condition(OBJ_HACKERPC4, /*goto*/ 0x2d) - goto_next(0x08) - label(0x2d) - endloop(0x04) - - label(0x08) - show_hudmsg(CHR_BOND, L_ELD_021) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_HACKER_PC_DESTROYED) - label(0x09) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_guard(accuracy, reaction, health, recovery) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(accuracy) \ - set_reaction_speed(reaction) \ - set_chr_maxdamage(CHR_SELF, health) \ - add_health_or_armor(0) \ - set_recovery_speed(recovery) \ - set_shield(0) - -u8 func040a_enable_sniper[] = { - init_guard(13, 15, 10, 15) - set_ailist(CHR_SELF, AILIST_SNIPER) - endlist -}; - -u8 func040c_init_type1_guard[] = { - init_guard(3, 15, 40, 0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040d_init_type2_guard[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - init_guard(15, 15, 40, 0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - label(0x2d) - init_guard(3, 15, 40, 0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040b_init_basement_guard[] = { - init_guard(13, 15, 40, 10) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1016_msg_generator[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0077, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - speak(CHR_P1P2, L_ELD_035, MP3_03AC, CHANNEL_6, COLOR_09_BLUE) // "If I get the wind generator back online, I'll get ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_msg_gottobequick[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - restart_timer - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - speak(CHR_BOND, L_ELD_036, MP3_03AD, CHANNEL_6, COLOR_09_BLUE) // "I've got to be quick, or they'll kill the negotiat..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_msg_hidingdaniel[] = { - // Wait for windmill activated - beginloop(0x04) - if_objective_complete(2, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) - if_objective_complete(3, /*goto*/ 0x08) // hackers objective - endloop(0x04) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - speak(CHR_P1P2, L_ELD_037, MP3_03AE, CHANNEL_6, COLOR_09_BLUE) // "Here's where they must be holding Daniel." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1019_msg_hackershavetobestopped[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_HACKERS_STARTED, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(450, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - speak(CHR_BOND, L_ELD_038, MP3_03AF, CHANNEL_6, COLOR_09_BLUE) // "Those hackers have to be stopped before I rescue D..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040e_start_path00[] = { - init_guard(3, 15, 40, 0) - assign_path(0) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040f_start_path01[] = { - init_guard(3, 15, 40, 0) - assign_path(1) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func101b_toggle_basement_chrs[] = { - yield - yield - disable_chr(CHR_BASEMENT1) - disable_chr(CHR_BASEMENT2) - disable_chr(CHR_BASEMENT3) - disable_chr(CHR_BASEMENT4) - disable_chr(CHR_BASEMENT5) - disable_chr(CHR_BASEMENT6) - disable_chr(CHR_BASEMENT7) - disable_chr(CHR_BASEMENT8) - disable_chr(CHR_CARRINGTON) - - // Not sure which room 0x0087 is - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0087, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - enable_chr(CHR_BASEMENT1) - yield - enable_chr(CHR_BASEMENT2) - yield - enable_chr(CHR_BASEMENT3) - yield - enable_chr(CHR_BASEMENT4) - yield - enable_chr(CHR_BASEMENT5) - yield - enable_chr(CHR_BASEMENT6) - yield - enable_chr(CHR_BASEMENT7) - yield - enable_chr(CHR_BASEMENT8) - yield - yield - enable_chr(CHR_CARRINGTON) - yield - rebuild_teams - rebuild_squadrons - - // Every 5 frames, check if the wine bottles are destroyed. - // There's a lot of stuff going on here without yielding. If you destroyed - // all bottles except 0x88 then you might have a choppy experience. - label(0x08) - restart_timer - - beginloop(0x09) - if_timer_gt(5, /*goto*/ 0x2d) - goto_first(0x09) - - label(0x2d) - if_object_in_good_condition(0x1e, /*goto*/ 0x06) - if_object_in_good_condition(0x1f, /*goto*/ 0x06) - if_object_in_good_condition(0x20, /*goto*/ 0x06) - if_object_in_good_condition(0x21, /*goto*/ 0x06) - if_object_in_good_condition(0x22, /*goto*/ 0x06) - if_object_in_good_condition(0x23, /*goto*/ 0x06) - if_object_in_good_condition(0x24, /*goto*/ 0x06) - if_object_in_good_condition(0x25, /*goto*/ 0x06) - if_object_in_good_condition(0x26, /*goto*/ 0x06) - if_object_in_good_condition(0x27, /*goto*/ 0x06) - if_object_in_good_condition(0x28, /*goto*/ 0x06) - if_object_in_good_condition(0x29, /*goto*/ 0x06) - if_object_in_good_condition(0x2a, /*goto*/ 0x06) - if_object_in_good_condition(0x2b, /*goto*/ 0x06) - if_object_in_good_condition(0x2c, /*goto*/ 0x06) - if_object_in_good_condition(0x2d, /*goto*/ 0x06) - if_object_in_good_condition(0x2e, /*goto*/ 0x06) - if_object_in_good_condition(0x2f, /*goto*/ 0x06) - if_object_in_good_condition(0x30, /*goto*/ 0x06) - if_object_in_good_condition(0x31, /*goto*/ 0x06) - if_object_in_good_condition(0x32, /*goto*/ 0x06) - if_object_in_good_condition(0x33, /*goto*/ 0x06) - if_object_in_good_condition(0x34, /*goto*/ 0x06) - if_object_in_good_condition(0x35, /*goto*/ 0x06) - if_object_in_good_condition(0x36, /*goto*/ 0x06) - if_object_in_good_condition(0x37, /*goto*/ 0x06) - if_object_in_good_condition(0x38, /*goto*/ 0x06) - if_object_in_good_condition(0x39, /*goto*/ 0x06) - if_object_in_good_condition(0x3a, /*goto*/ 0x06) - if_object_in_good_condition(0x3b, /*goto*/ 0x06) - if_object_in_good_condition(0x3c, /*goto*/ 0x06) - if_object_in_good_condition(0x3d, /*goto*/ 0x06) - if_object_in_good_condition(0x3e, /*goto*/ 0x06) - if_object_in_good_condition(0x3f, /*goto*/ 0x06) - if_object_in_good_condition(0x40, /*goto*/ 0x06) - if_object_in_good_condition(0x41, /*goto*/ 0x06) - if_object_in_good_condition(0x42, /*goto*/ 0x06) - if_object_in_good_condition(0x43, /*goto*/ 0x06) - if_object_in_good_condition(0x44, /*goto*/ 0x06) - if_object_in_good_condition(0x45, /*goto*/ 0x06) - if_object_in_good_condition(0x46, /*goto*/ 0x06) - if_object_in_good_condition(0x47, /*goto*/ 0x06) - if_object_in_good_condition(0x48, /*goto*/ 0x06) - if_object_in_good_condition(0x49, /*goto*/ 0x06) - if_object_in_good_condition(0x4a, /*goto*/ 0x06) - if_object_in_good_condition(0x4b, /*goto*/ 0x06) - if_object_in_good_condition(0x4c, /*goto*/ 0x06) - if_object_in_good_condition(0x4d, /*goto*/ 0x06) - if_object_in_good_condition(0x4e, /*goto*/ 0x06) - if_object_in_good_condition(0x4f, /*goto*/ 0x06) - if_object_in_good_condition(0x50, /*goto*/ 0x06) - if_object_in_good_condition(0x51, /*goto*/ 0x06) - if_object_in_good_condition(0x52, /*goto*/ 0x06) - if_object_in_good_condition(0x53, /*goto*/ 0x06) - if_object_in_good_condition(0x54, /*goto*/ 0x06) - if_object_in_good_condition(0x55, /*goto*/ 0x06) - if_object_in_good_condition(0x56, /*goto*/ 0x06) - if_object_in_good_condition(0x57, /*goto*/ 0x06) - if_object_in_good_condition(0x58, /*goto*/ 0x06) - if_object_in_good_condition(0x59, /*goto*/ 0x06) - if_object_in_good_condition(0x5a, /*goto*/ 0x06) - if_object_in_good_condition(0x5b, /*goto*/ 0x06) - if_object_in_good_condition(0x5c, /*goto*/ 0x06) - if_object_in_good_condition(0x5d, /*goto*/ 0x06) - if_object_in_good_condition(0x5e, /*goto*/ 0x06) - if_object_in_good_condition(0x5f, /*goto*/ 0x06) - if_object_in_good_condition(0x60, /*goto*/ 0x06) - if_object_in_good_condition(0x61, /*goto*/ 0x06) - if_object_in_good_condition(0x62, /*goto*/ 0x06) - if_object_in_good_condition(0x63, /*goto*/ 0x06) - if_object_in_good_condition(0x64, /*goto*/ 0x06) - if_object_in_good_condition(0x65, /*goto*/ 0x06) - if_object_in_good_condition(0x66, /*goto*/ 0x06) - if_object_in_good_condition(0x67, /*goto*/ 0x06) - if_object_in_good_condition(0x68, /*goto*/ 0x06) - if_object_in_good_condition(0x69, /*goto*/ 0x06) - if_object_in_good_condition(0x6a, /*goto*/ 0x06) - if_object_in_good_condition(0x6b, /*goto*/ 0x06) - if_object_in_good_condition(0x6c, /*goto*/ 0x06) - if_object_in_good_condition(0x6d, /*goto*/ 0x06) - if_object_in_good_condition(0x6e, /*goto*/ 0x06) - if_object_in_good_condition(0x6f, /*goto*/ 0x06) - if_object_in_good_condition(0x70, /*goto*/ 0x06) - if_object_in_good_condition(0x71, /*goto*/ 0x06) - if_object_in_good_condition(0x72, /*goto*/ 0x06) - if_object_in_good_condition(0x73, /*goto*/ 0x06) - if_object_in_good_condition(0x74, /*goto*/ 0x06) - if_object_in_good_condition(0x75, /*goto*/ 0x06) - if_object_in_good_condition(0x76, /*goto*/ 0x06) - if_object_in_good_condition(0x77, /*goto*/ 0x06) - if_object_in_good_condition(0x78, /*goto*/ 0x06) - if_object_in_good_condition(0x79, /*goto*/ 0x06) - if_object_in_good_condition(0x7a, /*goto*/ 0x06) - if_object_in_good_condition(0x7b, /*goto*/ 0x06) - if_object_in_good_condition(0x7c, /*goto*/ 0x06) - if_object_in_good_condition(0x7d, /*goto*/ 0x06) - if_object_in_good_condition(0x7e, /*goto*/ 0x06) - if_object_in_good_condition(0x7f, /*goto*/ 0x06) - if_object_in_good_condition(0x80, /*goto*/ 0x06) - if_object_in_good_condition(0x81, /*goto*/ 0x06) - if_object_in_good_condition(0x82, /*goto*/ 0x06) - if_object_in_good_condition(0x83, /*goto*/ 0x06) - if_object_in_good_condition(0x84, /*goto*/ 0x06) - if_object_in_good_condition(0x85, /*goto*/ 0x06) - if_object_in_good_condition(0x86, /*goto*/ 0x06) - if_object_in_good_condition(0x87, /*goto*/ 0x06) - if_object_in_good_condition(0x88, /*goto*/ 0x06) - play_sound(MP3_07CB, -1) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x06) - goto_first(0x08) - - endlist -}; - -/** - * This function hides guards inside the villa on A and SA, then unhides them - * once you approach the villa. - */ -u8 func101c_toggle_villa_guards[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // A and SA - label(0x2d) - disable_chr(0x23) - disable_chr(0x24) - disable_chr(0x25) - disable_chr(0x26) - disable_chr(0x27) - disable_chr(0x28) - disable_chr(0x29) - disable_chr(0x2a) - disable_chr(0x2b) - disable_chr(0x2c) - disable_chr(0x2d) - disable_chr(0x2e) - disable_chr(0x2f) - disable_chr(0x30) - disable_chr(0x31) - disable_chr(0x32) - disable_chr(0x33) - disable_chr(0x34) - disable_chr(0x35) - disable_chr(0x36) - disable_chr(0x37) - disable_chr(0x38) - disable_chr(0x39) - disable_chr(0x3a) - disable_chr(0x3b) - disable_chr(0x3c) - disable_chr(0x3d) - disable_chr(0x3e) - disable_chr(0x3f) - disable_chr(0x40) - disable_chr(0x41) - disable_chr(0x42) - - // @bug: It is possible to cross room 0x002a in a single frame on coop if - // hugging the corner tightly, which means the guards will not be unhidden. - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x002a, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - enable_chr(0x23) - yield - enable_chr(0x24) - yield - enable_chr(0x25) - yield - enable_chr(0x26) - yield - enable_chr(0x27) - yield - enable_chr(0x28) - yield - enable_chr(0x29) - yield - enable_chr(0x2a) - yield - enable_chr(0x2b) - yield - enable_chr(0x2c) - yield - enable_chr(0x2d) - yield - enable_chr(0x2e) - yield - enable_chr(0x2f) - yield - enable_chr(0x30) - yield - enable_chr(0x31) - yield - enable_chr(0x32) - yield - enable_chr(0x33) - yield - enable_chr(0x34) - yield - enable_chr(0x35) - yield - enable_chr(0x36) - yield - enable_chr(0x37) - yield - enable_chr(0x38) - yield - enable_chr(0x39) - yield - enable_chr(0x3a) - yield - enable_chr(0x3b) - yield - enable_chr(0x3c) - yield - enable_chr(0x3d) - yield - enable_chr(0x3e) - yield - enable_chr(0x3f) - yield - enable_chr(0x40) - yield - enable_chr(0x41) - yield - enable_chr(0x42) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_dual_cmp150[] = { - // Probable @bug: This timer starts from the start of the intro cinema, - // rather than from when you take control of Jo. - yield - restart_timer - - // Wait 38.3 seconds or for CMP150 sniper to die - beginloop(0x04) - if_chr_dead(CHR_SNIPER7, /*goto*/ 0x2d) - if_timer_gt(2300, /*goto*/ 0x06) - endloop(0x04) - - label(0x2d) - pause_timer - play_sound(SFX_M0_MY_GUN, -1) // "My gun!" - - beginloop(0x08) - if_chr_death_animation_finished(0x06, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - unset_object_flag(OBJ_CMP150_1, OBJFLAG_UNCOLLECTABLE) - unset_object_flag(OBJ_CMP150_2, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_CMP150_1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_CMP150_1, OBJFLAG2_INVISIBLE) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0407_init_sniper[] = { - set_chr_maxdamage(CHR_SELF, 1) - stop_chr - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0410_carrington[] = { - yield - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_chr_maxdamage(CHR_SELF, 1) - chr_do_animation(ANIM_CUT_ELD_OUTRO_CARR, 1, 1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 2) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Unlock exterior doors on SA and PA. - */ -u8 func101e_unlock_doors[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - unlock_door(0x90, 0x80) - unlock_door(0x91, 0x80) - unlock_door(0x92, 0x80) - unlock_door(0x93, 0x80) - unlock_door(0x94, 0x80) - unlock_door(0x95, 0x80) - unlock_door(0x96, 0x80) - unlock_door(0x97, 0x80) - unlock_door(0x98, 0x80) - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_check_one_basement_guard_remaining[] = { - #define inc_var_if_chr_dead(chr) \ - if_chr_deadish(chr, /*goto*/ 0x2d) \ - goto_next(0x06) \ - label(0x2d) \ - add_morale(1) \ - label(0x06) - - beginloop(0x04) - set_morale(0) - - inc_var_if_chr_dead(CHR_BASEMENT1) - inc_var_if_chr_dead(CHR_BASEMENT2) - inc_var_if_chr_dead(CHR_BASEMENT3) - inc_var_if_chr_dead(CHR_BASEMENT4) - inc_var_if_chr_dead(CHR_BASEMENT5) - inc_var_if_chr_dead(CHR_BASEMENT6) - inc_var_if_chr_dead(CHR_BASEMENT7) - inc_var_if_chr_dead(CHR_BASEMENT8) - inc_var_if_chr_dead(CHR_BASEMENT9) - - if_morale_lt(8, /*goto*/ 0x2d) - set_stage_flag(STAGEFLAG_ONE_BASEMENT_GUARD_REMAINING) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2d) - endloop(0x04) - - endlist -}; - -/** - * Counterop only. - */ -u8 func1420_setup_portals[] = { - yield - set_room_flag(0x0050, ROOMFLAG_0800) - set_room_flag(0x0052, ROOMFLAG_0800) - set_room_flag(0x006c, ROOMFLAG_0800) - set_room_flag(0x004d, ROOMFLAG_0800) - set_room_flag(0x0065, ROOMFLAG_0800) - set_room_flag(0x0059, ROOMFLAG_0800) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1423_setup_environment[] = { - yield - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0049, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0050, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0050, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0051, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0053, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0053, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0054, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0056, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0056, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0057, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x005a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x005c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x005d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x005e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x005f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0060, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0061, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0061, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0062, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0062, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0063, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0064, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0065, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0066, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0068, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0069, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x006f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0070, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0070, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0071, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0071, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1021_toggle_last_basement_guard[] = { - set_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_INVINCIBLE) - - beginloop(0x04) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) - if_objective_complete(0, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - if_objective_complete(1, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_objective_complete(2, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - if_objective_complete(3, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - if_objective_complete(4, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - unset_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BASEMENT9, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_setup_rtracker[] = { - yield - set_object_flag3(OBJ_CMP150_1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_CMP150_2, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_DEVASTATOR, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0411_cisoldier[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - chr_drop_weapon(CHR_SELF) - label(0x08) - yield - chr_do_animation(ANIM_0487, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CISOLDIER, 2) - yield - yield - yield - kill(CHR_CISOLDIER) - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * On PA, mark some guards so that AI buddies will not shoot at them. - */ -u8 func1024_set_chr_flags_on_pa[] = { - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2d) - set_chr_hiddenflag(CHR_TAKER1, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x0a, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x23, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x2f, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x34, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x37, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(0x3e, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(CHR_BASEMENT6, CHRHFLAG_DONTSHOOTME) - set_chr_hiddenflag(CHR_BASEMENT8, CHRHFLAG_DONTSHOOTME) - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#if VERSION >= VERSION_NTSC_1_0 -u8 func1025_check_basement_entered_without_subdue[] = { - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - - beginloop(0x04) - if_objective_complete(4, /*goto*/ 0x0c) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0087, /*goto*/ 0x06) - label(0x0c) - endloop(0x04) - - label(0x06) - show_hudmsg(CHR_P1P2, L_ELD_049) // "Mission unsuccessful - enemy guard not captured." - set_stage_flag(STAGEFLAG_FORGOT_TO_KO_GUARD) - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; -#endif - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_give_items, 0x1003 }, - { func1004_check_negotiator, 0x1004 }, - { func1005_toggle_snipers, 0x1005 }, - { func1006_check_snipers_dead, 0x1006 }, - { func1007_cooling_switch, 0x1007 }, - { func1008_power_switch, 0x1008 }, - { func1009_windmill_switch, 0x1009 }, - { func100a_check_switches_destroyed, 0x100a }, - { func100b_invoke_hackers, 0x100b }, - { func100c_check_hackers_dead, 0x100c }, - { func100e_check_objectives_complete, 0x100e }, - { func100f_check_takers_dead, 0x100f }, - { func1010_set_pa_negotiator_flag, 0x1010 }, - { func1011_setup_snipers, 0x1011 }, - { func1013_check_guard_subdued, 0x1013 }, - { func1014_give_keycard, 0x1014 }, - { func1015_check_computers_destroyed, 0x1015 }, - { func1016_msg_generator, 0x1016 }, - { func1017_msg_gottobequick, 0x1017 }, - { func1018_msg_hidingdaniel, 0x1018 }, - { func1019_msg_hackershavetobestopped, 0x1019 }, - { func101b_toggle_basement_chrs, 0x101b }, - { func101c_toggle_villa_guards, 0x101c }, - { func101d_dual_cmp150, 0x101d }, - { func101e_unlock_doors, 0x101e }, - { func101f_check_one_basement_guard_remaining, 0x101f }, - { func1420_setup_portals, 0x1420 }, - { func1021_toggle_last_basement_guard, 0x1021 }, - { func1022_setup_rtracker, 0x1022 }, - { func1423_setup_environment, 0x1423 }, - { func1024_set_chr_flags_on_pa, 0x1024 }, -#if VERSION >= VERSION_NTSC_1_0 - { func1025_check_basement_entered_without_subdue, 0x1025 }, -#endif - { func1002_intro, 0x0c00 }, - { func1002_intro_from_menu, 0x0c01 }, - { func0c02_outro_from_menu, 0x0c02 }, - { func0401_init_taker, 0x0401 }, - { func0402_taker, 0x0402 }, - { func0403_negotiator, 0x0403 }, - { func0404_sniper, 0x0404 }, - { func0405_hacker, 0x0405 }, - { func0406_init_hacker, 0x0406 }, - { func0407_init_sniper, 0x0407 }, - { func0408_outro, 0x0408 }, - { func1002_intro, 0x0409 }, - { func040a_enable_sniper, 0x040a }, - { func040b_init_basement_guard, 0x040b }, - { func040c_init_type1_guard, 0x040c }, - { func040d_init_type2_guard, 0x040d }, - { func040e_start_path00, 0x040e }, - { func040f_start_path01, 0x040f }, - { func0410_carrington, 0x0410 }, - { func0411_cisoldier, 0x0411 }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, 0 }, diff --git a/src/setups/setupimp.c b/src/setups/setupimp.c index 5e9ba610a..4145379fe 100644 --- a/src/setups/setupimp.c +++ b/src/setups/setupimp.c @@ -153,7 +153,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -554,3538 +554,6 @@ s32 path00[] = { -1, }; -u8 func1001_objectives_failed_msg[] = { - yield - give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) - give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) - - label(0x2e) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_DEVICE_F, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_INFO_M, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_HOLO, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HANGARGUY, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_DEVICE_M, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_INFO_F, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x09, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0a, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_UNEXPLODABLE) - set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_UNEXPLODABLE) - set_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_UNEXPLODABLE) - set_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -#define spawner_logic(initfunc, clonefunc) \ - set_self_chrflag(CHRCFLAG_CLONEABLE) \ - set_self_chrflag(CHRCFLAG_HIDDEN) \ - set_self_chrflag(CHRCFLAG_00040000) \ - \ - beginloop(0x0f) \ - if_stage_flag_eq(STAGEFLAG_TRIGGER_SPAWNING, TRUE, /*goto*/ 0x04) \ - endloop(0x0f) \ - \ - beginloop(0x04) \ - if_never_been_onscreen(/*goto*/ 0x4f) \ - if_can_see_target(/*goto*/ 0x0a) \ - reloop(0x04) \ - \ - label(0x0a) \ - set_ailist(CHR_SELF, clonefunc) \ - \ - label(0x4f) \ - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) \ - reloop(0x04) \ - \ - label(0x4f) \ - try_spawn_clone2(CHR_SELF, initfunc, 0, /*goto*/ 0x2e) \ - set_ailist(CHR_SELF, clonefunc) \ - label(0x2e) \ - yield \ - endloop(0x04) - -#define initclone_logic(templatechr, clonefunc) \ - set_chr_dodge_rating(2, 0) \ - set_accuracy(20) \ - set_reaction_speed(70) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(90) \ - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) \ - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) \ - label(0x04) \ - try_inherit_properties(templatechr, /*goto*/ 0x08) \ - label(0x08) \ - set_chr_team(CHR_SELF, TEAM_ENEMY) \ - rebuild_teams \ - rebuild_squadrons \ - set_ailist(CHR_SELF, clonefunc) - -// Spawn clones in autogun hall dead end room -u8 func0401_spawner1[] = { - spawner_logic(AILIST_INIT_CLONE1, AILIST_CLONE1) - endlist -}; - -u8 func0403_init_clone1[] = { - initclone_logic(0x0b, AILIST_CLONE1) - endlist -}; - -u8 func0402_clone1[] = { -#if VERSION >= VERSION_NTSC_1_0 - unset_self_chrflag(CHRCFLAG_INVINCIBLE) -#endif - run_to_pad(PAD_IMP_00C2) - set_returnlist(CHR_SELF, AILIST_CLONE1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -// Spawn clones in vehicle maintenance area - assigned to two spawners -u8 func0404_spawner2[] = { - spawner_logic(AILIST_INIT_CLONE2, AILIST_CLONE2) - endlist -}; - -u8 func0406_init_clone2[] = { - initclone_logic(0x0d, AILIST_CLONE2) - endlist -}; - -u8 func0405_clone2[] = { - run_to_pad(PAD_IMP_00B1) - set_returnlist(CHR_SELF, AILIST_CLONE2) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -// Spawn clones in room with pit near autogun switches -u8 func0407_spawner3[] = { - spawner_logic(AILIST_INIT_CLONE3, AILIST_CLONE3) - endlist -}; - -u8 func0409_init_clone3[] = { - initclone_logic(0x0f, AILIST_CLONE3) - endlist -}; - -u8 func0408_clone3[] = { - run_to_pad(PAD_IMP_00AF) - set_returnlist(CHR_SELF, AILIST_CLONE3) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Assigned to CI soldiers, Jon and hangar guy - */ -u8 func0413_defend_pad[] = { - set_shotlist(AILIST_DEFEND_PAD) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x08) - - // Distance to pad >= 200 - label(0x03) - jog_to_pad(PAD_PRESET) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x08) - endloop(0x04) - - // At pad - label(0x08) - stop_chr - - beginloop(0x0b) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - goto_first(0x03) - - // Detected enemy - label(0x0a) - set_shotlist(AILIST_DEFEND_PAD) - set_returnlist(CHR_SELF, AILIST_DEFEND_PAD) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func100b_setup_autoguns[] = { - yield - - // Make autoguns shoot at everyone except good people - set_autogun_target_team(OBJ_AUTOGUN1, 0xff & ~TEAM_ALLY) - set_autogun_target_team(OBJ_AUTOGUN2, 0xff & ~TEAM_ALLY) - set_autogun_target_team(OBJ_AUTOGUN3, 0xff & ~TEAM_ALLY) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2f) - - // SA and PA only - restart_timer - - beginloop(0x71) - if_timer_gt(120, /*goto*/ 0x2e) - endloop(0x71) - - label(0x2e) - set_object_flag(OBJ_AUTOGUN1, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_AUTOGUN2, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_AUTOGUN3, OBJFLAG_DEACTIVATED) - - label(0x2f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_check_hostages_killed[] = { - set_chr_chrflag(CHR_HOSTAGE_DEVICE_F, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_HOSTAGE_INFO_M, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_HOSTAGE_HOLO, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_HOSTAGE_DEVICE_M, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_HOSTAGE_INFO_F, CHRCFLAG_KILLCOUNTABLE) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0b) - - // PA - beginloop(0x0c) - if_kill_count_gt(2, /*goto*/ 0x08) - endloop(0x0c) - - // Agent - beginloop(0x0a) - if_kill_count_gt(4, /*goto*/ 0x08) - endloop(0x0a) - - // SA - beginloop(0x0b) - if_kill_count_gt(3, /*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - if_stage_flag_eq(STAGEFLAG_ENOUGH_HOSTAGES_SAVED, TRUE, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_TOO_MANY_HOSTAGES_KILLED) - show_hudmsg(CHR_BOND, L_IMP_016) // "Too many hostages killed." - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_check_safeinfo_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_SAFEINFO, /*goto*/ 0x2e) - goto_next(0x08) - - label(0x2e) - endloop(0x04) - - label(0x08) - show_hudmsg(CHR_BOND, L_IMP_018) // "Sensitive information has been destroyed." - set_stage_flag(STAGEFLAG_SAFEINFO_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define autogun_switch_logic(switch, autogun, stageflag) \ - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) \ - \ - beginloop(0x04) \ - chr_toggle_p1p2(CHR_SELF) \ - if_object_in_good_condition(switch, /*goto*/ 0x2e) \ - goto_next(0x0b) \ - \ - label(0x2e) \ - if_object_in_good_condition(autogun, /*goto*/ 0x2e) \ - goto_next(0x0b) \ - \ - label(0x2e) \ - if_chr_activated_object(CHR_P1P2, switch, /*goto*/ 0x08) \ - endloop(0x04) \ - \ - /* Switch activated */ \ - label(0x08) \ - play_sound(SFX_043A, CHANNEL_7) \ - show_hudmsg(CHR_P1P2, 0x220f) /* "Automatic gun activated." */ \ - label(0x0e) \ - unset_object_flag(autogun, OBJFLAG_DEACTIVATED) \ - set_stage_flag(stageflag) \ - \ - beginloop(0x0f) \ - if_object_in_good_condition(autogun, /*goto*/ 0x2e) \ - goto_next(0x0b) \ - \ - label(0x2e) \ - endloop(0x0f) \ - \ - /* Autogun or switch destroyed */ \ - label(0x0b) \ - if_difficulty_lt(DIFF_SA, /*goto*/ 0x11) \ - show_hudmsg(CHR_BOND, 0x2222) /* "Critical mission object has been destroyed." */ \ - set_stage_flag(STAGEFLAG_AUTOGUN_SWITCH_DESTROYED) - -u8 func1007_autogun_switch1[] = { - autogun_switch_logic(OBJ_AUTOGUN_SWITCH1, OBJ_AUTOGUN1, STAGEFLAG_AUTOGUN1_ACTIVE) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x11) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_autogun_switch2[] = { - autogun_switch_logic(OBJ_AUTOGUN_SWITCH2, OBJ_AUTOGUN2, STAGEFLAG_AUTOGUN2_ACTIVE) - label(0x11) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_autogun_switch3[] = { - autogun_switch_logic(OBJ_AUTOGUN_SWITCH3, OBJ_AUTOGUN3, STAGEFLAG_AUTOGUN3_ACTIVE) - label(0x11) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c01_outro[] = { - camera_movement(ANIM_CUT_IMP_OUTRO_CAM_01) - play_cutscene_track(MUSIC_DEFENSE_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_OUTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - #define show_object_with_animation(object, animation) \ - enable_object(object) \ - set_object_flag2(object, OBJFLAG2_04000000) \ - set_object_flag3(object, OBJFLAG3_00000010) \ - object_do_animation(animation, object, 0x04, 0xffff) - - show_object_with_animation(0x0e, ANIM_CUT_IMP_OUTRO_CRATE1_01) - show_object_with_animation(0x0f, ANIM_CUT_IMP_OUTRO_CRATE2_01) - show_object_with_animation(0x10, ANIM_CUT_IMP_OUTRO_CRATE3_01) - show_object_with_animation(0x11, ANIM_CUT_IMP_OUTRO_CRATE4_01) - show_object_with_animation(0x12, ANIM_CUT_IMP_OUTRO_CRATE5_01) - show_object_with_animation(0x13, ANIM_CUT_IMP_OUTRO_CRATE6_01) - show_object_with_animation(0x14, ANIM_CUT_IMP_OUTRO_CRATE7_01) - - enable_object(0x0d) - unset_object_flag(0x0d, OBJFLAG_DEACTIVATED) - set_object_flag2(0x0d, OBJFLAG2_04000000) - set_object_flag3(0x0d, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_OUTRO_DROPSHIP_01, 0x0d, 0x01, 0xffff) - - show_nonessential_chrs(FALSE) - open_door(0x51) - restart_timer - yield - set_object_flag(0x51, OBJFLAG_DOOR_KEEPOPEN) - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_AR34, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0xb8) \ - if_timer_gt(time, /*goto*/ 0x08) \ - endloop(loopid) \ - label(0x08) - - wait_until(86, 0x73) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(114, 0x74) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(140, 0x75) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(168, 0x76) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(186, 0x77) - play_sound(SFX_0161, CHANNEL_10) - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0xb8) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0xb8) - label(0x2e) - endloop(0x0a) - - label(0xb8) - mute_channel(CHANNEL_10) - disable_object(0x0d) - camera_movement(ANIM_CUT_IMP_OUTRO_CAM_02) - unset_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_HIDDEN) - - set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SKEDAR1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_OUTRO_SKEDAR1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR1, 4) - - set_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SKEDAR2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_OUTRO_SKEDAR2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR2, 4) - - wait_until(16, 0x78) - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until(56, 0x79) - play_sound(SFX_SKEDAR_ROAR_052B, CHANNEL_10) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0xb8) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0xb8) - label(0x2e) - endloop(0x0b) - - label(0xb8) - mute_channel(CHANNEL_10) - camera_movement(ANIM_CUT_IMP_OUTRO_CAM_03) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_OUTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - show_object_with_animation(0x0e, ANIM_CUT_IMP_OUTRO_CRATE1_02) - show_object_with_animation(0x0f, ANIM_CUT_IMP_OUTRO_CRATE2_02) - show_object_with_animation(0x10, ANIM_CUT_IMP_OUTRO_CRATE3_02) - show_object_with_animation(0x11, ANIM_CUT_IMP_OUTRO_CRATE4_02) - show_object_with_animation(0x12, ANIM_CUT_IMP_OUTRO_CRATE5_02) - show_object_with_animation(0x13, ANIM_CUT_IMP_OUTRO_CRATE6_02) - show_object_with_animation(0x14, ANIM_CUT_IMP_OUTRO_CRATE7_02) - show_object_with_animation(0x0d, ANIM_CUT_IMP_OUTRO_DROPSHIP_02) - - enable_object(0x16) - set_object_flag2(0x16, OBJFLAG2_04000000) - set_object_flag3(0x16, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_OUTRO_LASER1, 0x16, 0x02, 0xffff) - - wait_until(372, 0x7a) - play_sound(SFX_0506, CHANNEL_10) - - wait_until(382, 0x7b) - play_sound(SFX_0048, CHANNEL_10) - - wait_until(390, 0x7c) - play_sound(SFX_0506, CHANNEL_10) - - wait_until(400, 0x7d) - play_sound(SFX_0049, CHANNEL_10) - - wait_until(432, 0x7e) - play_sound(SFX_0506, CHANNEL_10) - - wait_until(442, 0x7f) - play_sound(SFX_00D0, CHANNEL_10) - - wait_until(454, 0x80) - play_sound(SFX_0506, CHANNEL_10) - - wait_until(464, 0x81) - play_sound(SFX_0078, CHANNEL_10) - - wait_until(466, 0x82) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(484, 0x83) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(502, 0x84) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(516, 0x85) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(528, 0x86) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(570, 0x71) - speak(CHR_BOND, L_IMP_049, MP3_047D, CHANNEL_10, COLOR_09_BLUE) // "Get clear! I'll hold them off... You can come back..." - - wait_until(847, 0x87) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(852, 0x88) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(865, 0x72) - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, FALSE) - - wait_until(870, 0x89) - - label(0x8a) - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - if_controller_button_pressed(/*goto*/ 0xb8) - if_timer_gt(960, /*goto*/ 0x08) - goto_first(0x8a) - - label(0x08) - set_chr_shooting_in_cutscene(CHR_BOND, FALSE) - speak(CHR_BOND, L_IMP_050, MP3_047E, CHANNEL_10, COLOR_09_BLUE) // "At least, I hope you can." - - wait_until(1018, 0x8c) - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, FALSE) - - wait_until(1065, 0x94) - play_sound(SFX_SKEDAR_ROAR_052B, CHANNEL_7) - - label(0x0c) - yield - if_camera_animating(/*goto*/ 0x2e) - goto_next(0xb8) - label(0x2e) - if_controller_button_pressed(/*goto*/ 0xb8) - label(0x2e) - goto_first(0x0c) - - label(0xb8) - mute_channel(CHANNEL_10) - camera_movement(ANIM_CUT_IMP_OUTRO_CAM_04) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_OUTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SKEDAR1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_OUTRO_SKEDAR1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR1, 4) - - show_object_with_animation(0x0e, ANIM_CUT_IMP_OUTRO_CRATE1_03) - show_object_with_animation(0x0f, ANIM_CUT_IMP_OUTRO_CRATE2_03) - show_object_with_animation(0x10, ANIM_CUT_IMP_OUTRO_CRATE3_03) - show_object_with_animation(0x11, ANIM_CUT_IMP_OUTRO_CRATE4_03) - show_object_with_animation(0x12, ANIM_CUT_IMP_OUTRO_CRATE5_03) - show_object_with_animation(0x13, ANIM_CUT_IMP_OUTRO_CRATE6_03) - show_object_with_animation(0x14, ANIM_CUT_IMP_OUTRO_CRATE7_03) - - wait_until(1090, 0x95) - play_sound(SFX_SKEDAR_ROAR_0529, CHANNEL_10) - - wait_until(1100, 0x96) - play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) - - wait_until(1264, 0x97) - play_sound(SFX_00E3, CHANNEL_10) - - wait_until(1280, 0x98) - play_sound(SFX_00E4, CHANNEL_10) - - wait_until(1315, 0x99) - play_sound(MP3_07BA, CHANNEL_10) - play_sound(SFX_00EE, CHANNEL_10) - - wait_until(1330, 0x9a) - play_sound(SFX_00DF, CHANNEL_10) - - wait_until(1350, 0x9b) - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, TRUE) - yield - set_chr_shooting_in_cutscene(CHR_BOND, FALSE) - play_sound(MP3_07BA, CHANNEL_10) - play_sound(SFX_00E4, CHANNEL_10) - - beginloop(0x0d) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0xb8) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0xb8) - label(0x2e) - endloop(0x0d) - - label(0xb8) - mute_channel(CHANNEL_10) - stop_cutscene_track - stop_ambient_track - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_intro[] = { - play_cutscene_track(MUSIC_DEFENSE_INTRO) - camera_movement(ANIM_CUT_IMP_INTRO_CAM_01) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_ailist(CHR_CARRINGTON, GAILIST_IDLE) - set_ailist(0x19, GAILIST_IDLE) - set_ailist(0x1a, GAILIST_IDLE) - set_chr_chrflag(0x16, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_CARRINGTON, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_CARR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 4) - set_chr_chrflag(0x19, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x19, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x19, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x19, 4) - set_chr_chrflag(0x1a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x1a, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x1a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x1a, 4) - enable_object(0x0d) - set_object_flag2(0x0d, OBJFLAG2_04000000) - set_object_flag3(0x0d, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_INTRO_DROPSHIP, 0x0d, 0x04, 0xffff) - restart_timer - set_cutscene_weapon(0x1a, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(0x1a, WEAPON_AR34, WEAPON_NONE) - - wait_until(4, 0x71) - speak(CHR_BOND, L_IMP_041, MP3_0475, CHANNEL_10, COLOR_06_WHITE) // "All ready, Joanna? We can't keep the Maian delegat..." - - wait_until(72, 0x72) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(104, 0x73) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(450, 0x74) - speak(CHR_BOND, L_IMP_042, MP3_0476, CHANNEL_10, COLOR_09_BLUE) // "Am I ready? What do you mean? I was ready half an ..." - - wait_until(688, 0x76) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(754, 0x77) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(800, 0x75) - speak(CHR_BOND, L_IMP_043, MP3_0477, CHANNEL_10, COLOR_06_WHITE) // "But you know how it is, Joanna... I had to make su..." - - wait_until(822, 0x78) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(850, 0x79) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(866, 0x7a) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(892, 0x7b) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(926, 0x7c) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(945, 0x7d) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(976, 0x7e) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(990, 0x7f) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1030, 0x80) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(1048, 0x81) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(1102, 0x83) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(1110, 0x84) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(1158, 0x85) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(1160, 0x82) - speak(CHR_BOND, L_IMP_044, MP3_0478, CHANNEL_10, COLOR_09_BLUE) // "They should keep you away from mirrors. Nervous?" - - wait_until(1170, 0x86) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(1224, 0x87) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(1258, 0x88) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(1440, 0x89) - speak(CHR_BOND, L_IMP_045, MP3_0479, CHANNEL_10, COLOR_06_WHITE) // "Very. I've waited for this moment for so many year..." - - wait_until(1442, 0x8a) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(1450, 0x8b) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(1594, 0x8c) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1676, 0x8d) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(1741, 0x8e) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(2252, 0x8f) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(2296, 0x90) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(2326, 0x91) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(2378, 0x92) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(2383, 0x93) - play_sound(SFX_00B5, CHANNEL_10) - - wait_until(2410, 0x94) - speak(CHR_BOND, L_IMP_046, MP3_047A, CHANNEL_10, COLOR_06_WHITE) // "Where did that come from?" - - wait_until(2416, 0x95) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(2446, 0x96) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(2510, 0x97) - play_sound(SFX_00AD, CHANNEL_10) - - wait_until(2566, 0x98) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(2582, 0x99) - play_sound(SFX_00B2, CHANNEL_10) - - wait_until(2628, 0x9b) - speak(CHR_BOND, L_IMP_047, MP3_047B, CHANNEL_10, COLOR_09_BLUE) // "It was up on ground level..." - - wait_until(2804, 0x9c) - play_sound(SFX_00B5, CHANNEL_10) - - wait_until(2910, 0x9e) - play_sound(SFX_0165, CHANNEL_10) - set_cutscene_weapon(0x1a, WEAPON_NONE, WEAPON_NONE) - set_cutscene_weapon(CHR_BOND, WEAPON_AR34, WEAPON_NONE) - - wait_until(2940, 0x9f) - play_sound(SFX_M2_HEY, CHANNEL_10) - - wait_until(2965, 0xa0) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(2970, 0x9d) - speak(CHR_BOND, L_IMP_048, MP3_047C, CHANNEL_10, COLOR_09_BLUE) // "Looks like someone doesn't know when to quit. We'v..." - - wait_until(2984, 0xa1) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3000, 0xa2) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(3106, 0xa3) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3125, 0xa4) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(3142, 0xae) - play_sound(SFX_0167, CHANNEL_10) - unset_object_flag2(0x0d, OBJFLAG2_04000000) - - wait_until(3144, 0xa5) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(3169, 0xa6) - play_sound(SFX_0167, CHANNEL_10) - - wait_until(3180, 0xaf) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3204, 0xb0) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(3228, 0xa7) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(3246, 0xa8) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3263, 0xa9) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(3295, 0xaa) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(3317, 0xab) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3342, 0xac) - play_sound(SFX_0168, CHANNEL_10) - - wait_until(3355, 0xb1) - play_sound(SFX_0166, CHANNEL_10) - - wait_until(3365, 0xad) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3472, 0xb2) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(3498, 0xb3) - play_sound(SFX_0165, CHANNEL_10) - - wait_until(3520, 0xb4) - play_sound(SFX_0166, CHANNEL_10) - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0xb8) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0xb8) - label(0x2e) - endloop(0x0a) - - label(0xb8) - mute_channel(CHANNEL_10) - camera_movement(ANIM_CUT_IMP_INTRO_CAM_02) - cmd0175(60) - unset_object_flag2(0x0d, OBJFLAG2_04000000) - if_controller_button_pressed(/*goto*/ 0xcc) - unset_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_SKEDAR4, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR4, 4) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - enable_object(0x52) - set_object_flag2(0x52, OBJFLAG2_04000000) - set_object_flag3(0x52, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_INTRO_DOOR1, 0x52, 0x04, 0xffff) - enable_object(0x53) - set_object_flag2(0x53, OBJFLAG2_04000000) - set_object_flag3(0x53, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_INTRO_DOOR2, 0x53, 0x04, 0xffff) - restart_timer - - #define wait_until2(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0xcc) \ - if_timer_gt(time, /*goto*/ 0x08) \ - endloop(loopid) \ - label(0x08) - - wait_until2(8, 0x62) - play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) - - wait_until2(26, 0x65) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until2(38, 0x63) - play_sound(SFX_00E3, CHANNEL_10) - - wait_until2(43, 0x64) - play_sound(SFX_00E4, CHANNEL_10) - - wait_until2(63, 0x66) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until2(160, 0x67) - play_sound(SFX_0161, CHANNEL_10) - - wait_until2(202, 0x68) - play_sound(SFX_0162, CHANNEL_10) - - wait_until2(238, 0x69) - play_sound(SFX_0163, CHANNEL_10) - - wait_until2(255, 0x6a) - play_sound(SFX_0164, CHANNEL_10) - - wait_until2(259, 0x6b) - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until2(441, 0x6c) - play_sound(SFX_0163, CHANNEL_10) - - wait_until2(454, 0x6d) - play_sound(SFX_0164, CHANNEL_10) - - wait_until2(522, 0x6e) - play_sound(SFX_05C7, CHANNEL_10) - - wait_until2(546, 0x6f) - play_sound(SFX_05C6, CHANNEL_10) - - wait_until2(610, 0x70) - play_sound(SFX_05C5, CHANNEL_10) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0xcc) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0xcc) - label(0x2e) - endloop(0x0b) - - label(0xcc) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_10) - set_cutscene_weapon(CHR_BOND, WEAPON_AR34, WEAPON_NONE) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_CARRINGTON, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_CARR, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CARRINGTON, 2) - unset_chr_chrflag(0x19, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(0x19, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER1, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x19, 2) - unset_chr_chrflag(0x1a, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(0x1a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_SOLDIER2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x1a, 2) - unset_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_SKEDAR4, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_SKEDAR4, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_IMP_INTRO_SKEDAR, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SKEDAR4, 2) - unset_object_flag2(0x0d, OBJFLAG2_04000000) - set_object_flag(0x0d, OBJFLAG_DEACTIVATED) - set_object_flag3(0x0d, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_OUTRO_DROPSHIP_01, 0x0d, 0x01, 0xffff) - enable_object(0x52) - set_object_flag2(0x52, OBJFLAG2_04000000) - set_object_flag3(0x52, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_INTRO_DOOR1, 0x52, 0x04, 0xfffe) - enable_object(0x53) - set_object_flag2(0x53, OBJFLAG2_04000000) - set_object_flag3(0x53, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_IMP_INTRO_DOOR2, 0x53, 0x04, 0xfffe) - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - stop_cutscene_track - stop_ambient_track - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - remove_chr(0x19) - remove_chr(0x1a) - set_ailist(0x19, GAILIST_IDLE) - set_ailist(0x1a, GAILIST_IDLE) - unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) - enter_firstperson - yield - set_ailist(CHR_CARRINGTON, AILIST_CARRINGTON) - set_ailist(CHR_SKEDAR4, AILIST_SKEDAR4) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_hide_blondes_and_skedar[] = { - label(0x04) - set_chr_chrflag(CHR_BLONDE7, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SKEDAR3, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SKEDAR1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_SKEDAR2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_SKEDAR3, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BLONDE1, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BLONDE2, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BLONDE3, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BLONDE4, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BLONDE5, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BLONDE6, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BLONDE1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BLONDE2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BLONDE3, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BLONDE4, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BLONDE5, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BLONDE6, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_check_carrington_dead[] = { - beginloop(0x04) - if_chr_dead(CHR_CARRINGTON, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - show_hudmsg(CHR_BOND, L_IMP_019) // "Carrington has been killed." - set_stage_flag(STAGEFLAG_CARRINGTON_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_init_hostage_fr1[] = { - set_morale(5) - set_chr_maxdamage(CHR_SELF, 1) - set_accuracy(0) - set_ailist(CHR_SELF, AILIST_FIRINGRANGE_HOSTAGE) - endlist -}; - -u8 func0416_init_hostage_fr2[] = { - set_morale(7) - set_chr_maxdamage(CHR_SELF, 1) - set_accuracy(0) - set_ailist(CHR_SELF, AILIST_FIRINGRANGE_HOSTAGE) - endlist -}; - -u8 func0414_firingrange_hostage[] = { - set_shotlist(AILIST_FIRINGRANGE_HOSTAGE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x04) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - goto_next(0x12) - - label(0x03) - jog_to_pad(PAD_PRESET) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - goto_next(0x12) - endloop(0x04) - - label(0x08) - stop_chr - - beginloop(0x0b) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x0a) - goto_next(0x12) - endloop(0x0b) - - label(0x08) - goto_first(0x03) - - label(0x0a) - set_returnlist(CHR_SELF, AILIST_FIRINGRANGE_HOSTAGE) - set_shotlist(AILIST_FIRINGRANGE_HOSTAGE) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Enemy not detected - label(0x12) - set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) - endlist -}; - -u8 func100e_setup_firingrange[] = { - set_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_INVINCIBLE) - - // Wait until guns complete or failed, or skip this check if Agent - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_objective_complete(0, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_stage_flag_eq(STAGEFLAG_AUTOGUN_SWITCH_DESTROYED, TRUE, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_00000001, TRUE, /*goto*/ 0x2e) -#endif - reloop(0x04) - - // Wait until player in foyer area - label(0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x0006, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_P1P2, 0x00, 0x0005, /*goto*/ 0x2e) -#endif - endloop(0x04) - - // Configure FR takers and hostages - label(0x2e) - set_ailist(CHR_TAKER_FR1, AILIST_INIT_FIRINGRANGE_TAKER) - set_ailist(CHR_TAKER_FR2, AILIST_INIT_FIRINGRANGE_TAKER) - set_chr_flag_bankx(CHR_HOSTAGE_FR1, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_flag_bankx(CHR_HOSTAGE_FR2, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - restart_timer - - // Wait until player in firing range entrance or door is opening - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0007, /*goto*/ 0x08) - if_door_state(0x23, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2f) - endloop(0x0a) - - // Wait for player to enter room, or 10 seconds - label(0x2f) - restart_timer - - beginloop(0x71) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0007, /*goto*/ 0x08) - if_timer_gt(600, /*goto*/ 0x08) - endloop(0x71) - - // Unset invincible on hostages and takers - label(0x08) - destroy_object(OBJ_FR_GLASS) - unset_chr_chrflag(CHR_HOSTAGE_FR1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_HOSTAGE_FR2, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0419_init_firingrange_taker[] = { - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func041b_init_hostage_holo[] = { - set_morale(3) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_HOSTAGE_HOLO) - endlist -}; - -u8 func041a_hostage_holo[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_00040000) - set_shotlist(AILIST_HOSTAGE_HOLO) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x04) - - // Dying - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - wait until holo room door opened - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_door_state(0x43, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - if_door_state(0x44, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - if_objective_complete(0, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS) - - label(0x2e) - assign_sound(MP3_030E, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - restart_timer - - // Wait until player in sight, or 2 seconds - beginloop(0x0a) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x08) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x08) - if_timer_gt(120, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - assign_sound(MP3_030F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) - label(0x08) - label(0x08) - try_spawn_chr_at_pad(BODY_CIFEMTECH, HEAD_SECRETARY, PAD_IMP_0104, AILIST_INIT_HOLOCLONE1, SPAWNFLAG_00000010 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2e) - label(0x2e) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - try_spawn_chr_at_pad(BODY_CIFEMTECH, HEAD_SECRETARY, PAD_IMP_0105, AILIST_INIT_HOLOCLONE2, SPAWNFLAG_00000010 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2e) - label(0x2e) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - try_spawn_chr_at_pad(BODY_CIFEMTECH, HEAD_SECRETARY, PAD_IMP_0106, AILIST_INIT_HOLOCLONE3, SPAWNFLAG_00000010 | SPAWNFLAG_NOBLOOD, /*goto*/ 0x2e) - label(0x2e) - set_ailist(CHR_TAKER_HOLO1, AILIST_TAKER_HOLO1) - set_ailist(CHR_TAKER_HOLO2, AILIST_TAKER_HOLO2) - set_ailist(CHR_TAKER_HOLO3, AILIST_TAKER_HOLO3) - jog_to_pad(PAD_IMP_0107) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - - label(0x12) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_HOLO_TAKERS_DEAD, TRUE, /*goto*/ 0x08) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x10) - - label(0x2e) - goto_first(0x12) - - label(0x08) - set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) - endlist -}; - -u8 func041c_init_holoclone1[] = { - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - play_sound(SFX_MENU_OPENDIALOG, CHANNEL_9) - set_shotlist(AILIST_HOLOCLONE_ONSHOT) - set_chr_maxdamage(CHR_SELF, 1) - set_chr_id(CHR_HOLOCLONE1) - jog_to_pad(PAD_IMP_0108) - set_ailist(CHR_SELF, AILIST_HOLOCLONE) - endlist -}; - -u8 func041d_init_holoclone2[] = { - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - play_sound(SFX_MENU_OPENDIALOG, CHANNEL_5) - set_shotlist(AILIST_HOLOCLONE_ONSHOT) - set_chr_maxdamage(CHR_SELF, 1) - set_chr_id(CHR_HOLOCLONE2) - jog_to_pad(PAD_IMP_0109) - set_ailist(CHR_SELF, AILIST_HOLOCLONE) - endlist -}; - -u8 func041e_init_holoclone3[] = { - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - play_sound(SFX_MENU_OPENDIALOG, CHANNEL_6) - set_shotlist(AILIST_HOLOCLONE_ONSHOT) - set_chr_maxdamage(CHR_SELF, 1) - set_chr_id(CHR_HOLOCLONE3) - jog_to_pad(PAD_IMP_010A) - set_ailist(CHR_SELF, AILIST_HOLOCLONE) - endlist -}; - -u8 func041f_holoclone_onshot[] = { - play_sound(SFX_MENU_SWIPE, CHANNEL_6) - drop_gun_and_fade_out - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041f_holoclone[] = { - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - - label(0x12) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x10) - - label(0x2e) - goto_first(0x12) - - endlist -}; - -#define holo_taker_logic(holoclone) \ - restart_timer \ - chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) \ - \ - beginloop(0xba) \ - set_target_chr(CHR_BOND) \ - if_can_see_target(/*goto*/ 0xbb) \ - set_target_chr(CHR_COOP) \ - if_can_see_target(/*goto*/ 0xbb) \ - if_timer_gt(60, /*goto*/ 0xbb) \ - endloop(0xba) \ - \ - label(0xbb) \ - set_self_chrflag(CHRCFLAG_00000040) \ - set_accuracy(50) \ - set_target_chr(holoclone) \ - label(0x04) \ - yield \ - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0xb9) \ - label(0xb9) \ - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) \ - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) \ - \ - beginloop(0x0a) \ - if_chr_stopped(/*goto*/ 0x08) \ - endloop(0x0a) \ - \ - label(0x08) \ - set_shotlist(GAILIST_UNALERTED) \ - set_returnlist(CHR_SELF, GAILIST_UNALERTED) \ - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - -u8 func0420_taker_holo1[] = { - set_self_chrflag(CHRCFLAG_00040000) - holo_taker_logic(CHR_HOLOCLONE1) - endlist -}; - -u8 func0421_taker_holo2[] = { - set_self_chrflag(CHRCFLAG_00040000) - assign_sound(SFX_M0_WHAT_THE, CHANNEL_6) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) -#else - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) -#endif - holo_taker_logic(CHR_HOLOCLONE2) - endlist -}; - -u8 func0422_taker_holo3[] = { - set_self_chrflag(CHRCFLAG_00040000) - holo_taker_logic(CHR_HOLOCLONE3) - endlist -}; - -u8 func0423_init_shock[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(20) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(90) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0426_init_saved_hostage[] = { - set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - set_chr_team(CHR_SELF, TEAM_NONCOMBAT) - add_health_or_armor(80) - set_chr_maxdamage(CHR_SELF, 1) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_HOSTAGE_THANK_AND_RUN) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0425_hostage_thank_and_run[] = { - set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x03) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2e) - set_chrpreset(CHR_BOND) - goto_next(0x08) - - label(0x2e) - set_chrpreset(CHR_COOP) - - label(0x08) - restart_timer - label(0x0a) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - if_sound_finished(CHANNEL_6, /*goto*/ 0x08) - if_timer_gt(200, /*goto*/ 0x2f) - goto_first(0x0b) - - label(0x08) - play_cistaff_quip(CIQUIP_THANKS, CHANNEL_6) - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - label(0x2f) - restart_timer - - beginloop(0x71) - if_timer_gt(120, /*goto*/ 0x2e) - endloop(0x71) - - label(0x2e) - run_to_pad(PAD_IMP_00B7) - - beginloop(0x11) - if_chr_stopped(/*goto*/ 0x10) - endloop(0x11) - - // Unreachable - set_target_chr(CHR_PRESET) - - beginloop(0x10) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2e) - set_target_chr(CHR_ANTI) - if_can_see_target(/*goto*/ 0x2e) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2e) - if_distance_to_target_gt(500, /*goto*/ 0x08) - label(0x2e) - endloop(0x10) - - label(0x08) - unset_self_chrflag(CHRCFLAG_KILLCOUNTABLE) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0428_init_drop_devastator[] = { - unset_self_chrflag(CHRCFLAG_KILLCOUNTABLE) - set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) - set_chr_team(CHR_SELF, TEAM_NONCOMBAT) - set_chr_maxdamage(CHR_SELF, 40) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_DROP_DEVASTATOR) - endlist -}; - -u8 func0427_drop_devastator[] = { - set_shotlist(AILIST_HOSTAGE_THANK_AND_RUN) - if_stage_flag_eq(STAGEFLAG_DROPPED_DEVASTATOR, TRUE, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_DROPPED_DEVASTATOR) - goto_next(0x08) - - // Other hostage already dropped Devastator - label(0x2e) - set_ailist(CHR_SELF, AILIST_HOSTAGE_THANK_AND_RUN) - - label(0x08) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x03) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2e) - set_chrpreset(CHR_BOND) - goto_next(0x08) - - label(0x2e) - set_chrpreset(CHR_COOP) - - label(0x08) - restart_timer - label(0x0a) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - give_object_to_chr(OBJ_DEVASTATOR, CHR_SELF) - yield - drop_concealed_items(CHR_SELF) - play_cistaff_quip(CIQUIP_THANKS, CHANNEL_6) - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - restart_timer - - beginloop(0x71) - if_timer_gt(120, /*goto*/ 0x2e) - endloop(0x71) - - label(0x2e) - run_to_pad(PAD_IMP_00B7) - - beginloop(0x11) - if_chr_stopped(/*goto*/ 0x10) - endloop(0x11) - - // Unreachable - set_target_chr(CHR_PRESET) - - beginloop(0x10) - if_can_see_target(/*goto*/ 0x2e) - if_distance_to_target_gt(500, /*goto*/ 0x08) - label(0x2e) - endloop(0x10) - - label(0x08) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_check_holo_takers_dead[] = { - beginloop(0x03) - if_chr_deadish(CHR_TAKER_HOLO1, /*goto*/ 0x2e) - reloop(0x03) - - label(0x2e) - if_chr_deadish(CHR_TAKER_HOLO2, /*goto*/ 0x2e) - reloop(0x03) - - label(0x2e) - if_chr_deadish(CHR_TAKER_HOLO3, /*goto*/ 0x2e) - endloop(0x03) - - label(0x2e) - set_stage_flag(STAGEFLAG_HOLO_TAKERS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_check_device_takers_dead[] = { - beginloop(0x03) - if_chr_deadish(CHR_TAKER_DEVICE_M, /*goto*/ 0x2e) - reloop(0x03) - - label(0x2e) - if_chr_deadish(CHR_TAKER_DEVICE_F, /*goto*/ 0x2e) - endloop(0x03) - - label(0x2e) - set_stage_flag(STAGEFLAG_DEVICE_TAKERS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_check_info_takers_dead[] = { - beginloop(0x03) - if_chr_deadish(CHR_TAKER_INFO_F, /*goto*/ 0x2e) - reloop(0x03) - - label(0x2e) - if_chr_deadish(CHR_TAKER_INFO_M, /*goto*/ 0x2e) - endloop(0x03) - - label(0x2e) - set_stage_flag(STAGEFLAG_INFO_TAKERS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042c_init_hostage_device_f[] = { - set_morale(1) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_DEVICEROOM_HOSTAGE) - endlist -}; - -u8 func042d_init_hostage_device_m[] = { - set_morale(6) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_DEVICEROOM_HOSTAGE) - endlist -}; - -u8 func042b_deviceroom_hostage[] = { - set_shotlist(AILIST_DEVICEROOM_HOSTAGE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x12) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x12) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2e) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2e) - stop_chr - goto_next(0x10) - - label(0x2e) - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_DEVICE_TAKERS_DEAD, TRUE, /*goto*/ 0x08) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x10) - - label(0x2e) - goto_first(0x12) - - label(0x08) - set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) - endlist -}; - -u8 func042f_init_taker_device_m[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_TAKER_DEVICE_M) - endlist -}; - -u8 func042e_taker_device_m[] = { - set_shotlist(AILIST_TAKER_DEVICE_M) - if_chr_dead(CHR_SELF, /*goto*/ 0x2e) - if_chr_dead(CHR_SELF, /*goto*/ 0x2e) - if_chr_dead(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x08) - - // Dying - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x08) - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x08) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - if_objective_complete(0, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS) - - label(0x2e) - increase_squadron_alertness(100) - assign_sound(SFX_M0_WHAT_THE, CHANNEL_6) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) -#else - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) -#endif - restart_timer - chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) - - beginloop(0xba) - if_timer_gt(60, /*goto*/ 0xbb) - endloop(0xba) - - label(0xbb) - set_self_chrflag(CHRCFLAG_00000040) - set_accuracy(50) - set_target_chr(CHR_HOSTAGE_DEVICE_M) - set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) - endlist -}; - -u8 func0431_init_taker_device_f[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_TAKER_DEVICE_F) - endlist -}; - -u8 func0430_taker_device_f[] = { - set_shotlist(AILIST_TAKER_DEVICE_F) - if_chr_dead(CHR_SELF, /*goto*/ 0x2e) - if_chr_dead(CHR_SELF, /*goto*/ 0x2e) - if_chr_dead(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x08) - - // Dying - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x08) - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x08) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - increase_squadron_alertness(100) - set_self_flag_bankx(CHRFLAG1_CAN_RELOAD, BANK_1) - restart_timer - chr_do_animation(ANIM_RELOAD_0209, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0xbc) - if_self_flag_bankx_eq(CHRFLAG1_CAN_RELOAD, FALSE, BANK_1, /*goto*/ 0x08) - if_timer_lt(120, /*goto*/ 0x08) - assign_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) - unset_self_flag_bankx(CHRFLAG1_CAN_RELOAD, BANK_1) - label(0x08) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0xbc) - - label(0x2e) - set_self_chrflag(CHRCFLAG_00000040) - set_accuracy(50) - set_target_chr(CHR_HOSTAGE_DEVICE_F) - set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) - endlist -}; - -u8 func0432_taker_attack[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_shotlist(AILIST_TAKER_ATTACK) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x08) - - // Dying - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x08) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x04) - - // Injured - label(0x2e) - restart_timer - - beginloop(0x71) - if_chr_stopped(/*goto*/ 0x04) - if_timer_gt(180, /*goto*/ 0x04) - endloop(0x71) -#else - set_shotlist(GAILIST_ALERTED) -#endif - - // Healthy - label(0x04) - yield - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0xb9) - label(0xb9) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x08) - endloop(0x0a) - - label(0x08) -#if VERSION >= VERSION_NTSC_1_0 - label(0x0f) -#endif - set_shotlist(GAILIST_UNALERTED) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func0434_init_hostage_info_m[] = { - set_morale(2) - add_health_or_armor(10) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_INFOROOM_HOSTAGE) - endlist -}; - -u8 func0435_init_hostage_info_f[] = { - set_morale(8) - add_health_or_armor(10) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_INFOROOM_HOSTAGE) - endlist -}; - -u8 func0433_inforoom_hostage[] = { - set_shotlist(AILIST_INFOROOM_HOSTAGE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x04) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x04) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x08) - endloop(0x04) - - label(0x08) - if_objective_complete(0, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS) - - // This flag is assigned at random to one of the two hostages - label(0x2e) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x0e) - - // Flag not set - run and cower - run_to_pad(PAD_IMP_010D) - - beginloop(0x0a) - if_stage_flag_eq(STAGEFLAG_INFO_TAKERS_DEAD, TRUE, /*goto*/ 0x0d) - if_chr_stopped(/*goto*/ 0x12) - endloop(0x0a) - - label(0x12) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_INFO_TAKERS_DEAD, TRUE, /*goto*/ 0x0d) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x10) - - label(0x2e) - goto_first(0x12) - - // Flag was set - fight hostage taker - label(0x0e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2e) - goto_next(0x0d) - - label(0x2e) - unset_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - set_shotlist(AILIST_INFOROOM_HOSTAGE) - set_returnlist(CHR_SELF, AILIST_INFOROOM_HOSTAGE) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - label(0x0d) - if_kill_count_gt(1, /*goto*/ 0x2e) - set_ailist(CHR_SELF, AILIST_INIT_DROP_DEVASTATOR) - - label(0x2e) - set_ailist(CHR_SELF, AILIST_INIT_SAVED_HOSTAGE) - endlist -}; - -u8 func1012_info_room[] = { - beginloop(0x04) - if_door_state(0x19, DOORSTATE_OPEN, /*goto*/ 0x2e) - endloop(0x04) - - // One hostage is randomly given chrflag0_00000004, which allows that - // hostage to fight the taker. - label(0x2e) - call_rng - if_rand_gt(128, /*goto*/ 0x0a) - - set_chr_flag_bankx(CHR_HOSTAGE_INFO_M, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_flag_bankx(CHR_HOSTAGE_INFO_F, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_flag_bankx(CHR_HOSTAGE_INFO_M, CHRFLAG0_GP1, BANK_0) - set_chr_maxdamage(CHR_TAKER_INFO_M, 10) - goto_next(0x2e) - - label(0x0a) - set_chr_flag_bankx(CHR_HOSTAGE_INFO_M, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_flag_bankx(CHR_HOSTAGE_INFO_F, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_flag_bankx(CHR_HOSTAGE_INFO_F, CHRFLAG0_GP1, BANK_0) - set_chr_maxdamage(CHR_TAKER_INFO_F, 10) - - label(0x2e) - restart_timer - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - set_chr_flag_bankx(CHR_TAKER_INFO_F, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_chr_flag_bankx(CHR_TAKER_INFO_M, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0437_init_taker_info_m[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_TAKER_INFO_M) - endlist -}; - -u8 func0436_taker_info_m[] = { - set_shotlist(AILIST_TAKER_INFO_M) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x08) - - // Dying - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x08) - - beginloop(0x0a) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - set_self_chrflag(CHRCFLAG_00000040) - set_accuracy(50) - set_target_chr(CHR_HOSTAGE_INFO_M) - set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) - endlist -}; - -u8 func0439_init_taker_info_f[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_TAKER_INFO_F) - endlist -}; - -u8 func0438_taker_info_f[] = { - set_shotlist(AILIST_TAKER_INFO_F) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x08) - - // Dying - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x08) - - beginloop(0x0a) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - set_self_chrflag(CHRCFLAG_00000040) - set_accuracy(20) - set_target_chr(CHR_HOSTAGE_INFO_F) - set_ailist(CHR_SELF, AILIST_TAKER_ATTACK) - endlist -}; - -u8 func1013_check_hostages_saved[] = { - yield - yield - - beginloop(0x0a) - if_chr_deadish(CHR_HOSTAGE_FR1, /*goto*/ 0x2f) - goto_next(0x2e) - - // FR1 hostage dead - label(0x2f) - if_chr_deadish(CHR_HOSTAGE_FR2, /*goto*/ 0x2f) - - // FR1 hostage alive - label(0x2e) - if_chr_deadish(CHR_TAKER_FR1, /*goto*/ 0x2e) - endloop(0x0a) - - // FR1 hostage alive and FR1 taker dead - label(0x2e) - if_chr_deadish(CHR_TAKER_FR2, /*goto*/ 0x2e) - goto_first(0x0a) - - // Both FR hostages dead - label(0x2f) - - // Both FR takers dead - label(0x2e) - if_stage_flag_eq(STAGEFLAG_DEVICE_TAKERS_DEAD, TRUE, /*goto*/ 0x2e) - if_chr_deadish(CHR_HOSTAGE_DEVICE_F, /*goto*/ 0x2f) - goto_first(0x0a) - - label(0x2f) - if_chr_deadish(CHR_HOSTAGE_DEVICE_M, /*goto*/ 0x2e) - goto_first(0x0a) - - // FR and device room done - label(0x2e) - if_stage_flag_eq(STAGEFLAG_INFO_TAKERS_DEAD, TRUE, /*goto*/ 0x2e) - if_chr_deadish(CHR_HOSTAGE_INFO_M, /*goto*/ 0x2f) - goto_first(0x0a) - - label(0x2f) - if_chr_deadish(CHR_HOSTAGE_INFO_F, /*goto*/ 0x2e) - goto_first(0x0a) - - // FR, device and info rooms done - label(0x2e) - if_stage_flag_eq(STAGEFLAG_HOLO_TAKERS_DEAD, TRUE, /*goto*/ 0x2e) - if_chr_deadish(CHR_HOSTAGE_HOLO, /*goto*/ 0x2e) - goto_first(0x0a) - - // All rooms done - label(0x2e) - if_stage_flag_eq(STAGEFLAG_TOO_MANY_HOSTAGES_KILLED, TRUE, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_IMP_017) // "Hostages have been saved." - set_stage_flag(STAGEFLAG_ENOUGH_HOSTAGES_SAVED) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_carrington_messages[] = { - restart_timer - - beginloop(0x03) - if_chr_dead(CHR_CARRINGTON, /*goto*/ 0xd9) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) - endloop(0x03) - - #define carrington_sanity_checks \ - if_chr_dead(CHR_CARRINGTON, /*goto*/ 0xd9) \ - if_chr_dead(CHR_BOND, /*goto*/ 0x05) \ - goto_next(0x06) \ - \ - label(0x05) \ - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xd9) \ - label(0x06) - - label(0x2e) - yield - label(0x08) - restart_timer - - beginloop(0x0a) - carrington_sanity_checks - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) - if_timer_gt(180, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - restart_timer - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - speak(CHR_BOND, L_IMP_020, SFX_8193, CHANNEL_6, COLOR_06_WHITE) // "Joanna - we're under attack." - - beginloop(0x0b) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0x0b) - - label(0x08) - speak(CHR_BOND, L_IMP_021, SFX_8194, CHANNEL_6, COLOR_06_WHITE) // "Get the guns back on line - hurry." - - beginloop(0x0c) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x0d) - endloop(0x0c) - - beginloop(0x0d) - set_stage_flag(STAGEFLAG_TRIGGER_AUTODEFENSES_MSG) - carrington_sanity_checks - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) - if_objective_complete(0, /*goto*/ 0x08) - endloop(0x0d) - - label(0x08) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CARRINGTON, CHRCFLAG_HIDDEN) - unlock_door(0x23, 0x04) - unlock_door(0x24, 0x04) - restart_timer - - beginloop(0xbd) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0xda) - endloop(0xbd) - - label(0xda) - restart_timer - speak(CHR_BOND, L_IMP_022, SFX_8195, CHANNEL_6, COLOR_06_WHITE) // "The Skedar have taken hostages." - - beginloop(0x0e) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0x0e) - - label(0x08) - restart_timer - speak(CHR_BOND, L_IMP_023, SFX_8196, CHANNEL_6, COLOR_06_WHITE) // "Get up to the offices and save them." - - beginloop(0x0f) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x10) - endloop(0x0f) - - label(0x10) - set_stage_flag(STAGEFLAG_TRIGGER_COUNTINGONME_MSG) - yield - carrington_sanity_checks - if_objective_complete(1, /*goto*/ 0x08) - goto_first(0x10) - - label(0x08) - restart_timer - - beginloop(0xbe) - carrington_sanity_checks - if_timer_gt(300, /*goto*/ 0x08) - reloop(0xbe) - - label(0x08) - if_sound_finished(CHANNEL_6, /*goto*/ 0x08) - endloop(0xbe) - - label(0x08) - restart_timer - speak(CHR_BOND, L_IMP_024, SFX_8197, CHANNEL_6, COLOR_06_WHITE) // "They're using a new form of shield technology." - - beginloop(0x11) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0x11) - - label(0x08) - restart_timer - speak(CHR_BOND, L_IMP_025, SFX_8198, CHANNEL_6, COLOR_06_WHITE) // "Foster was working on a new weapon which may be us..." - - beginloop(0x12) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0xbf) - endloop(0x12) - - beginloop(0xbf) - carrington_sanity_checks - if_objective_complete(2, /*goto*/ 0x08) - endloop(0xbf) - - label(0x08) - if_difficulty_lt(DIFF_PA, /*goto*/ 0xdb) - restart_timer - - beginloop(0xc0) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0xc0) - - label(0x08) -#if VERSION >= VERSION_JPN_FINAL - unset_object_flag(OBJ_SAFEINFO, OBJFLAG_INVINCIBLE) -#endif - restart_timer - speak(CHR_BOND, L_IMP_026, SFX_8199, CHANNEL_6, COLOR_06_WHITE) // "Damn it. My office... If they get access..." - - beginloop(0xc1) - carrington_sanity_checks - if_timer_gt(240, /*goto*/ 0x08) - endloop(0xc1) - - label(0x08) - restart_timer - speak(CHR_BOND, L_IMP_027, SFX_819A, CHANNEL_6, COLOR_06_WHITE) // "Get there first, Jo, and destroy the files." - - beginloop(0xc2) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0xc3) - endloop(0xc2) - - beginloop(0xc3) - carrington_sanity_checks - if_objective_complete(3, /*goto*/ 0x08) - endloop(0xc3) - - label(0x08) - label(0xdb) - - // Wait until no one in skedar shuttle area - beginloop(0x71) - if_chr_in_room(CHR_BOND, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x0055, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_BOND, 0x00, 0x0046, /*goto*/ 0x2e) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xe5) -#endif - if_chr_in_room(CHR_COOP, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_COOP, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_COOP, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_COOP, 0x00, 0x0055, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_COOP, 0x00, 0x0046, /*goto*/ 0x2e) - label(0xe5) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0xe5) -#endif - if_chr_in_room(CHR_ANTI, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_ANTI, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_ANTI, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_ANTI, 0x00, 0x0055, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_ANTI, 0x00, 0x0046, /*goto*/ 0x2e) - label(0xe5) -#endif - goto_next(0x08) - - label(0x2e) - endloop(0x71) - - label(0x08) - restart_timer - - beginloop(0xc4) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0xc4) - - label(0x08) - restart_timer - speak(CHR_BOND, L_IMP_028, SFX_819B, CHANNEL_6, COLOR_06_WHITE) // "Things are desperate. They've planted a bomb." - - beginloop(0xc5) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0xc5) - - label(0x08) - restart_timer - speak(CHR_BOND, L_IMP_029, SFX_819C, CHANNEL_6, COLOR_06_WHITE) // "Find it and get it out of the building." - - beginloop(0xc6) - carrington_sanity_checks - if_timer_gt(180, /*goto*/ 0x08) - endloop(0xc6) - - label(0x08) - play_x_track(XREASON_DEFAULT, 10, 120) - set_countdown_timer(120) - show_countdown_timer - start_countdown_timer - - beginloop(0xc7) - if_stage_flag_eq(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF, TRUE, /*goto*/ 0x2e) - if_countdown_timer_lt(1, /*goto*/ 0x08) - endloop(0xc7) - - label(0x08) - set_stage_flag(STAGEFLAG_BOMB_EXPLODING_ON_GROUND) -#if VERSION < VERSION_NTSC_1_0 - explosions_around_chr(CHR_BOND) -#endif - hide_countdown_timer - label(0x2e) - restart_timer - - beginloop(0xc8) - if_timer_gt(300, /*goto*/ 0x2e) - endloop(0xc8) - - label(0x2e) - carrington_sanity_checks - restart_timer - speak(CHR_BOND, L_IMP_032, SFX_819D, CHANNEL_6, COLOR_06_WHITE) // "Well done, Joanna. We're nearly clear..." - - beginloop(0xc9) - if_timer_gt(180, /*goto*/ 0x08) - endloop(0xc9) - - label(0x08) - carrington_sanity_checks - speak(CHR_BOND, L_IMP_033, SFX_819E, CHANNEL_6, COLOR_06_WHITE) // "The last dropship is waiting for you. Hurry." - - beginloop(0xca) - if_timer_gt(180, /*goto*/ 0xcb) - endloop(0xca) - - beginloop(0xcb) - chr_toggle_p1p2(CHR_SELF) -#if VERSION >= VERSION_NTSC_1_0 - if_all_objectives_complete(/*goto*/ 0x2e) - reloop(0xcb) - - label(0x2e) -#endif - if_chr_in_room(CHR_P1P2, 0x00, 0x0054, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x0053, /*goto*/ 0x2e) - endloop(0xcb) - - label(0x2e) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2e) - goto_next(0x08) - - label(0x2e) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) - goto_next(0x08) - - label(0x2e) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x08) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, 0x0418) - - label(0xd9) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_firingrange_pc[] = { - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_FR_PC, /*goto*/ 0x08) - if_object_in_good_condition(OBJ_FR_PC, /*goto*/ 0x2e) - goto_next(0x2f) - - label(0x2e) - reloop(0x0a) - - label(0x2f) - show_hudmsg(CHR_BOND, L_IMP_034) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_FR_PC_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x08) - play_sound(SFX_8116, -1) - if_objective_complete(1, /*goto*/ 0x08) - show_hudmsg(CHR_P1P2, L_IMP_030) // "Access denied - authorization failure." - restart_timer - - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x2e) - endloop(0x0b) - - label(0x2e) - endloop(0x0a) - - label(0x08) - show_hudmsg(CHR_P1P2, L_IMP_031) // "Emergency overrides have been engaged." - unset_object_flag(OBJ_RCP120, OBJFLAG_UNCOLLECTABLE) - unset_object_flag(OBJ_RCP120_GLASS, OBJFLAG_INVINCIBLE) - destroy_object(OBJ_RCP120_GLASS) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define topspawner_logic(initfunc, clonefunc) \ - set_self_chrflag(CHRCFLAG_CLONEABLE) \ - set_self_chrflag(CHRCFLAG_HIDDEN) \ - set_self_chrflag(CHRCFLAG_00040000) \ - \ - beginloop(0x04) \ - if_objective_complete(1, /*goto*/ 0x2e) \ - reloop(0x04) \ - \ - label(0x2e) \ - if_never_been_onscreen(/*goto*/ 0x4f) \ - if_can_see_target(/*goto*/ 0x0a) \ - reloop(0x04) \ - \ - label(0x0a) \ - set_ailist(CHR_SELF, clonefunc) \ - \ - label(0x4f) \ - unset_self_chrflag(CHRCFLAG_HIDDEN) \ - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) \ - goto_first(0x04) \ - \ - label(0x4f) \ - try_spawn_clone2(CHR_SELF, initfunc, 0, /*goto*/ 0x2e) \ - set_ailist(CHR_SELF, clonefunc) \ - \ - label(0x2e) \ - yield \ - endloop(0x04) - -#define inittopclone_logic(templatechr, clonefunc) \ - set_chr_dodge_rating(2, 0) \ - set_accuracy(20) \ - set_reaction_speed(70) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(90) \ - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) \ - label(0x04) \ - try_inherit_properties(templatechr, /*goto*/ 0x08) \ - label(0x08) \ - set_chr_team(CHR_SELF, TEAM_ENEMY) \ - rebuild_teams \ - rebuild_squadrons \ - set_ailist(CHR_SELF, clonefunc) - -// Spawner at top of ramp at start -u8 func040a_spawner4[] = { - topspawner_logic(AILIST_INIT_CLONE4, AILIST_CLONE4) - endlist -}; - -u8 func040c_init_clone4[] = { - inittopclone_logic(0x11, AILIST_CLONE4) - endlist -}; - -u8 func040b_clone4[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) - try_run_to_target(/*goto*/ 0x2e) - label(0x2e) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -// Spawner at helipad -u8 func040d_spawner5[] = { - topspawner_logic(AILIST_INIT_CLONE5, AILIST_CLONE5) - endlist -}; - -u8 func040f_init_clone5[] = { - inittopclone_logic(0x12, AILIST_CLONE5) - endlist -}; - -u8 func040e_clone5[] = { - call_rng - if_rand_gt(128, /*goto*/ 0x08) - run_to_pad(PAD_IMP_005B) - goto_next(0x2e) - - label(0x08) - run_to_pad(PAD_IMP_0069) - - label(0x2e) - set_returnlist(CHR_SELF, AILIST_CLONE5) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * When the autoguns are completed, the game removes a single shock guard from - * the tunnels area. - * - * Looks like the intention is to remove the bottom spawners once the autogun - * objective is done, then remove the top spawners once the hostages are done, - * but due to changed chr IDs and a probable incorrect goto, this function - * fails pretty bad at achieving this. - */ -u8 func1016_remove_spawners[] = { - beginloop(0x0a) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_objective_complete(0, /*goto*/ 0x2e) - endloop(0x0a) - - // Unreachable - label(0x08) - remove_chr(0x0c) - remove_chr(0x0e) - remove_chr(0x10) - - beginloop(0x0b) - if_objective_complete(1, /*goto*/ 0x2e) - endloop(0x0b) - - // Agent, or autoguns complete - label(0x2e) - remove_chr(0x0b) // invalid chr ID - remove_chr(0x0d) // black guard - remove_chr(0x0f) // invalid chr ID - - beginloop(0x0c) - if_objective_complete(2, /*goto*/ 0x2e) - endloop(0x0c) - - label(0x2e) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -// Spawner outside Jo's office -u8 func0410_spawner6[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_objective_complete(2, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x000c, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_never_been_onscreen(/*goto*/ 0x4f) - if_can_see_target(/*goto*/ 0x0a) - reloop(0x04) - - label(0x0a) - set_ailist(CHR_SELF, AILIST_CLONE6) - - label(0x4f) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - label(0x4f) - try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE6, 0, /*goto*/ 0x2e) - set_ailist(CHR_SELF, AILIST_CLONE6) - - label(0x2e) - yield - endloop(0x04) - - endlist -}; - -u8 func0412_init_clone6[] = { - inittopclone_logic(0x13, AILIST_CLONE6) - endlist -}; - -u8 func0411_clone6[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) - try_run_to_target(/*goto*/ 0x2e) - label(0x2e) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func1022_skedar_shuttle[] = { - beginloop(0x12) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - if_objective_complete(3, /*goto*/ 0x08) - reloop(0x12) - - label(0x2e) - if_objective_complete(2, /*goto*/ 0x08) - endloop(0x12) - - label(0x08) - - beginloop(0x71) - if_chr_in_room(CHR_BOND, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x0055, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_BOND, 0x00, 0x0046, /*goto*/ 0x2e) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0xe5) -#endif - if_chr_in_room(CHR_COOP, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_COOP, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_COOP, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_COOP, 0x00, 0x0055, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_COOP, 0x00, 0x0046, /*goto*/ 0x2e) - label(0xe5) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0xe5) -#endif - if_chr_in_room(CHR_ANTI, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_ANTI, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_ANTI, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_ANTI, 0x00, 0x0055, /*goto*/ 0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_in_room(CHR_ANTI, 0x00, 0x0046, /*goto*/ 0x2e) - label(0xe5) -#endif - goto_next(0x08) - - label(0x2e) - endloop(0x71) - - label(0x08) - enable_object(OBJ_SKEDAR_SHUTTLE) - set_object_flag2(OBJ_SKEDAR_SHUTTLE, OBJFLAG2_04000000) - set_object_flag3(OBJ_SKEDAR_SHUTTLE, OBJFLAG3_00000010) - object_do_animation(ANIM_045A, OBJ_SKEDAR_SHUTTLE, 0x04, 0xffff) - object_set_modelpart_visible(OBJ_SKEDAR_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - set_object_flag(OBJ_SKEDAR_SHUTTLE, OBJFLAG_00000100) - - unset_chr_chrflag(CHR_BLONDE1, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE2, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE3, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE4, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE5, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE6, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BLONDE2, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BLONDE3, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BLONDE4, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BLONDE5, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BLONDE6, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_BLONDE1, AILIST_INIT_BLONDE) - set_ailist(CHR_BLONDE2, AILIST_INIT_BLONDE) - set_ailist(CHR_BLONDE3, AILIST_INIT_BLONDE) - set_ailist(CHR_BLONDE4, AILIST_INIT_BLONDE) - set_ailist(CHR_BLONDE5, AILIST_INIT_BLONDE) - set_ailist(CHR_BLONDE6, AILIST_INIT_BLONDE) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_BOMB_EXPLODING_ON_GROUND, TRUE, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF, TRUE, /*goto*/ 0x0a) - object_do_animation(ANIM_045A, OBJ_SKEDAR_SHUTTLE, 0x04, 0xffff) - endloop(0x04) - - // Bomb exploding while on ground - label(0x2e) - hide_countdown_timer - stop_countdown_timer - destroy_object(OBJ_SKEDAR_SHUTTLE) - explosions_around_chr(CHR_BOND) - restart_timer - - beginloop(0x72) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x72) - - label(0x2e) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2f) - explosions_around_chr(CHR_COOP) - - goto_next(0x41) - label(0x2f) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x41) - explosions_around_chr(CHR_ANTI) - - label(0x41) - restart_timer - - beginloop(0x73) - if_timer_gt(90, /*goto*/ 0x2e) - endloop(0x73) - - label(0x2e) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Bomb deactivated - label(0x0a) - hide_countdown_timer - stop_countdown_timer - object_do_animation(ANIM_045B, OBJ_SKEDAR_SHUTTLE, 0x08, 0xffff) - assign_sound(SFX_810A, CHANNEL_3) - play_sound_from_object(CHANNEL_3, OBJ_SKEDAR_SHUTTLE, 1, 1800, 3000) - restart_timer - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x0b) - - label(0x2e) - assign_sound(SFX_810B, CHANNEL_4) - play_sound_from_object(CHANNEL_4, OBJ_SKEDAR_SHUTTLE, 1, 1800, 3000) - - beginloop(0x0d) - if_timer_gt(200, /*goto*/ 0x08) - endloop(0x0d) - - label(0x08) - set_stage_flag(STAGEFLAG_BOMB_AIRBORNE) - restart_timer - - beginloop(0x0c) - if_timer_gt(240, /*goto*/ 0x2e) - endloop(0x0c) - - label(0x2e) - set_object_health(OBJ_SKEDAR_SHUTTLE, 0) - mute_channel(CHANNEL_3) - mute_channel(CHANNEL_4) - destroy_object(OBJ_SKEDAR_SHUTTLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func043a_unused[] = { - set_chr_maxdamage(CHR_SELF, 1) - - beginloop(0x12) - if_objective_complete(3, /*goto*/ 0x08) - endloop(0x12) - - label(0x08) - - beginloop(0x04) - endloop(0x04) - - endlist -}; - -u8 unregistered_function1[] = { - // All of these objects have been removed... - // Wait for all 4 objects destroyed - beginloop(0x04) - if_object_in_good_condition(0x1f, /*goto*/ 0x08) - goto_next(0x2e) - label(0x08) - reloop(0x04) - - label(0x2e) - if_object_in_good_condition(0x20, /*goto*/ 0x08) - goto_next(0x2e) - label(0x08) - reloop(0x04) - - label(0x2e) - if_object_in_good_condition(0x21, /*goto*/ 0x08) - goto_next(0x2e) - label(0x08) - reloop(0x04) - - label(0x2e) - if_object_in_good_condition(0x22, /*goto*/ 0x08) - goto_next(0x2e) - label(0x08) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x71) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x71) - - label(0x2e) - set_stage_flag(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func043b_init_blonde[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(20) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(90) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func043c_init_cisolder[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(20) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(90) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_DEFEND_PAD) - endlist -}; - -u8 func043d_unused[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(30) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(90) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func043e_carrington[] = { - set_shotlist(AILIST_CARRINGTON) - jog_to_pad(PAD_IMP_0142) - - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - stop_chr - - beginloop(0x0a) - endloop(0x0a) - - endlist -}; - -u8 func0429_skedar4[] = { - stop_chr - set_accuracy(40) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(160) - set_recovery_speed(0) - set_shield(0) - jog_to_pad(PAD_IMP_000C) - set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) - endlist -}; - -u8 func1018_hurt_carrington[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_VISITED_HOSTAGES_BEFORE_AUTOGUNS, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x0a) - if_timer_gt(600, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - damage_chr(CHR_CARRINGTON, WEAPON_SUPERDRAGON) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1019_setup_safeinfo[] = { - label(0x08) -#if VERSION < VERSION_JPN_FINAL - unset_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_SAFEINFO, OBJFLAG_INVINCIBLE) -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101b_msg_autodefenses[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) - - beginloop(0x04) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - if_stage_flag_eq(STAGEFLAG_TRIGGER_AUTODEFENSES_MSG, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - yield - yield - speak(CHR_BOND, L_IMP_035, MP3_03D8, CHANNEL_6, COLOR_09_BLUE) // "The autodefenses will really help me out." - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_msg_fosterworkingon[] = { - beginloop(0x04) - if_objective_complete(1, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x0a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - reloop(0x04) - - label(0x2f) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0009, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - speak(CHR_P1P2, L_IMP_036, MP3_03D9, CHANNEL_6, COLOR_09_BLUE) // "So this is what Foster was working on." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_msg_countingonme[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_COUNTINGONME_MSG, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x0a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - goto_first(0x04) - - label(0x2f) - if_timer_gt(180, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - speak(CHR_BOND, L_IMP_037, MP3_03DA, CHANNEL_6, COLOR_09_BLUE) // "I'll have to go carefully... The hostages are coun..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This message is not played because no condition breaks out of the loop. - */ -u8 func101e_msg_wontknow[] = { - beginloop(0x04) - endloop(0x04) - - label(0x2e) - speak(CHR_BOND, L_IMP_038, MP3_03DB, CHANNEL_6, COLOR_09_BLUE) // "Well, at least I won't know if I'm doing anything ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_configure_cisoldiers[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_ailist(CHR_JONATHAN, AILIST_INIT_JONATHAN) - set_ailist(0x15, AILIST_INIT_CISOLDIER) - set_ailist(0x16, AILIST_INIT_CISOLDIER) - set_ailist(0x17, AILIST_INIT_CISOLDIER) - set_ailist(0x18, AILIST_INIT_CISOLDIER) - set_ailist(0x19, AILIST_INIT_CISOLDIER) - set_ailist(0x1a, AILIST_INIT_CISOLDIER) - set_ailist(0x1b, AILIST_INIT_CISOLDIER) - set_ailist(0x1c, AILIST_INIT_CISOLDIER) - set_ailist(0x1d, AILIST_INIT_CISOLDIER) - set_ailist(0x1e, AILIST_INIT_CISOLDIER) - set_ailist(CHR_HANGARGUY, AILIST_INIT_CISOLDIER) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_trigger_spawning[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - // Wait 15 seconds - label(0x2e) - restart_timer - - beginloop(0x0a) - if_timer_gt(900, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - set_stage_flag(STAGEFLAG_TRIGGER_SPAWNING) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042a_init_jonathan[] = { - set_accuracy(100) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(VERSION >= VERSION_NTSC_1_0 ? 1200 : 800) - set_recovery_speed(100) - set_ailist(CHR_SELF, AILIST_DEFEND_PAD) - endlist -}; - -u8 func1021_setup_jonathan[] = { - yield - if_savefile_flag_is_set(GAMEFILEFLAG_DEFENSE_JON, /*goto*/ 0x08) - remove_chr(CHR_JONATHAN) - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1023_check_skeder_shuttle_destroyed[] = { - beginloop(0x12) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - if_objective_complete(3, /*goto*/ 0x08) - reloop(0x12) - - label(0x2e) - if_objective_complete(2, /*goto*/ 0x08) - endloop(0x12) - - beginloop(0x04) - if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x08) - goto_next(0x2e) - - label(0x08) - goto_first(0x04) - - // Shuttle destroyed - label(0x2e) - restart_timer - - beginloop(0x0a) - if_timer_gt(30, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) -#if VERSION >= VERSION_NTSC_1_0 - if_stage_flag_eq(STAGEFLAG_BOMB_AIRBORNE, TRUE, /*goto*/ 0x0f) -#else - if_stage_flag_eq(STAGEFLAG_BOMB_AIRBORNE, TRUE, /*goto*/ 0x2e) -#endif - show_hudmsg(CHR_BOND, L_IMP_039) // "The bomb has been detonated..." - set_stage_flag(STAGEFLAG_BOMB_EXPLODING_ON_GROUND) - explosions_around_chr(CHR_BOND) - restart_timer - - beginloop(0x72) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x72) - - label(0x2e) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2f) - explosions_around_chr(CHR_COOP) - goto_next(0x41) - - label(0x2f) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x41) - explosions_around_chr(CHR_ANTI) - - label(0x41) - restart_timer - - beginloop(0x73) - if_timer_gt(90, /*goto*/ 0x2e) - endloop(0x73) - - label(0x2e) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - -#if VERSION >= VERSION_NTSC_1_0 - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) -#endif - endlist -}; - -u8 func1024_setup_lifts[] = { - activate_lift(1, 0x41) - activate_lift(2, 0x42) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1025_lift_door_sounds[] = { - beginloop(0xe4) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x46, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x47, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x4a, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x4b, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x4c, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x4d, /*goto*/ 0x2e) - reloop(0xe4) - - label(0x2e) - play_sound(SFX_DOOR_81B0, -1) - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x08) - endloop(0x0a) - - label(0x08) - endloop(0xe4) - - endlist -}; - -u8 func100e_setup_firingrange_doors[] = { - // Wait until firing range doors opened - beginloop(0xe4) - if_door_state(0x23, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - if_door_state(0x23, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - endloop(0xe4) - - // Unset some flags on them - label(0x2e) - unset_object_flag2(0x23, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x24, OBJFLAG2_AICANNOTUSE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1027_uplink[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2f) - goto_next(0x0f) - - label(0x2f) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_activated_object(CHR_TARGET, OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2e) - reloop(0x04) - - // Activated - label(0x08) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2e) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_TARGET, L_IMP_051) // "You need the Data Uplink." - reloop(0x04) - - // Activated with uplink - label(0x2e) - show_hudmsg(CHR_TARGET, L_IMP_052) // "Connection has been made." - restart_timer - - beginloop(0x0a) - if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2f) - goto_next(0x0f) - - label(0x2f) - if_timer_gt(60, /*goto*/ 0x08) - if_chr_in_room(CHR_TARGET, 0x00, 0x0045, /*goto*/ 0x2e) - goto_next(0x0b) - - label(0x2e) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2e) - goto_next(0x0b) - - label(0x2e) - endloop(0x0a) - - // 1 second since uplink - label(0x08) - show_hudmsg(CHR_TARGET, L_IMP_053) // "Bypassing security systems." - restart_timer - assign_sound(SFX_01BF, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_SKEDAR_SHUTTLE, TRUE) - - beginloop(0x13) - if_object_in_good_condition(OBJ_SKEDAR_SHUTTLE, /*goto*/ 0x2f) - goto_next(0x0f) - - label(0x2f) - if_timer_gt(400, /*goto*/ 0x08) - if_chr_in_room(CHR_TARGET, 0x00, 0x0045, /*goto*/ 0x2e) - goto_next(0x0b) - - label(0x2e) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_DATAUPLINK, /*goto*/ 0x2e) - goto_next(0x0b) - - label(0x2e) - endloop(0x13) - - // 7.66 seconds since uplink - label(0x08) - mute_channel(CHANNEL_5) - assign_sound(SFX_01C1, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_SKEDAR_SHUTTLE, TRUE) - show_hudmsg(CHR_TARGET, L_IMP_054) // "Virus has been downloaded successfully." - yield - show_hudmsg(CHR_TARGET, L_IMP_055) // "Ship's engines have been activated." - set_stage_flag(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF) - - beginloop(0x14) - if_timer_gt(90, /*goto*/ 0x08) - endloop(0x14) - - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - reloop(0x04) - - // Connection broken - label(0x0b) - show_hudmsg(CHR_TARGET, L_IMP_056) // "Connection to ship has been broken." - mute_channel(CHANNEL_5) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, OBJ_SKEDAR_SHUTTLE, TRUE) - restart_timer - - beginloop(0x15) - if_timer_gt(120, /*goto*/ 0x08) - endloop(0x15) - - label(0x08) - mute_channel(CHANNEL_6) - endloop(0x04) - - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1028_shuttle_immunity[] = { - beginloop(0xe4) - if_stage_flag_eq(STAGEFLAG_TRIGGER_SHUTTLE_TAKEOFF, TRUE, /*goto*/ 0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0045, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x0046, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x0047, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x004d, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x004e, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x0055, /*goto*/ 0x2e) - reloop(0xe4) - - label(0x2e) - unset_object_flag(OBJ_SKEDAR_SHUTTLE, OBJFLAG_INVINCIBLE) - endloop(0xe4) - - label(0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1029_setup_rtracker[] = { - yield - set_object_flag3(OBJ_DEVASTATOR, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102a_setup_environment[] = { - yield - configure_environment(0x0045, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0055, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0056, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102b_safedoor_immunity[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x10) - set_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) - - beginloop(0x04) - if_objective_complete(2, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_object_in_good_condition(OBJ_SAFEDOOR, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2e) - if_chr_in_room(CHR_BOND, 0x00, 0x000c, /*goto*/ 0x2e) - goto_next(0x0b) - - label(0x2e) - if_chr_weapon_equipped(CHR_BOND, WEAPON_LASER, /*goto*/ 0x0f) - - // Jo not in office room or laser not equipped - label(0x0b) - if_chr_in_room(CHR_COOP, 0x00, 0x000c, /*goto*/ 0x2e) - goto_next(0x0e) - - label(0x2e) - if_chr_weapon_equipped(CHR_COOP, WEAPON_LASER, /*goto*/ 0x0f) - - // No one in office room with laser equipped - label(0x0e) - set_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) - reloop(0x04) - - label(0x0f) - unset_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) - endloop(0x04) - - // A and SA - label(0x10) - set_object_flag(OBJ_SAFEDOOR, OBJFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This keeps the hostage doors locked until the player attempts to open them. - * The "This door is locked" messae is omitted, then the door is unlocked and - * opened via scripting. This prevents guards from opening the doors and - * triggering the hostage rooms before the player is there. - */ -u8 func102c_door_flags[] = { - yield - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x0f) - lock_door(0x23, 0x40) - lock_door(0x24, 0x40) - set_object_flag2(0x23, OBJFLAG2_SKIPDOORLOCKEDMSG) - set_object_flag2(0x24, OBJFLAG2_SKIPDOORLOCKEDMSG) - lock_door(0x43, 0x40) - lock_door(0x44, 0x40) - set_object_flag2(0x43, OBJFLAG2_SKIPDOORLOCKEDMSG) - set_object_flag2(0x44, OBJFLAG2_SKIPDOORLOCKEDMSG) - lock_door(0x54, 0x40) - set_object_flag2(0x54, OBJFLAG2_SKIPDOORLOCKEDMSG) - lock_door(0x19, 0x40) - set_object_flag2(0x19, OBJFLAG2_SKIPDOORLOCKEDMSG) - - beginloop(0xe4) - if_chr_activated_object(CHR_BOND, 0x23, /*goto*/ 0x0a) - if_chr_activated_object(CHR_BOND, 0x23, /*goto*/ 0x0a) - if_chr_activated_object(CHR_BOND, 0x43, /*goto*/ 0x0b) - if_chr_activated_object(CHR_BOND, 0x44, /*goto*/ 0x0b) - if_chr_activated_object(CHR_BOND, 0x54, /*goto*/ 0x0c) - if_chr_activated_object(CHR_BOND, 0x19, /*goto*/ 0x0d) - reloop(0xe4) - - label(0x0a) - unlock_door(0x23, 0x40) - unlock_door(0x24, 0x40) - open_door(0x23) - reloop(0xe4) - - label(0x0b) - unlock_door(0x43, 0x40) - unlock_door(0x44, 0x40) - open_door(0x43) - reloop(0xe4) - - label(0x0c) - unlock_door(0x54, 0x40) - open_door(0x54) - reloop(0xe4) - - label(0x0d) - unlock_door(0x19, 0x40) - open_door(0x19) - endloop(0xe4) - - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function2[] = { - beginloop(0x03) - restart_timer - - // Wait 10 seconds - beginloop(0x0a) - if_timer_gt(600, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - chr_do_animation(ANIM_CUT_IMP_INTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x34, 4) - endloop(0x03) - - endlist -}; - -#if VERSION >= VERSION_NTSC_1_0 -u8 unregistered_function3[] = { - beginloop(0x03) - if_chr_knockedout(CHR_TAKER_INFO_F, /*goto*/ 0x11) - if_chr_knockedout(CHR_TAKER_INFO_M, /*goto*/ 0x12) - reloop(0x03) - - label(0x11) - damage_chr(CHR_TAKER_INFO_F, WEAPON_SUPERDRAGON) - reloop(0x03) - - label(0x12) - damage_chr(CHR_TAKER_INFO_M, WEAPON_SUPERDRAGON) - endloop(0x03) - - endlist -}; -#endif - -#if VERSION >= VERSION_NTSC_1_0 -u8 func102d_firingrange_taker_invincibility[] = { - beginloop(0x03) - if_chr_deadish(CHR_TAKER_FR1, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x0007, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x0008, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x0009, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR1, 0x00, 0x000a, /*goto*/ 0x2e) - unset_chr_chrflag(CHR_TAKER_FR1, CHRCFLAG_INVINCIBLE) - - label(0x2e) - if_chr_deadish(CHR_TAKER_FR2, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x0007, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x0008, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x0009, /*goto*/ 0x2e) - if_chr_in_room(CHR_TAKER_FR2, 0x00, 0x000a, /*goto*/ 0x2e) - unset_chr_chrflag(CHR_TAKER_FR2, CHRCFLAG_INVINCIBLE) - - label(0x2e) - endloop(0x03) - - endlist -}; -#endif - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_hide_blondes_and_skedar, 0x1003 }, - { func1004_check_hostages_killed, 0x1004 }, - { func1005_check_safeinfo_destroyed, 0x1005 }, - { func1007_autogun_switch1, 0x1007 }, - { func1008_autogun_switch2, 0x1008 }, - { func1009_autogun_switch3, 0x1009 }, - { func100b_setup_autoguns, 0x100b }, - { func100c_check_carrington_dead, 0x100c }, - { func100e_setup_firingrange, 0x100e }, - { func100f_check_holo_takers_dead, 0x100f }, - { func1010_check_device_takers_dead, 0x1010 }, - { func1011_check_info_takers_dead, 0x1011 }, - { func1012_info_room, 0x1012 }, - { func1013_check_hostages_saved, 0x1013 }, - { func1014_carrington_messages, 0x1014 }, - { func1015_firingrange_pc, 0x1015 }, - { func1016_remove_spawners, 0x1016 }, - { func1018_hurt_carrington, 0x1018 }, - { func1019_setup_safeinfo, 0x1019 }, - { func101b_msg_autodefenses, 0x101b }, - { func101c_msg_fosterworkingon, 0x101c }, - { func101d_msg_countingonme, 0x101d }, - { func101e_msg_wontknow, 0x101e }, - { func101f_configure_cisoldiers, 0x101f }, - { func1020_trigger_spawning, 0x1020 }, - { func1021_setup_jonathan, 0x1021 }, - { func1022_skedar_shuttle, 0x1022 }, - { func1023_check_skeder_shuttle_destroyed, 0x1023 }, - { func1024_setup_lifts, 0x1024 }, - { func1025_lift_door_sounds, 0x1025 }, - { func100e_setup_firingrange_doors, 0x1026 }, - { func1027_uplink, 0x1027 }, - { func1028_shuttle_immunity, 0x1028 }, - { func1029_setup_rtracker, 0x1029 }, - { func102a_setup_environment, 0x102a }, - { func102b_safedoor_immunity, 0x102b }, - { func102c_door_flags, 0x102c }, -#if VERSION >= VERSION_NTSC_1_0 - { func102d_firingrange_taker_invincibility, 0x102d }, -#endif - { func1002_intro, 0x0c00 }, - { func0c01_outro, 0x0c01 }, - { func1002_intro, 0x0417 }, - { func0c01_outro, 0x0418 }, - { func0414_firingrange_hostage, 0x0414 }, - { func0415_init_hostage_fr1, 0x0415 }, - { func0416_init_hostage_fr2, 0x0416 }, - { func0401_spawner1, 0x0401 }, - { func0404_spawner2, 0x0404 }, - { func0407_spawner3, 0x0407 }, - { func040a_spawner4, 0x040a }, - { func040d_spawner5, 0x040d }, - { func0410_spawner6, 0x0410 }, - { func0402_clone1, 0x0402 }, - { func0403_init_clone1, 0x0403 }, - { func0405_clone2, 0x0405 }, - { func0406_init_clone2, 0x0406 }, - { func0408_clone3, 0x0408 }, - { func0409_init_clone3, 0x0409 }, - { func040b_clone4, 0x040b }, - { func040c_init_clone4, 0x040c }, - { func040e_clone5, 0x040e }, - { func040f_init_clone5, 0x040f }, - { func0411_clone6, 0x0411 }, - { func0412_init_clone6, 0x0412 }, - { func0413_defend_pad, 0x0413 }, - { func0419_init_firingrange_taker, 0x0419 }, - { func041a_hostage_holo, 0x041a }, - { func041b_init_hostage_holo, 0x041b }, - { func041c_init_holoclone1, 0x041c }, - { func041d_init_holoclone2, 0x041d }, - { func041e_init_holoclone3, 0x041e }, - { func041f_holoclone, 0x041f }, - { func0420_taker_holo1, 0x0420 }, - { func0421_taker_holo2, 0x0421 }, - { func0422_taker_holo3, 0x0422 }, - { func0423_init_shock, 0x0423 }, - { func0425_hostage_thank_and_run, 0x0425 }, - { func0426_init_saved_hostage, 0x0426 }, - { func0427_drop_devastator, 0x0427 }, - { func0428_init_drop_devastator, 0x0428 }, - { func0429_skedar4, 0x0429 }, - { func042a_init_jonathan, 0x042a }, - { func041f_holoclone_onshot, 0x0424 }, - { func042b_deviceroom_hostage, 0x042b }, - { func042c_init_hostage_device_f, 0x042c }, - { func042d_init_hostage_device_m, 0x042d }, - { func042e_taker_device_m, 0x042e }, - { func042f_init_taker_device_m, 0x042f }, - { func0430_taker_device_f, 0x0430 }, - { func0431_init_taker_device_f, 0x0431 }, - { func0432_taker_attack, 0x0432 }, - { func0433_inforoom_hostage, 0x0433 }, - { func0434_init_hostage_info_m, 0x0434 }, - { func0435_init_hostage_info_f, 0x0435 }, - { func0436_taker_info_m, 0x0436 }, - { func0437_init_taker_info_m, 0x0437 }, - { func0438_taker_info_f, 0x0438 }, - { func0439_init_taker_info_f, 0x0439 }, - { func043a_unused, 0x043a }, - { func043b_init_blonde, 0x043b }, - { func043c_init_cisolder, 0x043c }, - { func043d_unused, 0x043d }, - { func043e_carrington, 0x043e }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, PATHFLAG_FLYING }, { NULL, 0, 0 }, diff --git a/src/setups/setupjun.c b/src/setups/setupjun.c index 74fc0662c..104ebe04c 100644 --- a/src/setups/setupjun.c +++ b/src/setups/setupjun.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setuplam.c b/src/setups/setuplam.c index d5624157a..13991e619 100644 --- a/src/setups/setuplam.c +++ b/src/setups/setuplam.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setuplee.c b/src/setups/setuplee.c index 963fa4815..b003f25e1 100644 --- a/src/setups/setuplee.c +++ b/src/setups/setuplee.c @@ -242,7 +242,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -664,3288 +664,6 @@ s32 path05[] = { -1, }; -u8 func1001_objectives_failed_msg[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) -#endif - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1019_check_shields_lowered[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_SHIELDCONSOLE1, /*goto*/ 0x06) - if_object_in_good_condition(OBJ_SHIELDCONSOLE2, /*goto*/ 0x06) - if_object_in_good_condition(OBJ_SHIELDCONSOLE3, /*goto*/ 0x06) - show_hudmsg(CHR_BOND, L_LEE_010) // "Ship's shields have been lowered." - set_stage_flag(STAGEFLAG_SHIELDS_DISABLED) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) - restart_timer - - beginloop(0x08) - if_chr_in_room(CHR_BOND, 0x00, 0x0002, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - speak(CHR_BOND, L_LEE_017, SFX_81A1, CHANNEL_6, COLOR_04_ORANGE) // "You've got to open the hangar doors so we can dock..." - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - endloop(0x04) - - label(0x09) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_check_hangar_doors_opened[] = { - yield - set_object_flag(OBJ_HANGARDOOR1, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(OBJ_HANGARDOOR2, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(OBJ_HANGARDOOR3, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(OBJ_HANGARDOOR4, OBJFLAG_CANNOT_ACTIVATE) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, OBJ_HANGARDOORCONSOLE, /*goto*/ 0x06) - if_object_in_good_condition(OBJ_HANGARDOORCONSOLE, /*goto*/ 0x2d) - - // Console destroyed - show_hudmsg(CHR_BOND, L_LEE_048) // "Critical mission object destroyed." - set_stage_flag(STAGEFLAG_HANGAR_DOOR_CONSOLE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Console healthy - label(0x2d) - reloop(0x04) - - // A and SA - label(0x2c) - if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x03) - reloop(0x04) - - // Console activated - label(0x06) - if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_LEE_047) // "Hangar doors locked - shields still active." - restart_timer - - beginloop(LABEL_65) - if_timer_gt(120, /*goto*/ 0x06) - endloop(LABEL_65) - - label(0x06) - endloop(0x04) - - // PA - console activated after shields disabled - label(0x2c) - show_hudmsg(CHR_P1P2, L_LEE_011) // "Hangar doors have been opened." - set_stage_flag(STAGEFLAG_HANGAR_DOORS_OPEN) - - // A and SA once shields disabled, or follow through from above - label(0x03) - open_door(OBJ_HANGARDOOR1) - open_door(OBJ_HANGARDOOR2) - open_door(OBJ_HANGARDOOR3) - open_door(OBJ_HANGARDOOR4) - set_object_flag(OBJ_HANGARDOOR1, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_HANGARDOOR2, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_HANGARDOOR3, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_HANGARDOOR4, OBJFLAG_DOOR_KEEPOPEN) - restart_timer - - beginloop(0x09) - if_timer_gt(600, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_HANGAR_MAIANS) - - label(0x08) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_elvis_wait_for_hangar_entry[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_accuracy(100) - set_reaction_speed(100) - add_health_or_armor(200) - set_alertness(100) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - - beginloop(0x04) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_HANGAR_DOORS_OPEN, TRUE, /*goto*/ 0x06) - reloop(0x04) - - label(0x2c) - if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - - beginloop(LABEL_65) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2c) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2c) - set_target_chr(CHR_ANTI) - if_can_see_target(/*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - endloop(LABEL_65) - - label(0x06) - unset_self_chrflag(CHRCFLAG_HIDDEN) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - yield - yield - yield - yield - set_ailist(CHR_SELF, AILIST_ELVIS_GIVE_AR34) - endlist -}; - -u8 func040e_elvis_give_ar34[] = { - set_shotlist(AILIST_ELVIS_GIVE_AR34) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - stop_chr - - // Wait until player in sight - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - set_chrpreset(CHR_P1P2) - if_can_see_target(/*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - - beginloop(0x08) - if_can_see_target(/*goto*/ 0x2c) - endloop(0x08) - - // Run towards player - label(0x0a) - restart_timer - try_run_to_target(/*goto*/ 0x09) - - beginloop(0x09) - set_target_chr(CHR_PRESET) - if_timer_gt(60, /*goto*/ 0x2c) - if_distance_to_target_lt(200, /*goto*/ 0x06) - reloop(0x09) - - label(0x06) - if_can_see_target(/*goto*/ 0x06) - endloop(0x09) - - label(0x2c) - goto_first(0x0a) - - // Talk - label(0x06) - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - set_stage_flag(STAGEFLAG_MET_ELVIS) - speak(CHR_P1P2, L_LEE_019, MP3_02E1, CHANNEL_6, COLOR_04_ORANGE) // "Good to see you, Joanna." - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0c) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - speak(CHR_P1P2, L_LEE_020, MP3_02E2, CHANNEL_6, COLOR_04_ORANGE) // "Take this - you should find it useful..." - give_object_to_chr(OBJ_AR34, CHR_PRESET) - show_hudmsg(CHR_PRESET, L_LEE_021) // "Received AR34 assault rifle." - restart_timer - - beginloop(0x0d) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - set_stage_flag(STAGEFLAG_HANGAR_ALARM_ACTIVATED) - activate_alarm - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - label(0x0f) - yield - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) - endlist -}; - -/** - * Follow player. - * If entered nav room, do that objective. - * If arrived at prebridge lift, assign another function. - */ -u8 func0409_elvis_follow[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_00000040) -#endif - set_shotlist(AILIST_ELVIS_FOLLOW) - set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Dying - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Injured - label(0x2c) -#if VERSION >= VERSION_NTSC_1_0 - restart_timer - say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(LABEL_C1) - if_timer_gt(180, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(LABEL_C1) - - // Healthy - label(0x06) -#else - say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(LABEL_C1) - if_chr_stopped(/*goto*/ 0x06) - endloop(LABEL_C1) - - label(0x06) -#endif - - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - - label(0x03) - set_target_chr(CHR_PRESET) - restart_timer - if_distance_to_target_gt(500, /*goto*/ 0x06) - try_jog_to_target(/*goto*/ 0x04) - - // Distance < 200 or distance > 500 - label(0x06) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_NAVIGATION_ROOM_DONE, TRUE, /*goto*/ 0x2c) - if_chr_in_room(CHR_ELVIS, 0x00, 0x003e, /*goto*/ LABEL_B5) - label(0x2c) - if_stage_flag_eq(STAGEFLAG_SAID_GO_ON_AHEAD, TRUE, /*goto*/ 0x2c) - if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ LABEL_C4) - label(0x2c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2c) - endloop(0x04) - - // Running for 1 second - do distance checks again - label(0x2c) - goto_first(0x03) - - // At player - label(0x06) - stop_chr - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_NAVIGATION_ROOM_DONE, TRUE, /*goto*/ 0x2c) - if_chr_in_room(CHR_ELVIS, 0x00, 0x003e, /*goto*/ LABEL_B5) - label(0x2c) - if_stage_flag_eq(STAGEFLAG_SAID_GO_ON_AHEAD, TRUE, /*goto*/ 0x2c) - if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ LABEL_C4) - label(0x2c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_gt(300, /*goto*/ 0x06) - endloop(0x09) - - // Player moved away - do distance checks and start following - label(0x06) - goto_first(0x03) - - // Enemy detected - label(0x08) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x2c) - if_chrpresets_target_is_different(/*goto*/ 0x06) - label(0x2c) - goto_first(0x03) - - label(0x06) - call_rng - if_rand_lt(85, /*goto*/ LABEL_65) - if_rand_lt(170, /*goto*/ LABEL_66) - say_quip(CHR_BOND, 0x26, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2c) - label(LABEL_65) - say_quip(CHR_BOND, 0x27, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2c) - label(LABEL_66) - say_quip(CHR_BOND, 0x28, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - label(0x2c) - set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW) - set_shotlist(AILIST_ELVIS_FOLLOW) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // Elvis in nav room - label(LABEL_B5) - jog_to_pad(PAD_LEE_0034) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x2c) - endloop(0x0f) - - label(0x2c) - restart_timer - chr_do_animation(ANIM_OPERATE_0221, 0, -1, 0, 16, CHR_SELF, 2) - - beginloop(0x10) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x10) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - show_hudmsg(CHR_BOND, L_LEE_013) // "Navigational information has been retrieved." - speak(CHR_PRESET, L_LEE_031, MP3_02E4, CHANNEL_6, COLOR_04_ORANGE) // "Time to head upwards..." - restart_timer - set_stage_flag(STAGEFLAG_NAVIGATION_ROOM_DONE) - - beginloop(LABEL_79) - if_timer_gt(90, /*goto*/ 0x06) - endloop(LABEL_79) - - label(0x06) - mute_channel(CHANNEL_6) - goto_first(0x03) - - // Elvis outside prebridgelift - label(LABEL_C4) - set_ailist(CHR_SELF, AILIST_INIT_ELVIS_OUTSIDE_PREBRIDGELIFT) - endlist -}; - -u8 func041d_init_elvis_outside_prebridgelift[] = { - set_shotlist(AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) - add_health_or_armor(600) - set_ailist(CHR_SELF, AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) - endlist -}; - -u8 func041c_elvis_outside_prebridgelift[] = { - set_shotlist(AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Dying - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - stop_chr - set_target_chr(CHR_PRESET) - set_stage_flag(STAGEFLAG_SAID_GO_ON_AHEAD) - if_stage_flag_eq(STAGEFLAG_ENTERED_BRIDGELIFT, TRUE, /*goto*/ 0x2c) - speak(CHR_PRESET, L_LEE_026, MP3_04DC, CHANNEL_6, COLOR_04_ORANGE) // "You go on ahead, Jo. I'll secure the perimeter. We..." - label(0x2c) - run_to_pad(PAD_LEE_0063) - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x0b) - endloop(0x09) - - label(0x0b) - stop_chr - - beginloop(0x0c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - endloop(0x0c) - - label(0x08) - set_shotlist(AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) - set_returnlist(CHR_SELF, AILIST_ELVIS_OUTSIDE_PREBRIDGELIFT) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func040a_elvis_go_to_hangar_lift[] = { - set_shotlist(AILIST_ELVIS_GO_TO_HANGAR_LIFT) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Dying - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - - label(0x03) - set_target_chr(CHR_BOND) - restart_timer - if_morale_lt(50, /*goto*/ 0x06) - goto_next(LABEL_C3) - - label(0x06) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - if_timer_gt(60, /*goto*/ 0x2c) - if_distance_to_target_lt(200, /*goto*/ 0x06) - endloop(0x04) - - label(0x2c) - goto_first(0x03) - - // At player - label(0x06) - speak(CHR_BOND, L_LEE_022, MP3_02E4, CHANNEL_6, COLOR_04_ORANGE) // "Time to head upwards. I'll take this lift; you tak..." - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - set_morale(50) - - beginloop(0x0c) - if_timer_gt(180, /*goto*/ LABEL_C3) - endloop(0x0c) - - // Done talk - label(LABEL_C3) - restart_timer - run_to_pad(PAD_LEE_00B2) - - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - stop_chr - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041b_elvis_at_bridge[] = { - stop_chr - set_shotlist(AILIST_ELVIS_AT_BRIDGE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Dying - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - label(0x06) - if_morale_lt(100, /*goto*/ 0x06) - goto_next(0x2c) - - label(0x06) - set_morale(100) - label(0x2c) - - beginloop(LABEL_65) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(LABEL_65) - - label(0x2c) - run_to_pad(PAD_LEE_008A) - restart_timer - - beginloop(0x09) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_stopped(/*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_SAID_LOOKOUT, TRUE, /*goto*/ 0x06) - if_timer_gt(180, /*goto*/ 0x2c) - label(0x06) - reloop(0x09) - - label(0x2c) - speak(CHR_TARGET, L_LEE_024, MP3_02E3, CHANNEL_6, COLOR_04_ORANGE) // "Look out, Joanna! I think we've made them angry..." - set_stage_flag(STAGEFLAG_SAID_LOOKOUT) - endloop(0x09) - - // Reached pad - label(0x0b) - stop_chr - - beginloop(0x0c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - endloop(0x0c) - - label(0x08) - set_shotlist(AILIST_ELVIS_AT_BRIDGE) - set_returnlist(CHR_SELF, AILIST_ELVIS_AT_BRIDGE) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func1005_check_elvis_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - show_hudmsg(CHR_BOND, L_LEE_012) // "Elvis has been killed." - set_stage_flag(STAGEFLAG_ELVIS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040f_init_skedar[] = { - if_chr_deadish(CHR_SELF, /*goto*/ 0x0d) - - // Alive - set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(190) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) - - // Dying or dead - label(0x0d) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0410_wake_suspendedanim_skedar[] = { - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(190) - set_recovery_speed(0) - set_shield(0) - set_target_chr(CHR_BOND) - try_walk_to_target(/*goto*/ 0x2c) - - label(0x2c) - set_shotlist(GAILIST_RELATED_TO_SPAWNING) - set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) - endlist -}; - -u8 func1006_wake_slayer_skedar[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0033, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - // 1 - label(0x06) - unlock_door(0x0f, 0x02) - unlock_door(0x10, 0x02) - open_door(0x0f) - set_chr_team(CHR_SUSPENDEDANIM1, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SUSPENDEDANIM1, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - // 2 - label(0x06) - unlock_door(0x13, 0x02) - unlock_door(0x14, 0x02) - open_door(0x13) - - if_chr_deadish(CHR_SUSPENDEDANIM3, /*goto*/ 0x2c) - set_ailist(CHR_SUSPENDEDANIM3, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) - - set_chr_team(CHR_SUSPENDEDANIM3, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - - // Wait until player coming back from Slayer area - label(0x2c) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_ENTERED_SLAYER_AREA, TRUE, /*goto*/ 0x2c) - reloop(0x0a) - - label(0x2c) - if_chr_in_room(CHR_P1P2, 0x00, 0x0033, /*goto*/ 0x2c) - endloop(0x0a) - - // 3 - label(0x2c) - unlock_door(0x11, 0x02) - unlock_door(0x12, 0x02) - unlock_door(0x15, 0x02) - unlock_door(0x16, 0x02) - open_door(0x11) - open_door(0x15) - set_ailist(CHR_SUSPENDEDANIM2, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) - set_chr_team(CHR_SUSPENDEDANIM2, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - - // 4 - set_ailist(CHR_SUSPENDEDANIM4, AILIST_WAKE_SUSPENDEDANIM_SKEDAR) - set_chr_team(CHR_SUSPENDEDANIM4, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_check_entered_slayer_area[] = { - beginloop(0x08) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x003a, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x003b, /*goto*/ 0x2c) - reloop(0x08) - - label(0x2c) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - if_chr_in_room(CHR_COOP, 0x00, 0x003a, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x003b, /*goto*/ 0x06) - endloop(0x08) - - label(0x2d) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x0d) - label(0x06) - set_stage_flag(STAGEFLAG_ENTERED_SLAYER_AREA) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_hangar_lifts[] = { - set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) - - // Wait until kills done - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_HANGAR_KILLS_DONE, TRUE, /*goto*/ 0x2c) - endloop(0x08) - - // Activate Jo's lift so it starts going to bottom - label(0x2c) - unset_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - - // Wait until lift stopped at bottom - beginloop(LABEL_65) - if_lift_stationary(OBJ_HANGARLIFT_JO, /*goto*/ LABEL_66) - endloop(LABEL_65) - - // Deactivate lift and open door - label(LABEL_66) - set_object_flag(0x39, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x3a, OBJFLAG_DOOR_KEEPOPEN) - unset_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) - open_door(0x39) - open_door(0x3a) - yield - set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) - - beginloop(LABEL_67) - chr_toggle_p1p2(CHR_SELF) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0018, /*goto*/ 0x2c) - if_door_state(0x39, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x2d) - if_door_state(0x3a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x2d) - endloop(LABEL_67) - - // Door closing automatically - reopen it - label(0x2d) - goto_first(LABEL_66) - - // Jo has entered the lift, or Jo dead in co-op - label(0x2c) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) - if_chr_in_room(CHR_COOP, 0x00, 0x0018, /*goto*/ 0x2c) - goto_first(LABEL_67) - - // Jo or Velvet is in the lift - activate it - // Note the lift naturally waits 5 seconds at each stop, - // hence the 5 second wait if entered as soon as the door opens. - label(0x2c) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - unset_object_flag(0x39, OBJFLAG_DOOR_KEEPOPEN) - unset_object_flag(0x3a, OBJFLAG_DOOR_KEEPOPEN) - unset_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) - - // Wait until Y coordinate >= 400 - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ 0x2c) - if_chr_y(CHR_P1P2, 400, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x0a) - - label(0x2c) - endloop(0x09) - - // Wait until lift stopped at top - beginloop(0x0a) - if_lift_stationary(OBJ_HANGARLIFT_JO, /*goto*/ 0x2c) - endloop(0x0a) - - label(0x2c) - set_object_flag(OBJ_HANGARLIFT_JO, OBJFLAG_DEACTIVATED) - unset_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) - set_ailist(CHR_ELVIS, GAILIST_STOP_AND_IDLE) - yield - -#if VERSION >= VERSION_NTSC_1_0 - if_chr_y(CHR_ELVIS, 400, OPERATOR_LESS_THAN, /*goto*/ 0x06) - goto_next(0x2c) - - // Warp Elvis to his lift - label(0x06) - - beginloop(0x5c) - chr_move_to_pad(CHR_ELVIS, PAD_LEE_00AD, 0x00, /*goto*/ 0x2c) - chr_move_to_pad(CHR_ELVIS, PAD_LEE_01E6, 0x00, /*goto*/ 0x2c) - chr_move_to_pad(CHR_ELVIS, PAD_LEE_01E7, 0x00, /*goto*/ 0x2c) - endloop(0x5c) - - // Activate his lift and wait 2 seconds - label(0x2c) - unset_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) -#else - chr_move_to_pad(CHR_ELVIS, PAD_LEE_00AD, 0x00, /*goto*/ 0x2c) - label(0x2c) -#endif - - restart_timer - - beginloop(0x0b) - if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? 120 : 60, /*goto*/ 0x0c) - endloop(0x0b) - - // Wait for lift to stop at top - beginloop(0x0c) - if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x2c) - endloop(0x0c) - - label(0x2c) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) - set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW) - label(0x2c) - - // Check Elvis actually rode the lift up, and if not then go into a loop - // attempting to warp him. -#if VERSION >= VERSION_NTSC_1_0 - beginloop(LABEL_64) - set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) - unset_object_flag(0x3b, OBJFLAG_CANNOT_ACTIVATE) - unset_object_flag(0x3c, OBJFLAG_CANNOT_ACTIVATE) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - if_chr_y(CHR_ELVIS, 400, OPERATOR_LESS_THAN, /*goto*/ 0x06) - goto_next(LABEL_68) - - // Handle case where Elvis is still in the hangar for some reason - label(0x06) - set_ailist(CHR_ELVIS, AILIST_SET_CLOAKED) - - beginloop(LABEL_6D) - chr_move_to_pad(CHR_ELVIS, PAD_LEE_0012, 0x01, /*goto*/ 0x2c) - endloop(LABEL_6D) - - label(0x2c) - set_ailist(CHR_ELVIS, AILIST_SET_UNCLOAKED) - endloop(LABEL_64) -#else - label(LABEL_64) - set_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) - unset_object_flag(0x3b, OBJFLAG_CANNOT_ACTIVATE) - unset_object_flag(0x3c, OBJFLAG_CANNOT_ACTIVATE) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) -#endif - - // Elvis is at top now - // For buddy or counterop who might still be in the hangar, - // wait for lift to be called from hangar - beginloop(LABEL_68) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x3b, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x3c, /*goto*/ 0x2c) - if_chr_activated_object(CHR_ANTI, 0x3b, /*goto*/ 0x2c) - if_chr_activated_object(CHR_ANTI, 0x3c, /*goto*/ 0x2c) - endloop(LABEL_68) - - // Bring Elvis's lift down - label(0x2c) - play_sound(SFX_81A6, -1) - unset_object_flag(OBJ_HANGARLIFT_ELVIS, OBJFLAG_DEACTIVATED) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - - // Wait for it to arrive at bottom - beginloop(LABEL_69) - if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x2c) - endloop(LABEL_69) - - // Wait for lift to be moving again (upwards) - label(0x2c) - - beginloop(LABEL_6A) - if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x06) - goto_next(0x2c) - - label(0x06) - endloop(LABEL_6A) - - label(0x2c) - yield - yield - yield - yield - - // Wait for lift stopped at top - beginloop(LABEL_6B) - if_lift_stationary(OBJ_HANGARLIFT_ELVIS, /*goto*/ 0x2c) - endloop(LABEL_6B) - - // Go back to waiting for lift to be called from hangar - label(0x2c) - goto_first(LABEL_64) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0407_init_knifeable_skedar[] = { - add_health_or_armor(160) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_self_chrflag(CHRCFLAG_00040000) - set_ailist(CHR_SELF, AILIST_KNIFEABLE_SKEDAR) - endlist -}; - -u8 func0408_knifeable_skedar[] = { - set_shotlist(AILIST_KNIFEABLE_SKEDAR) - if_just_injured(CHR_SELF, /*goto*/ 0x0c) - label(0x08) - yield - label(0x2c) - restart_timer - set_target_chr(CHR_CASS) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_CASS_AT_PAD, TRUE, /*goto*/ 0x06) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - set_target_chr(CHR_CASS) - if_just_injured(CHR_SELF, /*goto*/ 0x0c) - endloop(0x04) - - // Cass at pad - wait 2 seconds - label(0x06) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x09) - - // Move to spot where Cass dies - label(0x2c) - set_target_chr(CHR_P1P2) - jog_to_pad(PAD_LEE_00DD) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_stopped(/*goto*/ 0x06) - if_target_in_sight(/*goto*/ 0x0c) - if_just_injured(CHR_SELF, /*goto*/ 0x0c) - endloop(0x0a) - - // Face away from player and wait 10 seconds - label(0x06) - restart_timer - set_target_chr(CHR_CASS) - try_face_entity(ATTACKFLAG_AIMATPAD, 0x00ef, /*goto*/ 0x0b) - - beginloop(0x0b) - chr_toggle_p1p2(CHR_SELF) - if_timer_gt(600, /*goto*/ 0x06) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x0c) - if_just_injured(CHR_SELF, /*goto*/ 0x0c) - set_target_chr(CHR_CASS) - endloop(0x0b) - - // Go to holding cell - label(0x06) - set_view_distance(100) - jog_to_pad(PAD_LEE_00D9) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_just_injured(CHR_SELF, /*goto*/ 0x0c) - if_chr_stopped(/*goto*/ 0x0d) - label(0x06) - if_target_in_sight(/*goto*/ 0x0c) - label(0x2c) - endloop(0x0a) - - // Saw player or got injured - label(0x0c) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - // Arrived at cell - wait 20 seconds - label(0x0d) - restart_timer - - beginloop(0x0e) - if_timer_gt(1200, /*goto*/ 0x2c) - endloop(0x0e) - - // Go back to Cass spot - label(0x2c) - jog_to_pad(PAD_LEE_00DD) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x2c) - endloop(0x0f) - - // Become idle - label(0x2c) - stop_chr - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Door is the second door. The one to the main room. - */ -u8 func1009_keep_door_open_in_intro[] = { - beginloop(LABEL_C2) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x06) - if_door_state(0x17, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x2c) - reloop(LABEL_C2) - - // Door closed - label(0x2c) - open_door(0x17) - endloop(LABEL_C2) - - // Intro finished - label(0x06) - yield - yield - - beginloop(0x04) - if_door_state(0x17, DOORSTATE_CLOSING, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_chr_flag_bankx(CHR_KNIFEABLE_SKEDAR, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_path(pathid) \ - set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) \ - set_reaction_speed(75) \ - set_chr_maxdamage(CHR_SELF, 10) \ - add_health_or_armor(190) \ - set_recovery_speed(0) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_RELATED_TO_SPAWNING) - -u8 func0401_start_path00[] = { - init_path(0) - endlist -}; - -u8 func0402_start_path01[] = { - init_path(1) - endlist -}; - -u8 func0403_start_path02[] = { - init_path(2) - endlist -}; - -u8 func0404_start_path03[] = { - init_path(3) - endlist -}; - -u8 func0405_start_path04[] = { - init_path(4) - endlist -}; - -u8 func0406_start_path05[] = { - init_path(5) - endlist -}; - -u8 func0412_hangarspawner[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - set_morale(0) - - beginloop(LABEL_C2) - if_stage_flag_eq(STAGEFLAG_HANGAR_ALARM_ACTIVATED, TRUE, /*goto*/ 0x04) - endloop(LABEL_C2) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_HANGAR_KILLS_DONE, FALSE, /*goto*/ 0x2c) - yield - yield - yield - yield - yield - goto_next(0x08) - - // Still killing - label(0x2c) - if_never_been_onscreen(/*goto*/ 0x4d) - if_can_see_target(/*goto*/ 0x08) - reloop(0x04) - - // Seen player, or kills done - label(0x08) - unset_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, AILIST_HANGARCLONE) - - // chrflag3_00000008 was unset - label(0x4d) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4d) - reloop(0x04) - - // Clone dead - label(0x4d) - try_spawn_clone2(CHR_SELF, AILIST_INIT_HANGARCLONE, 0, /*goto*/ 0x2c) - set_ailist(CHR_SELF, AILIST_HANGARCLONE) - label(0x2c) - add_morale(1) - yield - endloop(0x04) - - endlist -}; - -u8 func0413_init_hangarclone[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x07, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_HANGARCLONE) - endlist -}; - -u8 func0414_hangarclone[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - run_to_pad(PAD_LEE_00B4) - set_returnlist(CHR_SELF, AILIST_HANGARCLONE) - - beginloop(0x03) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2c) - endloop(0x03) - - label(0x2c) - set_shotlist(AILIST_HANGARCLONE) - set_returnlist(CHR_SELF, AILIST_HANGARCLONE) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func0419_hangar_maian[] = { - set_shotlist(AILIST_HANGAR_MAIAN) - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - - // @bug: Shoddy programming here. The jump to label 0x06 is likely supposed - // to go to the label 0x06 just prior to "AT PAD", but that is not the next - // label from here. Also, GOPOSFLAG_RUN will always be used because GOPOSFLAG_JOG - // lacks a goto_next 0x04. - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) - - // Distance to pad >= 200 - label(0x03) - restart_timer - if_chr_distance_to_pad_gt(CHR_SELF, 500, PAD_PRESET, /*goto*/ 0x06) - go_to_target_pad(GOPOSFLAG_JOG) - - // Intended: Distance to pad > 500 - // Actual: Always executes - label(0x06) - go_to_target_pad(GOPOSFLAG_RUN) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - goto_first(0x03) - - // Distance to pad < 200 - label(0x06) - stop_chr - - // Wait at pad for enemy - beginloop(0x09) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - // Enemy detected - label(0x08) - set_returnlist(CHR_SELF, AILIST_HANGAR_MAIAN) - set_shotlist(AILIST_HANGAR_MAIAN) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // Everything below here is unreachable - label(LABEL_B5) - jog_to_pad(PAD_LEE_0034) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x2c) - endloop(0x0f) - - label(0x2c) - restart_timer - chr_do_animation(ANIM_SNEEZE, 0, 193, 0, 16, CHR_SELF, 2) - - beginloop(0x10) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x10) - - label(0x06) - show_hudmsg(CHR_BOND, L_LEE_013) // "Navigational information has been retrieved." - set_stage_flag(STAGEFLAG_NAVIGATION_ROOM_DONE) - goto_first(0x03) - - endlist -}; - -u8 func0418_init_hangar_maian[] = { - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_HANGAR_MAIANS, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unset_self_chrflag(CHRCFLAG_HIDDEN) - add_health_or_armor(200) - set_reaction_speed(100) - set_ailist(CHR_SELF, AILIST_HANGAR_MAIAN) - endlist -}; - -u8 func100a_check_hangar_kills_done[] = { - yield - beginloop(LABEL_C2) - if_stage_flag_eq(STAGEFLAG_MET_ELVIS, TRUE, /*goto*/ 0x2c) - endloop(LABEL_C2) - - label(0x2c) - restart_timer - - // Wait 2 minutes, or: - // A = 6 kills - // SA = 8 kills - // PA = 10 kills - beginloop(0x04) - if_timer_gt(7200, /*goto*/ 0x2c) - if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_65) - if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_66) - - // PA - if_kill_count_gt(9, /*goto*/ 0x2c) - reloop(0x04) - - // A - label(LABEL_65) - if_kill_count_gt(5, /*goto*/ 0x2c) - reloop(0x04) - - // SA - label(LABEL_66) - if_kill_count_gt(7, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - set_stage_flag(STAGEFLAG_HANGAR_KILLS_DONE) - set_ailist(CHR_ELVIS, AILIST_ELVIS_GO_TO_HANGAR_LIFT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_msg_getshieldsdown[] = { - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - restart_timer - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_CASS_SCREAMING, TRUE, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - restart_timer - - beginloop(LABEL_C2) - if_timer_gt(120, /*goto*/ 0x06) - endloop(LABEL_C2) - - label(0x06) - speak(CHR_BOND, L_LEE_016, SFX_81A0, CHANNEL_6, COLOR_04_ORANGE) // "Outside, Joanna. Get the shields down and we can h..." - set_stage_flag(STAGEFLAG_SAID_GETSHIELDSDOWN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_engineroom[] = { - set_lights_state(0x0067, LIGHTOP_4, 0x46, 0xff, 0xfa) - - // Wait until both engines destroyed - beginloop(0x04) - if_object_in_good_condition(OBJ_ENGINE1, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_ENGINE2, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - endloop(0x04) - - label(0x06) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) - set_ailist(CHR_ELVIS, AILIST_ELVIS_RUN_FROM_ENGINEROOM) - play_x_track(XREASON_DEFAULT, 10, 10) - speak(CHR_BOND, L_LEE_046, MP3_03D7, CHANNEL_6, COLOR_04_ORANGE) // "We have to get out of here!" - label(0x2c) - set_countdown_timer(10) - show_countdown_timer - start_countdown_timer - - beginloop(LABEL_65) - if_countdown_timer_lt(1, /*goto*/ 0x2c) - endloop(LABEL_65) - - // Timer expired - label(0x2c) - unset_object_flag(0x1b, OBJFLAG_INVINCIBLE) - unset_object_flag(0x1c, OBJFLAG_INVINCIBLE) - unset_object_flag(0x1d, OBJFLAG_INVINCIBLE) - unset_object_flag(0x1e, OBJFLAG_INVINCIBLE) - unset_object_flag(0x1f, OBJFLAG_INVINCIBLE) - unset_object_flag(0x20, OBJFLAG_INVINCIBLE) - set_object_flag2(0x1b, OBJFLAG2_80000000) - set_object_flag2(0x1c, OBJFLAG2_80000000) - set_object_flag2(0x1d, OBJFLAG2_80000000) - set_object_flag2(0x1e, OBJFLAG2_80000000) - set_object_flag2(0x1f, OBJFLAG2_80000000) - set_object_flag2(0x20, OBJFLAG2_80000000) - label(0x06) - hide_countdown_timer - unset_object_flag(0x21, OBJFLAG_INVINCIBLE) - destroy_object(0x21) - destroy_object(0x1b) - destroy_object(0x1c) - destroy_object(0x1d) - destroy_object(0x1e) - destroy_object(0x1f) - destroy_object(0x20) - show_hudmsg(CHR_BOND, L_LEE_023) // "Engines have been disabled." - set_stage_flag(STAGEFLAG_ENGINES_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This is the lift BEFORE the bridge lift. - * - * The lift moves automatically until you ride it up, then it stays at the top - * unless called from below. - */ -u8 func100d_prebridgelift[] = { - // Wait until Y >= 2600 - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 2600, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x0a) - - label(0x2c) - endloop(0x09) - - // Wait until lift stopped at top - beginloop(0x0a) - if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x2c) - endloop(0x0a) - - // Deactivate lift - label(0x2c) - label(LABEL_64) - set_object_flag(OBJ_PREBRIDGELIFT, OBJFLAG_DEACTIVATED) - unset_object_flag(0x3d, OBJFLAG_CANNOT_ACTIVATE) - unset_object_flag(0x3e, OBJFLAG_CANNOT_ACTIVATE) - - // Wait until lift called at bottom by buddy or counterop - beginloop(LABEL_68) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x2c) - if_chr_activated_object(CHR_ANTI, 0x3d, /*goto*/ 0x2c) - if_chr_activated_object(CHR_ANTI, 0x3e, /*goto*/ 0x2c) - endloop(LABEL_68) - - // Activate lift - label(0x2c) - play_sound(SFX_81A6, -1) - unset_object_flag(OBJ_PREBRIDGELIFT, OBJFLAG_DEACTIVATED) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - - // Wait until stopped at bottom - beginloop(LABEL_69) - if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x2c) - endloop(LABEL_69) - - label(0x2c) - - // Wait until moving (upwards) - beginloop(LABEL_6A) - if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x06) - goto_next(0x2c) - - label(0x06) - endloop(LABEL_6A) - - label(0x2c) - yield - yield - yield - yield - - // Wait until stopped at top - beginloop(LABEL_6B) - if_lift_stationary(OBJ_PREBRIDGELIFT, /*goto*/ 0x2c) - endloop(LABEL_6B) - - label(0x2c) - goto_first(LABEL_64) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_bridgelift[] = { - // Wait until Y >= 3600 - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 3600, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x0a) - - label(0x2c) - endloop(0x09) - - // Wait until lift stopped at top - beginloop(0x0a) - if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x2c) - endloop(0x0a) - - label(0x2c) - set_stage_flag(STAGEFLAG_ENTERED_BRIDGE) - - // Deactive lift - label(LABEL_64) - set_object_flag(OBJ_BRIDGELIFT, OBJFLAG_DEACTIVATED) - unset_object_flag(0x2f, OBJFLAG_CANNOT_ACTIVATE) - unset_object_flag(0x30, OBJFLAG_CANNOT_ACTIVATE) - - // Wait until lift called from below by buddy or counterop - beginloop(LABEL_68) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x2f, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x30, /*goto*/ 0x2c) - if_chr_activated_object(CHR_ANTI, 0x2f, /*goto*/ 0x2c) - if_chr_activated_object(CHR_ANTI, 0x30, /*goto*/ 0x2c) - endloop(LABEL_68) - - // Activate lift - label(0x2c) - play_sound(SFX_81A6, -1) - unset_object_flag(OBJ_BRIDGELIFT, OBJFLAG_DEACTIVATED) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - - // Wait until lift stopped - beginloop(LABEL_69) - if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x2c) - endloop(LABEL_69) - - label(0x2c) - - // Wait until lift moving again (upwards) - beginloop(LABEL_6A) - if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x06) - goto_next(0x2c) - - label(0x06) - endloop(LABEL_6A) - - label(0x2c) - yield - yield - yield - yield - - // Wait until lift stopped at top - beginloop(LABEL_6B) - if_lift_stationary(OBJ_BRIDGELIFT, /*goto*/ 0x2c) - endloop(LABEL_6B) - - label(0x2c) - goto_first(LABEL_64) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to the two Skedar behind the bridge doors who must be killed to end - * the level. - */ -u8 func0415_bridgespawner[] = { - set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(190) - set_recovery_speed(0) - set_shield(0) - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_cloaked(CHR_SELF, TRUE, FALSE) - set_self_chrflag(CHRCFLAG_00040000) - set_morale(0) - - beginloop(LABEL_C2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE_SPAWNING, TRUE, /*goto*/ 0x04) - endloop(LABEL_C2) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_BRIDGE_DOORS_UNLOCKED, TRUE, /*goto*/ 0x06) - if_morale_lt(2, /*goto*/ 0x2c) - - // Doors are unlocked (have been spawning for over a minute) - label(0x06) - restart_timer - - beginloop(LABEL_65) - if_timer_gt(60, /*goto*/ 0x06) - endloop(LABEL_65) - - label(0x06) - goto_next(0x08) - - // morale is 0 or 1 - label(0x2c) - if_never_been_onscreen(/*goto*/ 0x4d) - if_chr_deadish(CHR_CLONE, /*goto*/ 0x2c) - label(0x2c) - if_can_see_target(/*goto*/ 0x08) - endloop(0x04) - - // Been spawning for 61 seconds, or Skedar can see player - // Unhide and uncloak - label(0x08) - unset_self_chrflag(CHRCFLAG_HIDDEN) - yield - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, AILIST_INIT_BRIDGESPAWNER_REVEAL) - - // chrflag3_00000008 was unset - // 1 in 256 chance of spawning on any given frame (or script invocation?) - // or after 5 seconds just spawn one anyway. - label(0x4d) - restart_timer - - beginloop(0x10) - call_rng - if_timer_gt(300, /*goto*/ 0x2c) - if_rand_lt(1, /*goto*/ 0x2c) - endloop(0x10) - - // Check clone is dead - label(0x2c) - if_chr_deadish(CHR_CLONE, /*goto*/ 0x4d) - goto_first(0x04) - - // Spawn - label(0x4d) - try_spawn_clone2(CHR_SELF, AILIST_INIT_BRIDGECLONE, 0, /*goto*/ 0x2c) - unset_self_chrflag(CHRCFLAG_HIDDEN) - yield - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, AILIST_INIT_BRIDGESPAWNER_REVEAL) - - label(0x2c) - add_morale(1) - yield - goto_first(0x04) - - endlist -}; - -u8 func0416_init_bridgeclone[] = { - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(190) - set_recovery_speed(0) - set_shield(0) - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - label(0x04) - rebuild_teams - rebuild_squadrons - - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2c) - try_inherit_properties(CHR_BRIDGESPAWNER1, /*goto*/ 0x06) - - label(0x06) - goto_next(0x06) - - label(0x2c) - try_inherit_properties(CHR_BRIDGESPAWNER2, /*goto*/ 0x06) - - label(0x06) - add_health_or_armor(40) - set_ailist(CHR_SELF, AILIST_BRIDGECLONE) - endlist -}; - -/** - * Assigned to the two bridge spawners when they stop sending clones and reveal - * themselves. Kill count isn't actually used to check if they're dead, so this - * function isn't necessary. - */ -u8 func0417_init_spawner_reveal[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_KILLCOUNTABLE) - set_ailist(CHR_SELF, AILIST_BRIDGECLONE) - endlist -}; - -u8 func041a_bridgeclone[] = { - set_shotlist(AILIST_BRIDGECLONE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Dying - label(0x2c) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00020000) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2c) - set_target_chr(CHR_ELVIS) - goto_next(LABEL_C2) - - label(0x2c) - call_rng - if_rand_gt(128, /*goto*/ 0x2c) - set_target_chr(CHR_COOP) - if_chr_dead(CHR_COOP, /*goto*/ 0x2c) - goto_next(LABEL_C2) - - label(0x2c) - set_target_chr(CHR_BOND) - label(0x03) - - beginloop(LABEL_C2) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_enemy_distance_lt_and_los(1000, /*goto*/ 0x06) - endloop(LABEL_C2) - - // Has target - walk towards for 2 seconds - label(0x06) - if_distance_to_target_lt(150, /*goto*/ 0x2e) - label(LABEL_C5) - restart_timer - try_walk_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_timer_gt(120, /*goto*/ 0x09) - endloop(0x08) - - label(0x09) - restart_timer - try_run_to_target(/*goto*/ 0x0a) - - // Start running - beginloop(0x0a) - if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_target_moving_away(/*goto*/ 0x2c) - if_distance_to_target_lt(150, /*goto*/ 0x2e) - label(0x2c) - if_distance_to_target_lt(50, /*goto*/ 0x2e) - if_timer_gt(14, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - goto_first(0x09) - - // Close to target - face them - label(0x2e) - restart_timer - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 1, /*goto*/ 0x0b) - - beginloop(0x0b) - if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - if_timer_gt(15, /*goto*/ 0x06) - endloop(0x0b) - - // Attempt punch or kick - label(0x06) - try_punch_or_kick(/*goto*/ 0x2f) - goto_first(0x03) - - beginloop(0x2f) - if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x2f) - - // Attack finished - label(0x06) - goto_first(0x03) - - // Target chr dying - label(0x10) - stop_chr - - beginloop(0x0f) - if_chr_dead(CHR_SELF, /*goto*/ LABEL_B8) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) - endloop(0x0f) - - label(0x06) - goto_first(LABEL_C2) - - label(LABEL_B8) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_bridge_entry[] = { - // Wait until 3 bridge Skedar dead - beginloop(0x09) - if_chr_deadish(CHR_BRIDGE1, /*goto*/ 0x2c) - reloop(0x09) - - label(0x2c) - if_chr_deadish(CHR_BRIDGE2, /*goto*/ 0x2c) - reloop(0x09) - - label(0x2c) - if_chr_deadish(CHR_BRIDGE3, /*goto*/ 0x2c) - endloop(0x09) - - label(0x2c) - label(0x2c) - label(0x06) - restart_timer - - // Wait 11.66 seconds - beginloop(0x0a) - if_timer_gt(700, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_stage_flag(STAGEFLAG_ELVIS_COMING_TO_BRIDGE) - set_ailist(CHR_ELVIS, GAILIST_STOP_AND_IDLE) - yield - if_chr_y(CHR_ELVIS, 3500, OPERATOR_LESS_THAN, /*goto*/ LABEL_65) - goto_next(0x2c) - - // Elvis is somewhere below - warp him up - beginloop(LABEL_65) - chr_move_to_pad(CHR_ELVIS, PAD_LEE_00A7, 0x01, /*goto*/ 0x2c) - endloop(LABEL_65) - - label(0x2c) - set_ailist(CHR_ELVIS, AILIST_ELVIS_AT_BRIDGE) - restart_timer - - // Wait another 11.66 seconds - beginloop(0x08) - if_timer_gt(700, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_BRIDGE_SPAWNING) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_check_bridge_captured[] = { - beginloop(LABEL_C2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE_SPAWNING, TRUE, /*goto*/ 0x2c) - endloop(LABEL_C2) - - // Wait for 2 spawner skedar to be killed. If 60 seconds have passed, - // unlock the bridge doors in case they've gotten stuck or became unalert - // or something. - label(0x2c) - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_BRIDGE_DOORS_UNLOCKED, TRUE, /*goto*/ 0x2c) - if_timer_gt(3600, /*goto*/ 0x0d) - label(0x2c) - if_chr_deadish(CHR_BRIDGESPAWNER1, /*goto*/ 0x2c) - reloop(0x09) - - label(0x2c) - if_chr_deadish(CHR_BRIDGESPAWNER2, /*goto*/ 0x2c) - endloop(0x09) - - // 60 seconds elapsed - label(0x0d) - set_stage_flag(STAGEFLAG_BRIDGE_DOORS_UNLOCKED) - unlock_door(0x46, 0x40) - unlock_door(0x47, 0x40) - unlock_door(0x48, 0x40) - unlock_door(0x49, 0x40) - goto_first(0x09) - - label(0x2c) - show_hudmsg(CHR_BOND, L_LEE_025) // "Bridge has been captured." - set_stage_flag(STAGEFLAG_BRIDGE_CAPTURED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_check_end_level[] = { - beginloop(0x09) - if_all_objectives_complete(/*goto*/ 0x06) - endloop(0x09) - - label(0x06) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) - goto_next(0x06) - - // Both players dead - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Either buddy is alive - label(0x06) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2c) - - // Mission complete - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - - // Elvis dead - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_ATTACKSHIP_INTRO) - camera_movement(ANIM_CUT_LEE_INTRO_CAM) - cmd0175(60) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LEE_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LEE_INTRO_CASS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 4) - - set_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_INTRO_SKEDAR, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LEE_INTRO_SKEDAR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_SKEDAR, 4) - - restart_timer - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ LABEL_B0) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(60, LABEL_9A) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(120, LABEL_AC) - play_sound(MP3_075A, CHANNEL_10) - - wait_until(136, LABEL_9B) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(186, LABEL_9C) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(226, LABEL_9D) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(320, LABEL_9E) - speak(CHR_BOND, L_LEE_032, MP3_047F, CHANNEL_10, COLOR_09_BLUE) // "Oohhh... I'd better not be where I think I am." - - wait_until(505, LABEL_9F) - play_sound(SFX_0427, CHANNEL_10) - - wait_until(600, LABEL_A0) - speak(CHR_BOND, L_LEE_033, MP3_0480, CHANNEL_10, COLOR_04_ORANGE) // "And it's worse than that, my dear. Just look who y..." - - wait_until(1000, LABEL_A1) - speak(CHR_BOND, L_LEE_034, MP3_0481, CHANNEL_10, COLOR_09_BLUE) // "You! I thought you'd managed to escape. We found n..." - - wait_until(1018, LABEL_A2) - play_sound(SFX_0175, CHANNEL_10) - - wait_until(1142, LABEL_A3) - play_sound(SFX_0176, CHANNEL_10) - - wait_until(1168, LABEL_A4) - play_sound(SFX_0177, CHANNEL_10) - - wait_until(1210, LABEL_A5) - play_sound(SFX_0178, CHANNEL_10) - - wait_until(1260, LABEL_A6) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(1298, LABEL_A7) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(1358, LABEL_65) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(1396, LABEL_66) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(1400, LABEL_A8) - speak(CHR_BOND, L_LEE_035, MP3_0482, CHANNEL_10, COLOR_04_ORANGE) // "You couldn't find me. But there was no hiding from..." - - wait_until(1520, LABEL_67) - play_sound(SFX_0176, CHANNEL_10) - - wait_until(1592, LABEL_68) - play_sound(SFX_0177, CHANNEL_10) - - wait_until(1600, LABEL_69) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(1656, LABEL_6A) - play_sound(SFX_0175, CHANNEL_10) - - wait_until(1728, LABEL_6B) - play_sound(SFX_0178, CHANNEL_10) - - wait_until(1734, LABEL_6C) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(1770, LABEL_6E) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(1810, LABEL_61) - open_door(0x17) - play_sound(SFX_DOOR_801E, CHANNEL_10) - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until(1870, LABEL_6F) - speak(CHR_BOND, L_LEE_036, MP3_0483, CHANNEL_10, COLOR_04_ORANGE) // "This is it. Wait there! I'll make a distraction; i..." - - wait_until(1874, LABEL_70) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(1930, LABEL_71) - play_sound(SFX_0175, CHANNEL_10) - - wait_until(1986, LABEL_72) - play_sound(SFX_05A2, CHANNEL_10) - - wait_until(2040, LABEL_73) - play_sound(SFX_05A3, CHANNEL_10) - - wait_until(2108, LABEL_74) - play_sound(SFX_05A2, CHANNEL_10) - - wait_until(2168, LABEL_75) - play_sound(SFX_05A3, CHANNEL_10) - - wait_until(2226, LABEL_76) - play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) - - wait_until(2232, LABEL_77) - play_sound(SFX_05A2, CHANNEL_10) - - wait_until(2300, LABEL_62) - close_door(0x17) - - wait_until(2346, LABEL_78) - - wait_until(2424, LABEL_79) - play_sound(SFX_05A3, CHANNEL_10) - - wait_until(2468, LABEL_7A) - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until(2474, LABEL_7B) - play_sound(SFX_05A2, CHANNEL_10) - - wait_until(2560, LABEL_7C) - play_sound(SFX_0176, CHANNEL_10) - - wait_until(2580, LABEL_7D) - play_sound(SFX_0177, CHANNEL_10) - - wait_until(2581, LABEL_7E) - speak(CHR_BOND, L_LEE_037, MP3_0484, CHANNEL_10, COLOR_09_BLUE) // "Why are you doing this, Cassandra?" - - wait_until(2614, LABEL_7F) - play_sound(SFX_0171, CHANNEL_10) - - wait_until(2648, LABEL_80) - play_sound(SFX_0178, CHANNEL_10) - - wait_until(2670, LABEL_81) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(2708, LABEL_82) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(2736, LABEL_83) - play_sound(SFX_0174, CHANNEL_10) - - wait_until(2780, LABEL_84) - play_sound(SFX_0175, CHANNEL_10) - - wait_until(2790, LABEL_85) - speak(CHR_BOND, L_LEE_038, MP3_0485, CHANNEL_10, COLOR_04_ORANGE) // "The Skedar used me, Joanna. You are my best chance..." - - wait_until(2792, LABEL_86) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(2834, LABEL_87) - play_sound(SFX_0176, CHANNEL_10) - - wait_until(3016, LABEL_88) - play_sound(SFX_01DC, CHANNEL_10) - - wait_until(3068, LABEL_89) - play_sound(SFX_043A, CHANNEL_10) - play_sound(SFX_043D, CHANNEL_10) - - wait_until(3186, LABEL_63) - open_door(0x24) - - wait_until(3238, LABEL_8A) - play_sound(SFX_0177, CHANNEL_10) - - wait_until(3258, LABEL_8B) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(3280, LABEL_8C) - play_sound(SFX_0173, CHANNEL_10) - close_door(0x24) - - wait_until(3313, LABEL_8D) - play_sound(SFX_SKEDAR_ROAR_052A, CHANNEL_10) - speak(CHR_BOND, L_LEE_039, MP3_0486, CHANNEL_10, COLOR_04_ORANGE) // "Eeeeaaarrrrggghhh!!!" - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(LABEL_B0) - - label(0x2c) - if_controller_button_pressed(/*goto*/ LABEL_B0) - label(0x2c) - endloop(0x08) - - label(LABEL_B0) - label(0x06) - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - open_door(0x17) - mute_channel(CHANNEL_10) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LEE_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(CHR_CASS, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_CASS, CHRHFLAG_00020000) - set_chr_chrflag(CHR_CASS, CHRCFLAG_00000001) - chr_do_animation(ANIM_CUT_LEE_INTRO_CASS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_CASS, 2) - - unset_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_INTRO_SKEDAR, CHRHFLAG_00020000) - set_chr_chrflag(CHR_INTRO_SKEDAR, CHRCFLAG_00000001) - chr_do_animation(ANIM_CUT_LEE_INTRO_SKEDAR, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_SKEDAR, 2) - - remove_chr(CHR_INTRO_SKEDAR) - set_ailist(CHR_SHY_SKEDAR, AILIST_SHY_SKEDAR_WAIT) - enter_firstperson - yield - chr_move_to_pad(CHR_CASS, PAD_LEE_00DF, 0x01, /*goto*/ 0x2c) - label(0x2c) - set_ailist(CHR_CASS, AILIST_CASS) - stop_cutscene_track - stop_ambient_track - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c01_outro[] = { - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2c) - set_target_chr(CHR_BOND) - goto_next(0x06) - - label(0x2c) - set_target_chr(CHR_COOP) - label(0x06) - disable_object(0x2c) - camera_movement(ANIM_CUT_LEE_OUTRO_CAM) - play_cutscene_track(MUSIC_ATTACKSHIP_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - - set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LEE_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) - - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LEE_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - - enable_object(OBJ_OUTRO_SHUTTLE) - set_object_flag2(OBJ_OUTRO_SHUTTLE, OBJFLAG2_04000000) - set_object_flag3(OBJ_OUTRO_SHUTTLE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_LEE_OUTRO_SKSHUTTLE, OBJ_OUTRO_SHUTTLE, 0x04, 0xffff) - object_set_modelpart_visible(OBJ_OUTRO_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - - show_nonessential_chrs(FALSE) - restart_timer - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - - wait_until(38, LABEL_65) - play_sound(SFX_00F9, CHANNEL_10) - - wait_until(140, LABEL_66) - play_sound(SFX_00FD, CHANNEL_10) - - wait_until(150, LABEL_A9) - speak(CHR_BOND, L_LEE_040, MP3_0487, CHANNEL_10, COLOR_09_BLUE) // "Wow. That's the first time I've seen another plane..." - - wait_until(368, LABEL_67) - play_sound(SFX_00FA, CHANNEL_10) - play_sound(SFX_00FB, CHANNEL_10) - - wait_until(540, LABEL_69) - play_sound(SFX_00FE, CHANNEL_10) - - wait_until(550, LABEL_6B) - play_sound(SFX_00FC, CHANNEL_10) - - wait_until(580, LABEL_6C) - play_sound(SFX_00F9, CHANNEL_10) - play_sound(SFX_00FB, CHANNEL_10) - - wait_until(690, LABEL_6E) - speak(CHR_BOND, L_LEE_041, MP3_0488, CHANNEL_10, COLOR_04_ORANGE) // "Hmmmm?" - - wait_until(850, LABEL_6F) - speak(CHR_BOND, L_LEE_042, MP3_0489, CHANNEL_10, COLOR_04_ORANGE) // "I don't... I don't believe it!" - - wait_until(963, LABEL_70) - play_sound(SFX_FOOTSTEP_80D4, CHANNEL_10) - - wait_until(972, LABEL_71) - play_sound(SFX_FOOTSTEP_80D8, CHANNEL_10) - - wait_until(988, LABEL_61) - play_sound(SFX_FOOTSTEP_80DB, CHANNEL_10) - - wait_until(1000, LABEL_72) - speak(CHR_BOND, L_LEE_043, MP3_048A, CHANNEL_10, COLOR_09_BLUE) // "Elvis? What is it?" - - wait_until(1030, LABEL_73) - play_sound(SFX_FOOTSTEP_80DA, CHANNEL_10) - - wait_until(1045, LABEL_74) - play_sound(SFX_FOOTSTEP_80D8, CHANNEL_10) - - wait_until(1065, LABEL_75) - play_sound(SFX_FOOTSTEP_80D9, CHANNEL_10) - - wait_until(1085, LABEL_76) - play_sound(SFX_FOOTSTEP_80DA, CHANNEL_10) - - wait_until(1200, LABEL_77) - speak(CHR_BOND, L_LEE_044, MP3_048B, CHANNEL_10, COLOR_09_BLUE) // "Where are you going?" - - wait_until(1237, LABEL_78) - play_sound(SFX_FOOTSTEP_80DB, CHANNEL_10) - - wait_until(1260, LABEL_79) - play_sound(SFX_FOOTSTEP_80D8, CHANNEL_10) - - wait_until(1280, LABEL_7A) - play_sound(SFX_FOOTSTEP_80D9, CHANNEL_10) - - wait_until(1300, LABEL_7B) - play_sound(SFX_FOOTSTEP_80DA, CHANNEL_10) - - wait_until(1301, LABEL_62) - speak(CHR_BOND, L_LEE_045, MP3_048C, CHANNEL_10, COLOR_04_ORANGE) // "We have to get down to the surface! Follow me!" - open_door(OBJ_HANGARDOOR1) - open_door(OBJ_HANGARDOOR2) - open_door(OBJ_HANGARDOOR3) - open_door(OBJ_HANGARDOOR4) - set_object_flag(OBJ_HANGARDOOR1, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_HANGARDOOR2, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_HANGARDOOR3, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(OBJ_HANGARDOOR4, OBJFLAG_DOOR_KEEPOPEN) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(LABEL_B0) - - label(0x2c) - if_controller_button_pressed(/*goto*/ LABEL_B0) - label(0x2c) - endloop(0x08) - - label(LABEL_B0) - mute_channel(CHANNEL_10) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_skedar(function) \ - set_accuracy(VERSION >= VERSION_NTSC_1_0 ? 20 : 40) \ - set_reaction_speed(75) \ - set_chr_maxdamage(CHR_SELF, 10) \ - add_health_or_armor(190) \ - set_recovery_speed(0) \ - set_shield(0) \ - set_ailist(CHR_SELF, function) - -u8 func041e_init_bridge1and2[] = { - init_skedar(AILIST_BRIDGE_SKEDAR) - endlist -}; - -u8 func0425_init_shy_skedar[] = { - init_skedar(GAILIST_IDLE) - endlist -}; - -u8 func0420_init_bridge3[] = { - init_skedar(AILIST_BRIDGE_SKEDAR) - endlist -}; - -/** - * Assigned to the 3 Skedar on the bridge. - */ -u8 func0421_bridge_skedar[] = { - set_shotlist(AILIST_BRIDGE_SKEDAR) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x2c) - - // Dying - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x53) - if_timer_gt(15, /*goto*/ 0x06) - endloop(0x53) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x2c) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x08) - - // Injured - label(0x06) - set_view_distance(100) - - // Not injured - label(0x08) - set_self_chrflag(CHRCFLAG_00000040) - label(LABEL_C6) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - set_target_chr(CHR_BOND) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ LABEL_C7) - label(0x06) - kneel - - beginloop(LABEL_C7) - chr_toggle_p1p2(CHR_SELF) - label(0x2c) - set_target_chr(CHR_P1P2) - if_target_outside_my_yvisang(/*goto*/ 0x06) - if_target_in_sight(/*goto*/ LABEL_C8) - label(0x06) - if_saw_injury(0x00, /*goto*/ LABEL_C8) - if_near_miss(/*goto*/ LABEL_C9) - label(0x2c) - set_target_chr(CHR_P1P2) - reloop(LABEL_C7) - - label(0x06) - if_target_outside_my_yvisang(/*goto*/ 0x2c) - if_target_in_sight(/*goto*/ LABEL_C8) - label(0x2c) - set_target_chr(CHR_BOND) - endloop(LABEL_C7) - - label(LABEL_C8) - set_view_distance(100) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2c) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - label(0x2c) - goto_next(LABEL_CA) - - // Unreachable - try_attack_amount(90, 100) - - // Reachable from below - beginloop(LABEL_CB) - if_chr_stopped(/*goto*/ LABEL_CC) - endloop(LABEL_CB) - - label(LABEL_CC) - restart_timer - stop_chr - - beginloop(LABEL_B4) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(LABEL_B4) - - label(0x2c) - label(0x06) - goto_first(LABEL_C6) - - // Near miss - label(LABEL_C9) - set_view_distance(100) - restart_timer - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_CD) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - - label(LABEL_CD) - call_rng - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_outside_my_yvisang(/*goto*/ 0x06) - if_target_in_sight(/*goto*/ LABEL_CE) - label(0x06) - if_timer_gt(60, /*goto*/ LABEL_CF) - if_rand_lt(4, /*goto*/ LABEL_CF) - goto_first(LABEL_CD) - - label(LABEL_CF) - if_can_see_target(/*goto*/ LABEL_CE) - goto_first(LABEL_C6) - - label(LABEL_CE) - goto_first(LABEL_C8) - - label(LABEL_D0) - restart_timer - - beginloop(LABEL_D1) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ LABEL_CE) - if_timer_gt(300, /*goto*/ 0x06) - endloop(LABEL_D1) - - label(0x06) - goto_first(LABEL_C6) - - label(LABEL_CE) - goto_first(LABEL_C8) - - label(LABEL_CA) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ LABEL_60) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ LABEL_B1) - label(LABEL_B1) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) - goto_next(0x2c) - - label(LABEL_60) - try_attack_amount(40, 60) - label(0x06) - goto_first(LABEL_CB) - - label(0x2c) - goto_first(LABEL_CC) - - endlist -}; - -u8 func1013_msg_gottogetshieldsdown[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_SAID_GETSHIELDSDOWN, TRUE, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - restart_timer - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - speak(CHR_BOND, L_LEE_027, MP3_03DC, CHANNEL_6, COLOR_09_BLUE) // "I've got to get those shields down to let Elvis in..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_msg_hangarbaydoors[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) - restart_timer - - beginloop(0x04) - if_objective_complete(0, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - restart_timer - - beginloop(0x08) - if_timer_gt(240, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - speak(CHR_BOND, L_LEE_028, MP3_03DD, CHANNEL_6, COLOR_09_BLUE) // "Now only the hangar bay doors are in the way." - - label(0x09) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_msg_starmaps[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x003e, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - speak(CHR_P1P2, L_LEE_029, MP3_03DE, CHANNEL_6, COLOR_09_BLUE) // "This machine contains the Skedar star maps." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_msg_ifwecontrolthebridge[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x006f, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - set_stage_flag(STAGEFLAG_ENTERED_BRIDGELIFT) - unset_chr_chrflag(CHR_BRIDGE1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BRIDGE2, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_BRIDGE3, CHRCFLAG_INVINCIBLE) - speak(CHR_P1P2, L_LEE_030, MP3_03DF, CHANNEL_6, COLOR_09_BLUE) // "If we control the bridge, then the ship is ours." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0422_cass[] = { - set_shotlist(GAILIST_IDLE) - set_self_chrflag(CHRCFLAG_00040000) - run_to_pad(PAD_LEE_01DD) - - beginloop(0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 300, PAD_LEE_01DD, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - stop_chr - set_stage_flag(STAGEFLAG_CASS_AT_PAD) - - // @bug: Looks like there's a missing goto_first 0x09 here. - // With that statement, it would loop waiting for the Skedar to be ready. - // As it stands, the check is pointless and Cass will do the screams and die - // even if the Skedar is not ready. - label(0x09) - yield - if_stage_flag_eq(STAGEFLAG_SHY_SKEDAR_READY, TRUE, /*goto*/ 0x2c) - - label(0x2c) - play_sound(MP3_0486, CHANNEL_10) - set_stage_flag(STAGEFLAG_CASS_SCREAMING) - - beginloop(LABEL_C2) - damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - endloop(LABEL_C2) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0423_shy_skedar[] = { - set_shotlist(AILIST_INIT_SKEDAR) - set_self_chrflag(CHRCFLAG_00000040) - set_self_chrflag(CHRCFLAG_00040000) - set_target_chr(CHR_CASS) - goto_next(0x2c) - - if_self_flag_bankx_eq(CHRFLAG0_00008000, TRUE, BANK_0, /*goto*/ 0x03) - label(LABEL_C2) - chr_move_to_pad(CHR_SELF, PAD_LEE_00E0, 0x01, /*goto*/ 0x2c) - - // Warp failed or not available - so run - label(0x03) - set_target_chr(CHR_CASS) - restart_timer - try_run_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_LEE_00DA, /*goto*/ 0x2d) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x08) - - // Stopped, or running for 1 second - label(0x06) - set_target_chr(CHR_CASS) - goto_first(0x03) - - // Warped to pad 0x00e0 successfully - run rest of the way - label(0x2c) - run_to_pad(PAD_LEE_00DA) - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x2d) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_LEE_00DA, /*goto*/ 0x2d) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x09) - - // At pad - // The first time through this function, STAGEFLAG_SHY_SKEDAR_READY will - // be set. The second time through this function, stageflag 02000000 will - // be set. - label(0x2d) - if_stage_flag_eq(STAGEFLAG_SHY_SKEDAR_READY, TRUE, /*goto*/ 0x2c) - set_stage_flag(STAGEFLAG_SHY_SKEDAR_READY) - goto_next(0x2d) - - label(0x2c) - set_stage_flag(STAGEFLAG_02000000) - - // Set target chr based on who it can see - label(0x2d) - stop_chr - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2c) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2c) - set_target_chr(CHR_ANTI) - if_can_see_target(/*goto*/ 0x2c) - - label(0x2c) - stop_chr - set_shotlist(AILIST_INIT_SKEDAR) - set_returnlist(CHR_SELF, AILIST_INIT_SKEDAR) - set_ailist(CHR_SELF, AILIST_INIT_SKEDAR) - endlist -}; - -u8 func0423_shy_skedar_wait[] = { - set_shotlist(AILIST_SHY_SKEDAR) - set_target_chr(CHR_CASS) - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) - restart_timer - - beginloop(0x08) - if_timer_gt(180, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - set_ailist(CHR_SELF, AILIST_SHY_SKEDAR) - endlist -}; - -u8 func141b_setup_lifts[] = { - activate_lift(1, 0x25) - activate_lift(2, 0x26) - activate_lift(4, 0x28) - activate_lift(5, 0x29) - activate_lift(6, 0x2a) - activate_lift(7, 0x2b) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * In PA room where the hangar door console is. Once console is activated, or - * when hangar alarm is activated, the Skedar behind the door is alerted. - */ -u8 func1017_pa_skedar_alertness[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_HANGAR_DOORS_OPEN, TRUE, /*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_HANGAR_ALARM_ACTIVATED, TRUE, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - restart_timer - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - set_ailist(0x02, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_update_elvis_target_chr[] = { - beginloop(0x04) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x09) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x08) - goto_next(0x09) - - // Unreachable - reloop(0x04) - - // Jo dead - label(0x08) - set_chr_target_chr(CHR_ELVIS, CHR_COOP) - reloop(0x04) - - // Velvet dead or both alive - label(0x09) - set_chr_target_chr(CHR_ELVIS, CHR_BOND) - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Note Elvis is still hidden, hence why he doesn't appear until shields are - * down. - */ -u8 func1018_place_elvis_in_hangar[] = { - label(0x04) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // A and SA - beginloop(0x03) - chr_move_to_pad(CHR_ELVIS, PAD_LEE_0103, 0x01, /*goto*/ 0x2c) - endloop(0x03) - - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_hangar_shuttle[] = { - yield - enable_object(OBJ_HANGAR_SHUTTLE) - set_object_flag3(OBJ_HANGAR_SHUTTLE, OBJFLAG3_00000010) - object_set_modelpart_visible(OBJ_HANGAR_SHUTTLE, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - - label(0x09) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_BRIDGE_CAPTURED, TRUE, /*goto*/ 0x06) - if_objective_complete(4, /*goto*/ 0x06) -#if VERSION >= VERSION_NTSC_1_0 - object_do_animation(ANIM_045C, OBJ_HANGAR_SHUTTLE, 0x08, 0xffff) -#else - object_do_animation(ANIM_045C, OBJ_HANGAR_SHUTTLE, 0x01, 0xffff) -#endif - endloop(0x08) - - label(0x2c) - goto_first(0x09) - - label(0x06) - disable_object(OBJ_HANGAR_SHUTTLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_kill_maian[] = { - yield - damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_MAIAN3, WEAPON_SUPERDRAGON) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_lift_door_sounds[] = { - beginloop(LABEL_C2) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x2f, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x30, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x31, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x32, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x33, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x34, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x35, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x36, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x37, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x38, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x39, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x3a, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x2c) - endloop(LABEL_C2) - - label(0x2c) - play_sound(SFX_81A6, -1) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - goto_first(LABEL_C2) - - endlist -}; - -u8 func101d_unlock_doors[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - - // PA - unlock door to console on other side of hangar - unlock_door(0x35, 0x80) - unlock_door(0x36, 0x80) - - // SA and PA - unlock door to engine room - label(0x06) - unlock_door(0x3f, 0x80) - unlock_door(0x40, 0x80) - - // All difficulties - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_bridge_music[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_BOND, 0x00, 0x006e, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - play_x_track(XREASON_DEFAULT, 10, 60) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_elvis_run_from_engineroom[] = { - set_shotlist(AILIST_ELVIS_RUN_FROM_ENGINEROOM) - run_to_pad(PAD_LEE_005C) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x2c) - if_stage_flag_eq(STAGEFLAG_ENGINES_DESTROYED, TRUE, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) - endlist -}; - -u8 func101f_enable_bridge_skedar[] = { - lock_door(0x41, 0x80) - lock_door(0x42, 0x80) - set_object_flag2(0x41, OBJFLAG2_LOCKEDBACK) - set_object_flag2(0x42, OBJFLAG2_LOCKEDFRONT) - set_object_flag2(0x41, OBJFLAG2_AICANNOTUSE) - set_object_flag2(0x42, OBJFLAG2_AICANNOTUSE) - - // Wait until first 4 objectives complete - beginloop(0x04) - if_objective_complete(0, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) - if_objective_complete(1, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_objective_complete(2, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2c) - if_objective_complete(3, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - unlock_door(0x41, 0x80) - unlock_door(0x42, 0x80) - unset_object_flag2(0x41, OBJFLAG2_LOCKEDBACK) - unset_object_flag2(0x42, OBJFLAG2_LOCKEDFRONT) - unset_object_flag2(0x41, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x42, OBJFLAG2_AICANNOTUSE) - enable_chr(0x21) - enable_chr(0x22) - enable_chr(CHR_BRIDGE1) - enable_chr(CHR_BRIDGE2) - enable_chr(CHR_BRIDGE3) - enable_chr(CHR_BRIDGESPAWNER1) - enable_chr(CHR_BRIDGESPAWNER2) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_engine_hum_noise[] = { - yield - assign_sound(SFX_81A5, CHANNEL_0) - play_sound_from_object(CHANNEL_0, 0x1b, 1, 2000, 4000) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1021_check_ammo_wasted[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x0d) - chr_toggle_p1p2(CHR_SELF) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_MAULER, /*goto*/ LABEL_65) - endloop(0x04) - - // Mauler equipped - beginloop(LABEL_65) - if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x0d) - if_ammo_quantity_lt(CHR_P1P2, AMMOTYPE_PISTOL, 1, /*goto*/ 0x2c) - endloop(LABEL_65) - - // Ammo wasted - label(0x2c) - set_stage_flag(STAGEFLAG_AMMO_WASTED) - show_hudmsg(CHR_BOND, L_LEE_049) // "Ammo depleted - consoles can't be destroyed." - - beginloop(LABEL_66) - if_stage_flag_eq(STAGEFLAG_SHIELDS_DISABLED, TRUE, /*goto*/ 0x2c) - endloop(LABEL_66) - - label(0x2c) - unset_stage_flag(STAGEFLAG_AMMO_WASTED) - - // Shields disabled - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_setup_rtracker[] = { - // @bug: The Slayer is not R-tracked - yield - set_object_flag3(OBJ_MAULER1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_MAULER2, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040b_init_cass[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1024_set_bridge_skedar_invincible[] = { - set_chr_chrflag(CHR_BRIDGE1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BRIDGE2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BRIDGE3, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_BRIDGE1, CHRCFLAG_UNEXPLODABLE) - set_chr_chrflag(CHR_BRIDGE2, CHRCFLAG_UNEXPLODABLE) - set_chr_chrflag(CHR_BRIDGE3, CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Wait 10 seconds then set a flag on Joanna which enables buddy to warp to her. - */ -u8 unregistered_function1[] = { - restart_timer - - beginloop(0x04) - if_timer_gt(600, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1423_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1025_toggle_chrs[] = { - yield - disable_chr(0x0b) - disable_chr(0x0c) - disable_chr(CHR_SUSPENDEDANIM1) - disable_chr(CHR_SUSPENDEDANIM2) - disable_chr(CHR_SUSPENDEDANIM3) - disable_chr(CHR_SUSPENDEDANIM4) - disable_chr(0x11) - disable_chr(0x12) - disable_chr(0x13) - disable_chr(0x14) - disable_chr(0x15) - disable_chr(0x16) - disable_chr(0x17) - disable_chr(0x18) - disable_chr(0x19) - disable_chr(0x1a) - disable_chr(0x1b) - disable_chr(0x1c) - disable_chr(0x1d) - disable_chr(0x1e) - disable_chr(0x1f) - disable_chr(0x20) - disable_chr(0x27) - disable_chr(0x28) - disable_chr(0x29) - disable_chr(0x2a) - disable_chr(0x2b) - disable_chr(0x2c) - disable_chr(0x21) - disable_chr(0x22) - disable_chr(CHR_BRIDGE1) - disable_chr(CHR_BRIDGE2) - disable_chr(CHR_BRIDGE3) - disable_chr(CHR_BRIDGESPAWNER1) - disable_chr(CHR_BRIDGESPAWNER2) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 450, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - endloop(0x08) - - label(0x06) - enable_chr(0x0b) - yield - enable_chr(0x0c) - yield - enable_chr(CHR_SUSPENDEDANIM1) - yield - enable_chr(CHR_SUSPENDEDANIM2) - yield - enable_chr(CHR_SUSPENDEDANIM3) - yield - enable_chr(CHR_SUSPENDEDANIM4) - yield - enable_chr(0x11) - yield - enable_chr(0x12) - yield - enable_chr(0x13) - yield - enable_chr(0x14) - yield - enable_chr(0x15) - yield - enable_chr(0x16) - yield - enable_chr(0x17) - yield - enable_chr(0x18) - yield - enable_chr(0x19) - yield - enable_chr(0x1a) - yield - enable_chr(0x1b) - yield - enable_chr(0x1c) - yield - enable_chr(0x1d) - yield - enable_chr(0x1e) - yield - enable_chr(0x1f) - yield - enable_chr(0x20) - yield - enable_chr(0x27) - yield - enable_chr(0x28) - yield - enable_chr(0x29) - yield - enable_chr(0x2a) - yield - enable_chr(0x2b) - yield - enable_chr(0x2c) - yield - set_ailist(CHR_MAIAN1, AILIST_CLOAK_AND_REMOVE) - set_ailist(CHR_MAIAN2, AILIST_CLOAK_AND_REMOVE) - set_ailist(0x07, AILIST_CLOAK_AND_REMOVE) - set_ailist(0x08, AILIST_CLOAK_AND_REMOVE) - set_ailist(0x09, AILIST_CLOAK_AND_REMOVE) - set_ailist(0x0a, AILIST_CLOAK_AND_REMOVE) - rebuild_teams - rebuild_squadrons - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 550, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - endloop(0x09) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041f_cloak_and_remove[] = { - set_shotlist(AILIST_CLOAK_AND_REMOVE) - set_chr_cloaked(CHR_SELF, TRUE, FALSE) - restart_timer - - beginloop(0x04) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x04) - - label(0x2c) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1026_hide_necklace[] = { - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // A and SA - label(0x2c) - disable_object(OBJ_NECKLACE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#if VERSION >= VERSION_NTSC_1_0 -u8 func0427_set_cloaked[] = { - stop_chr - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0428_set_uncloaked[] = { - stop_chr - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) - endlist -}; -#endif - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_hangar_shuttle, 0x1002 }, - { func1003_intro, 0x1003 }, - { func1004_check_hangar_doors_opened, 0x1004 }, - { func1005_check_elvis_dead, 0x1005 }, - { func1006_wake_slayer_skedar, 0x1006 }, - { func1007_check_entered_slayer_area, 0x1007 }, - { func1008_hangar_lifts, 0x1008 }, - { func1009_keep_door_open_in_intro, 0x1009 }, - { func100a_check_hangar_kills_done, 0x100a }, - { func100b_msg_getshieldsdown, 0x100b }, - { func100c_engineroom, 0x100c }, - { func100d_prebridgelift, 0x100d }, - { func100e_bridgelift, 0x100e }, - { func100f_bridge_entry, 0x100f }, - { func1010_check_bridge_captured, 0x1010 }, - { func1011_check_end_level, 0x1011 }, - { func1012_update_elvis_target_chr, 0x1012 }, - { func1013_msg_gottogetshieldsdown, 0x1013 }, - { func1014_msg_hangarbaydoors, 0x1014 }, - { func1015_msg_starmaps, 0x1015 }, - { func1016_msg_ifwecontrolthebridge, 0x1016 }, - { func1017_pa_skedar_alertness, 0x1017 }, - { func1018_place_elvis_in_hangar, 0x1018 }, - { func1002_hangar_shuttle, 0x1019 }, - { func1019_check_shields_lowered, 0x1019 }, - { func101a_kill_maian, 0x101a }, - { func141b_setup_lifts, 0x141b }, - { func101c_lift_door_sounds, 0x101c }, - { func101d_unlock_doors, 0x101d }, - { func101e_bridge_music, 0x101e }, - { func101f_enable_bridge_skedar, 0x101f }, - { func1020_engine_hum_noise, 0x1020 }, - { func1021_check_ammo_wasted, 0x1021 }, - { func1022_setup_rtracker, 0x1022 }, - { func1423_setup_environment, 0x1423 }, - { func1024_set_bridge_skedar_invincible, 0x1024 }, - { func1025_toggle_chrs, 0x1025 }, - { func1026_hide_necklace, 0x1026 }, - { func1003_intro, 0x0c00 }, - { func0c01_outro, 0x0c01 }, - { func0c01_outro, 0x0426 }, - { func040f_init_skedar, 0x040f }, - { func0410_wake_suspendedanim_skedar, 0x0410 }, - { func040d_elvis_wait_for_hangar_entry, 0x040d }, - { func040e_elvis_give_ar34, 0x040e }, - { func0409_elvis_follow, 0x0409 }, - { func040a_elvis_go_to_hangar_lift, 0x040a }, - { func040b_init_cass, 0x040b }, - { func040c_elvis_run_from_engineroom, 0x040c }, - { func0401_start_path00, 0x0401 }, - { func0402_start_path01, 0x0402 }, - { func0403_start_path02, 0x0403 }, - { func0404_start_path03, 0x0404 }, - { func0405_start_path04, 0x0405 }, - { func0406_start_path05, 0x0406 }, - { func0407_init_knifeable_skedar, 0x0407 }, - { func0408_knifeable_skedar, 0x0408 }, - { func0412_hangarspawner, 0x0412 }, - { func0413_init_hangarclone, 0x0413 }, - { func0414_hangarclone, 0x0414 }, - { func0415_bridgespawner, 0x0415 }, - { func0416_init_bridgeclone, 0x0416 }, - { func0417_init_spawner_reveal, 0x0417 }, - { func0418_init_hangar_maian, 0x0418 }, - { func0419_hangar_maian, 0x0419 }, - { func0415_bridgespawner, 0x0415 }, - { func0416_init_bridgeclone, 0x0416 }, - { func0417_init_spawner_reveal, 0x0417 }, - { func041a_bridgeclone, 0x041a }, - { func041b_elvis_at_bridge, 0x041b }, - { func041c_elvis_outside_prebridgelift, 0x041c }, - { func041d_init_elvis_outside_prebridgelift, 0x041d }, - { func041f_cloak_and_remove, 0x041f }, - { func041e_init_bridge1and2, 0x041e }, - { func0420_init_bridge3, 0x0420 }, - { func0421_bridge_skedar, 0x0421 }, - { func0422_cass, 0x0422 }, - { func0423_shy_skedar, 0x0423 }, - { func0423_shy_skedar_wait, 0x0424 }, - { func0425_init_shy_skedar, 0x0425 }, -#if VERSION >= VERSION_NTSC_1_0 - { func0427_set_cloaked, 0x0427 }, - { func0428_set_uncloaked, 0x0428 }, -#endif - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, 0 }, diff --git a/src/setups/setuplen.c b/src/setups/setuplen.c index f5c9423fb..6480bbd6c 100644 --- a/src/setups/setuplen.c +++ b/src/setups/setuplen.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setuplip.c b/src/setups/setuplip.c index 904813c13..04e9f3b60 100644 --- a/src/setups/setuplip.c +++ b/src/setups/setuplip.c @@ -333,7 +333,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -1077,3945 +1077,6 @@ s32 path14[] = { -1, }; -u8 func1400_give_datauplinks[] = { - yield - set_chr_team(CHR_ANTI, TEAM_22) - give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) - give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1007_check_disguise_collected[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_LABCOAT1, /*goto*/ 0x06) - if_chr_has_object(CHR_P1P2, OBJ_LABCOAT2, /*goto*/ 0x06) - if_chr_has_object(CHR_P1P2, OBJ_LABCOAT3, /*goto*/ 0x06) - if_chr_has_object(CHR_P1P2, OBJ_LABCOAT4, /*goto*/ 0x06) - if_chr_has_object(CHR_P1P2, OBJ_LABCOAT5, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - - beginloop(0x08) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) - endloop(0x08) - - label(LABEL_2D) - set_stage_flag(STAGEFLAG_USED_DISGUISE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1026_check_records_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(0x04, /*goto*/ 0x06) - show_hudmsg(CHR_BOND, L_LIP_014) // "Research records destroyed." - set_stage_flag(STAGEFLAG_RECORDS_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1003_uplink_doors[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x02, /*goto*/ LABEL_2D) - reloop(0x04) - - label(LABEL_2D) - if_stage_flag_eq(STAGEFLAG_DOOR_VIRUS_DOWNLOADED, FALSE, /*goto*/ 0x06) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_P1P2, L_LIP_048) // "Virus has already been downloaded." - reloop(0x04) - - label(0x06) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_P1P2, L_LIP_020) // "Access to door control systems denied." - reloop(0x04) - - label(LABEL_2D) - show_hudmsg(CHR_P1P2, L_LIP_030) // "Data Uplink connected." - restart_timer - - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0427, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - goto_next(0x09) - - label(LABEL_2D) - endloop(0x08) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LIP_049) // "Initiating virus download." - restart_timer - assign_sound(SFX_01BF, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x02, TRUE) - - beginloop(0x11) - if_timer_gt(400, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0427, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - goto_next(0x09) - - label(LABEL_2D) - endloop(0x11) - - label(0x06) - mute_channel(CHANNEL_5) - if_object_in_good_condition(0x02, /*goto*/ LABEL_2D) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - assign_sound(SFX_01C1, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x02, TRUE) - show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." - yield - set_stage_flag(STAGEFLAG_DOOR_VIRUS_DOWNLOADED) - reloop(0x04) - - label(0x09) - show_hudmsg(CHR_P1P2, L_LIP_031) // "Data Uplink connection broken." - mute_channel(CHANNEL_5) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, 0x02, TRUE) - restart_timer - - beginloop(0x13) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x13) - - label(0x06) - mute_channel(CHANNEL_6) - endloop(0x04) - - endlist -}; - -u8 func1004_uplink_lights[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x01, /*goto*/ LABEL_2D) - reloop(0x04) - - label(LABEL_2D) - if_stage_flag_eq(STAGEFLAG_LIGHT_VIRUS_DONE, FALSE, /*goto*/ 0x06) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_P1P2, L_LIP_048) // "Virus has already been downloaded." - reloop(0x04) - - label(0x06) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_P1P2, L_LIP_021) // "Access to light control systems denied." - reloop(0x04) - - label(LABEL_2D) - show_hudmsg(CHR_P1P2, L_LIP_030) // "Data Uplink connected." - restart_timer - - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0429, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - goto_next(0x09) - - label(LABEL_2D) - endloop(0x08) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LIP_049) // "Initiating virus download." - restart_timer - assign_sound(SFX_01BF, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x01, TRUE) - - beginloop(0x11) - if_timer_gt(400, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0429, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - goto_next(0x09) - - label(LABEL_2D) - endloop(0x11) - - label(0x06) - mute_channel(CHANNEL_5) - if_object_in_good_condition(0x01, /*goto*/ LABEL_2D) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - assign_sound(SFX_01C1, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x01, TRUE) - show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." - yield - show_hudmsg(CHR_P1P2, L_LIP_088) // "Lighting systems overloaded." - configure_environment(0x00c4, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c3, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c8, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c9, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00ca, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c7, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c2, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c1, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c0, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00bf, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c6, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00c5, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - configure_environment(0x00a6, AIENVCMD_ROOM_SETFAULTYLIGHTS, 110) - set_stage_flag(STAGEFLAG_LIGHT_VIRUS_DONE) - reloop(0x04) - - label(0x09) - show_hudmsg(CHR_P1P2, L_LIP_031) // "Data Uplink connection broken." - mute_channel(CHANNEL_5) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, 0x01, TRUE) - restart_timer - - beginloop(0x13) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x13) - - label(0x06) - mute_channel(CHANNEL_6) - endloop(0x04) - - endlist -}; - -u8 func1005_uplink_autoguns[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x03, /*goto*/ LABEL_2D) - reloop(0x04) - - label(LABEL_2D) - if_stage_flag_eq(STAGEFLAG_LIGHT_VIRUS_DONE, FALSE, /*goto*/ 0x06) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_P1P2, L_LIP_048) // "Virus has already been downloaded." - reloop(0x04) - - label(0x06) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - play_sound(SFX_8116, -1) - show_hudmsg(CHR_P1P2, L_LIP_022) // "Access to security control systems denied." - reloop(0x04) - - label(LABEL_2D) - show_hudmsg(CHR_P1P2, L_LIP_030) // "Data Uplink connected." - restart_timer - - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0428, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - goto_next(0x09) - - label(LABEL_2D) - endloop(0x08) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LIP_049) // "Initiating virus download." - restart_timer - assign_sound(SFX_01BF, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x03, TRUE) - - beginloop(0x11) - if_timer_gt(400, /*goto*/ 0x06) - if_chr_distance_to_pad_gt(CHR_P1P2, 300, PAD_LIP_0428, /*goto*/ 0x09) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ LABEL_2D) - goto_next(0x09) - - label(LABEL_2D) - endloop(0x11) - - label(0x06) - mute_channel(CHANNEL_5) - if_object_in_good_condition(0x03, /*goto*/ LABEL_2D) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(LABEL_2D) - assign_sound(SFX_01C1, CHANNEL_5) - control_sound_from_object(CHANNEL_5, 0x00, TRUE) - show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." - yield - show_hudmsg(CHR_P1P2, L_LIP_105) // "Automatic Defenses Disabled." - set_stage_flag(STAGEFLAG_AUTOGUN_VIRUS_DONE) - reloop(0x04) - - label(0x09) - show_hudmsg(CHR_P1P2, L_LIP_031) // "Data Uplink connection broken." - mute_channel(CHANNEL_5) - assign_sound(SFX_01C0, CHANNEL_6) - control_sound_from_object(CHANNEL_6, 0x03, TRUE) - restart_timer - - beginloop(0x13) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x13) - - label(0x06) - mute_channel(CHANNEL_6) - reloop(0x04) - - show_hudmsg(CHR_P1P2, L_LIP_023) // "Virus downloaded to console." - set_stage_flag(STAGEFLAG_AUTOGUN_VIRUS_DONE) - endloop(0x04) - - endlist -}; - -u8 func1006_check_lab_accessed[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x008f, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LIP_029) // "Laboratory accessed successfully." - set_stage_flag(STAGEFLAG_ENTERED_LAB) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_path(accuracy, health, recovery, pathid) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(accuracy) \ - set_reaction_speed(35) \ - set_chr_maxdamage(CHR_SELF, health) \ - add_health_or_armor(0) \ - set_recovery_speed(recovery) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - -u8 func0401_start_path00[] = { - init_path(8, 50, 35, 0x00) - endlist -}; - -u8 func0402_start_path01[] = { - init_path(8, 50, 35, 0x01) - endlist -}; - -u8 func0403_start_path02[] = { - init_path(8, 50, 35, 0x02) - endlist -}; - -u8 func0404_start_path03[] = { - init_path(8, 50, 35, 0x03) - endlist -}; - -u8 func0405_start_path04[] = { - init_path(8, 50, 35, 0x04) - endlist -}; - -u8 func0406_start_path05[] = { - init_path(8, 50, 35, 0x05) - endlist -}; - -u8 func0407_start_path06[] = { - init_path(10, 80, 0, 0x06) - endlist -}; - -u8 func0408_start_path07[] = { - init_path(10, 80, 0, 0x07) - endlist -}; - -u8 func0409_start_path08[] = { - init_path(10, 80, 0, 0x08) - endlist -}; - -u8 func040a_start_path09[] = { - init_path(10, 80, 0, 0x09) - endlist -}; - -u8 func040b_start_path10[] = { - init_path(10, 80, 0, 0x0a) - endlist -}; - -u8 func040c_start_path11[] = { - init_path(10, 80, 0, 0x0b) - endlist -}; - -u8 func040d_start_path12[] = { - init_path(10, 80, 0, 0x0c) - endlist -}; - -u8 func040e_start_path13[] = { - init_path(10, 80, 0, 0x0d) - endlist -}; - -u8 func040f_start_path14[] = { - init_path(10, 80, 0, 0x0e) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_LABTECH_RECORDS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH_LIGHTS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH_DOORS1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH_SHOWERS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH_HARRYSMATE, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH_KEYCARDGUY, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_BIOTECH1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_BIOTECH2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_LABTECH_DOORS2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_MECHANIC, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func0411_labtech_showers_agent[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_WALL, /*goto*/ LABEL_2D) - goto_next(LABEL_64) - - label(LABEL_2D) - endloop(0x04) - - beginloop(LABEL_64) - damage_chr(CHR_SELF, WEAPON_SUPERDRAGON) - if_chr_dead(CHR_SELF, /*goto*/ LABEL_2D) - endloop(LABEL_64) - - label(LABEL_2D) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_init_labtech_showers[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_2D) - goto_next(0x06) - - // Agent - label(LABEL_2D) - run_to_pad(PAD_LIP_03AB) - - beginloop(0x08) - if_chr_stopped(/*goto*/ LABEL_2E) - endloop(0x08) - - label(LABEL_2E) - set_ailist(CHR_SELF, AILIST_LABTECH_AGENT) - - // SA and PA - label(0x06) - set_ailist(CHR_SELF, AILIST_LABTECH_SA_PA) - endlist -}; - -u8 func0410_labtech_showers_sa_pa[] = { - set_shotlist(AILIST_LABTECH_SA_PA) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - set_shotlist(GAILIST_IDLE) - set_stage_flag(STAGEFLAG_LABTECH_DEAD) - restart_timer - - beginloop(LABEL_54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - // Injured - label(0x06) - restart_timer - - beginloop(LABEL_55) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_58) - endloop(LABEL_55) - - // Not injured, or recovered - label(LABEL_2D) - stop_chr - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ LABEL_2D) - if_distance_to_target_lt(500, /*goto*/ 0x03) - endloop(0x04) - - // Detected Jo - label(LABEL_2D) - label(0x03) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_56) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - speak(CHR_TARGET, L_LIP_037, MP3_032D, CHANNEL_4, COLOR_08_RED) // "Who are you?" - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ LABEL_64) - - // Wait until seeing Jo with a gun, or Jo has clothes - beginloop(LABEL_64) - if_timer_lt(120, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - if_chr_in_view(/*goto*/ LABEL_53) - label(LABEL_2D) - if_chr_has_object(CHR_TARGET, OBJ_LABCOAT1, /*goto*/ 0x0d) - if_chr_has_object(CHR_TARGET, OBJ_LABCOAT2, /*goto*/ 0x0d) - if_chr_has_object(CHR_TARGET, OBJ_LABCOAT3, /*goto*/ 0x0d) - if_chr_has_object(CHR_TARGET, OBJ_LABCOAT4, /*goto*/ 0x0d) - if_chr_has_object(CHR_TARGET, OBJ_LABCOAT5, /*goto*/ 0x0d) - endloop(LABEL_64) - - // Jo has clothes - label(0x0d) - speak(CHR_TARGET, L_LIP_038, MP3_032E, CHANNEL_4, COLOR_08_RED) // "Hey - you've got my clothes." - restart_timer - - beginloop(0x0e) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(LABEL_53) - - label(LABEL_2D) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - speak(CHR_TARGET, L_LIP_043, MP3_0332, CHANNEL_4, COLOR_08_RED) // "Give me back my clothes - or else!" - restart_timer - - beginloop(0x0f) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(LABEL_53) - - label(LABEL_2D) - if_timer_gt(200, /*goto*/ LABEL_56) - endloop(0x0f) - - label(LABEL_56) - if_chr_in_room(CHR_P1P2, 0x00, 0x00aa, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00a9, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b4, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b5, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b6, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00be, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b7, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b8, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b3, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x009b, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ae, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00af, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b0, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b1, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b2, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00bc, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ab, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00bb, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ba, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b9, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ac, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ad, /*goto*/ LABEL_2D) - goto_next(LABEL_58) - - // Jo is in one of many rooms - label(LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(LABEL_53) - - // Jo is in one of many rooms with nothing equipped - attack her - label(LABEL_2D) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_2D) - speak(CHR_TARGET, L_LIP_044, MP3_0333, CHANNEL_4, COLOR_08_RED) // "Right - you've asked for it!" - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - goto_next(0x06) - - label(LABEL_2D) - call_rng - if_rand_gt(25, /*goto*/ 0x06) - speak(CHR_TARGET, L_LIP_045, MP3_0334, CHANNEL_4, COLOR_08_RED) // "Give me my clothes." - label(0x06) - try_run_to_target(/*goto*/ LABEL_6F) - restart_timer - - beginloop(LABEL_6F) - if_distance_to_target_lt(400, /*goto*/ LABEL_2D) - if_timer_gt(600, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(LABEL_6F) - - label(LABEL_2D) - set_returnlist(CHR_SELF, AILIST_LABTECH_SA_PA) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - - // Chasing Jo for over 10 seconds - do room check again - label(0x06) - goto_first(LABEL_56) - - // Jo in an unknown room - label(LABEL_58) - goto_next(0x06) - - // Tech saw weapon - label(LABEL_53) - chr_do_animation(ANIM_SURPRISED_0202, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - speak(CHR_TARGET, L_LIP_041, SFX_8156, CHANNEL_4, COLOR_08_RED) // "Oh, my God - a gun!" - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - // Jo in an unknown room, or follow through from seeing weapon - label(0x06) - restart_timer - speak(CHR_TARGET, L_LIP_039, MP3_032F, CHANNEL_4, COLOR_08_RED) // "Help - help!" - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x06) - - // No chr in same group - run to pad instead - run_to_pad(PAD_LIP_0121) - - beginloop(0x10) - if_chr_stopped(/*goto*/ LABEL_61) - endloop(0x10) - - label(0x06) - try_run_to_chr(CHR_PRESET, /*goto*/ 0x0b) - - beginloop(0x0b) - if_detected_chr(CHR_PRESET, /*goto*/ LABEL_61) - endloop(0x0b) - - label(LABEL_61) - speak(CHR_TARGET, L_LIP_042, MP3_0331, CHANNEL_4, COLOR_08_RED) // "There's an intruder in the complex." - set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) - increase_squadron_alertness(100) - stop_chr - - beginloop(0x0c) - endloop(0x0c) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_disguise_timer[] = { - beginloop(0x04) - // Pointless check - if_stage_flag_eq(STAGEFLAG_LABTECH_DEAD, TRUE, /*goto*/ LABEL_2D) - label(LABEL_2D) - if_chr_has_object(CHR_BOND, OBJ_LABCOAT1, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_BOND, OBJ_LABCOAT2, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_BOND, OBJ_LABCOAT3, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_BOND, OBJ_LABCOAT4, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_BOND, OBJ_LABCOAT5, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_COOP, OBJ_LABCOAT1, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_COOP, OBJ_LABCOAT2, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_COOP, OBJ_LABCOAT3, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_COOP, OBJ_LABCOAT4, /*goto*/ LABEL_2D) - if_chr_has_object(CHR_COOP, OBJ_LABCOAT5, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - speak(CHR_BOND, L_LIP_046, MP3_02AB, CHANNEL_4, COLOR_09_BLUE) // "I don't have much time!!!" - if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_5D) - if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_5F) - set_countdown_timer(90) - goto_next(LABEL_2D) - - label(LABEL_5D) - set_countdown_timer(180) - goto_next(LABEL_2D) - - label(LABEL_5F) - set_countdown_timer(135) - label(LABEL_2D) - show_countdown_timer - start_countdown_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_ENTERED_LAB, TRUE, /*goto*/ LABEL_2D) - if_countdown_timer_lt(1, /*goto*/ 0x06) -#if VERSION >= VERSION_NTSC_1_0 - if_door_locked(0x4a, 0x40, /*goto*/ LABEL_2E) - goto_next(0x0d) - - label(LABEL_2E) -#endif - endloop(0x08) - -#if VERSION >= VERSION_NTSC_1_0 - // Door unlocked - label(0x0d) -#endif - - // Entered lab - label(LABEL_2D) - stop_countdown_timer - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Timer expired - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - stop_countdown_timer - hide_countdown_timer - restart_timer - label(LABEL_66) - activate_alarm - yield - label(LABEL_2D) -#else - activate_alarm -#endif - - show_hudmsg(CHR_BOND, L_LIP_047) // "The enemy has discovered the disguise." - set_stage_flag(STAGEFLAG_DISGUISE_UNCOVERED) - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_random_doors[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_DOOR_VIRUS_DOWNLOADED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_object_flag(0x07, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x09, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x0b, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x0d, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x08, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x0a, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x0c, OBJFLAG_CANNOT_ACTIVATE) - set_object_flag(0x0e, OBJFLAG_CANNOT_ACTIVATE) - - beginloop(0x03) - // 55 in 256 chance of doing anything on a given frame - call_rng - if_rand_gt(200, /*goto*/ 0x06) - reloop(0x03) - - label(0x06) - call_rng - if_rand_lt(64, /*goto*/ 0x0a) - if_rand_lt(128, /*goto*/ 0x0c) - if_rand_lt(196, /*goto*/ 0x0e) - - // 25% chance //1 - label(0x08) - if_door_state(0x07, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x09) - open_door(0x07) - open_door(0x08) - reloop(0x03) - - label(0x09) - close_door(0x07) - close_door(0x08) - reloop(0x03) - - // 25% chance //2 - label(0x0a) - if_door_state(0x09, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x0b) - open_door(0x09) - open_door(0x0a) - reloop(0x03) - - label(0x0b) - close_door(0x09) - close_door(0x0a) - reloop(0x03) - - // 25% chance //3 - label(0x0c) - if_door_state(0x0b, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x0d) - open_door(0x0b) - open_door(0x0c) - reloop(0x03) - - label(0x0d) - close_door(0x0b) - close_door(0x0c) - reloop(0x03) - - // 25% chance //4 - label(0x0e) - if_door_state(0x0d, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x0f) - open_door(0x0d) - open_door(0x0e) - reloop(0x03) - - label(0x0f) - close_door(0x0d) - close_door(0x0e) - endloop(0x03) - - endlist -}; - -u8 func0419_init_doorman[] = { - set_accuracy(10) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 1) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_DOORMAN) - endlist -}; - -u8 func0418_doorman[] = { - set_shotlist(GAILIST_ALERTED) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(LABEL_54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - if_has_gun(CHR_SELF, /*goto*/ LABEL_2D) - - // Gun shot out of hand - label(0x06) - increase_squadron_alertness(100) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - - // Waiting for Jo to arrive - label(LABEL_2D) - stop_chr - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x03) - if_distance_to_target_lt(500, /*goto*/ 0x03) - endloop(0x04) - - label(0x03) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - speak(CHR_TARGET, L_LIP_050, SFX_8157, CHANNEL_4, COLOR_08_RED) // "So, you got here at last." - - beginloop(0x0a) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ LABEL_2D) - if_stage_flag_eq(STAGEFLAG_USED_DISGUISE, TRUE, /*goto*/ 0x06) - - // Disguise not used, or uncovered - label(LABEL_2D) - speak(CHR_TARGET, L_LIP_051, SFX_8158, CHANNEL_4, COLOR_08_RED) // "Hey, you're not... SECURITY ALERT!" - restart_timer - stop_chr - - beginloop(0x0b) - if_timer_lt(120, /*goto*/ LABEL_2D) - endloop(0x0b) - - label(LABEL_2D) - set_stage_flag(STAGEFLAG_DOORMAN_REJECTED) - show_hudmsg(CHR_TARGET, L_LIP_057) // "Cannot gain access to autopsy lab." - goto_next(LABEL_64) - - // Disguised - label(0x06) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_59) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_59) - - // Jo has gun equipped - label(LABEL_2D) - speak(CHR_TARGET, L_LIP_052, SFX_8159, CHANNEL_4, COLOR_08_RED) // "No guns allowed in here - put your weapon away." - restart_timer - - beginloop(0x0c) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_59) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_59) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - speak(CHR_TARGET, L_LIP_053, SFX_815A, CHANNEL_4, COLOR_08_RED) // "I won't tell you again - lose the weapon." - restart_timer - - beginloop(0x0d) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_59) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_59) - if_timer_gt(600, /*goto*/ 0x06) - endloop(0x0d) - -#if VERSION >= VERSION_NTSC_1_0 - label(0x1b) -#endif - label(0x06) - speak(CHR_TARGET, L_LIP_054, SFX_815B, CHANNEL_4, COLOR_08_RED) // "Right - I'm calling security." - restart_timer - label(0x10) - set_stage_flag(STAGEFLAG_DOORMAN_REJECTED) - show_hudmsg(CHR_TARGET, L_LIP_057) // "Cannot gain access to autopsy lab." - goto_next(LABEL_64) - - // Jo disguised and unarmed - label(LABEL_59) - speak(CHR_TARGET, L_LIP_055, SFX_815C, CHANNEL_4, COLOR_08_RED) // "Everyone's been waiting for you..." - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - -#if VERSION >= VERSION_NTSC_1_0 - label(0x06) - if_alarm_active(/*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - goto_first(0x1b) -#endif - - // Unlocking - label(0x06) - unset_object_flag2(0x4a, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x4b, OBJFLAG2_AICANNOTUSE) - unlock_door(0x4a, 0x40) - unlock_door(0x4b, 0x40) - open_door(0x4a) - open_door(0x4b) - - beginloop(0x0f) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x06) - if_saw_injury(0x00, /*goto*/ 0x06) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - if_door_state(0x4a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ LABEL_2D) - reloop(0x0f) - - label(LABEL_2D) - open_door(0x4a) - open_door(0x4b) - endloop(0x0f) - - label(0x06) - increase_squadron_alertness(100) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(LABEL_64) - yield - goto_first(LABEL_64) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_doorman_dead[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_deadish(CHR_DOORMAN, /*goto*/ LABEL_2D) - reloop(0x04) - - label(LABEL_2D) - if_chr_has_object(CHR_BOND, 0x06, /*goto*/ 0x0d) - if_chr_has_object(CHR_COOP, 0x06, /*goto*/ 0x0d) - if_door_locked(0x4a, 0x40, /*goto*/ LABEL_2D) - goto_next(0x0d) - - label(LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x0083, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0084, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0085, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0086, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0087, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0088, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x0089, /*goto*/ 0x06) - if_chr_in_room(CHR_BOND, 0x00, 0x008a, /*goto*/ 0x06) - show_hudmsg(CHR_P1P2, L_LIP_056) // "Critical mission personnel killed." - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ LABEL_2D) - endloop(0x08) - - label(LABEL_2D) - show_hudmsg(CHR_P1P2, L_LIP_057) // "Cannot gain access to autopsy lab." - restart_timer - set_stage_flag(STAGEFLAG_DOORMAN_DEAD) - - beginloop(0x09) - if_timer_gt(120, /*goto*/ LABEL_2D) - endloop(0x09) - - label(LABEL_2D) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x06) - endloop(0x04) - - endlist -}; - -/** - * The lab guy who stands in the room behind the doorman. - */ -u8 func041a_labtech_harrysmate[] = { - set_shotlist(AILIST_LABTECH_HARRYSMATE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(LABEL_54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - restart_timer - - beginloop(LABEL_55) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_58) - endloop(LABEL_55) - - label(LABEL_58) - goto_next(LABEL_5A) - - label(LABEL_2D) - stop_chr - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_in_room(CHR_P1P2, 0x00, 0x0083, /*goto*/ 0x08) - endloop(0x04) - - beginloop(0x08) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_2D) - if_target_in_sight(/*goto*/ LABEL_2D) - if_distance_to_target_lt(500, /*goto*/ LABEL_2D) - endloop(0x08) - - label(LABEL_2D) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - speak(CHR_TARGET, L_LIP_058, MP3_02BB, CHANNEL_4, COLOR_08_RED) // "Hey, that's not Harry. It's an intruder." - increase_squadron_alertness(120) - restart_timer - chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - run_to_pad(PAD_LIP_011E) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ LABEL_5A) - endloop(0x0b) - - label(LABEL_5A) - chr_do_animation(ANIM_DRAW_PISTOL_0288, 0, -1, 0, 16, CHR_SELF, 2) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - try_equip_weapon(MODEL_CHRDRUGGUN, WEAPON_TRANQUILIZER, 0x10000000, /*goto*/ 0x06) - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func041b_labtech_keycardguy[] = { - set_shotlist(AILIST_LABTECH_KEYCARDGUY) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - // Dying - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(LABEL_54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x08) - - // Injured - label(0x06) - restart_timer - - beginloop(LABEL_55) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_58) - endloop(LABEL_55) - - label(LABEL_58) - goto_next(LABEL_5A) - - // Not injured, or recovered - // Waiting to detect Jo - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ LABEL_2D) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_2D) - endloop(0x08) - - // Detected - label(LABEL_2D) - jog_to_pad(PAD_LIP_011B) - - beginloop(0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 100, PAD_LIP_011B, /*goto*/ LABEL_2D) - endloop(0x08) - - label(LABEL_2D) - restart_timer - chr_do_animation(ANIM_SURRENDER_002E, 0, 190, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x09) - if_timer_gt(60, /*goto*/ 0x06) - reloop(0x09) - - label(0x06) - set_stage_flag(STAGEFLAG_KEYCARDGUY_ANGRY) - if_chr_stopped(/*goto*/ LABEL_5A) - endloop(0x09) - - label(LABEL_5A) - chr_do_animation(ANIM_DRAW_PISTOL_0288, 0, -1, 0, 16, CHR_SELF, 2) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - try_equip_weapon(MODEL_CHRDRUGGUN, WEAPON_TRANQUILIZER, 0x10000000, /*goto*/ 0x06) - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func100c_keycardguy_lights[] = { - set_lights_state(0x0088, LIGHTOP_1, 0x00, 0x00, 0x00) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_KEYCARDGUY_ANGRY, TRUE, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - set_lights_state(0x0088, LIGHTOP_1, 0x64, 0x00, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100d_check_entered_lab[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0083, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0084, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0085, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0086, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0087, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0089, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x008a, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_ENTERED_LAB) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_elvis_timer[] = { - beginloop(0x04) - if_door_state(0x13, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_ENTERED_ELVIS_AREA) - play_x_track(XREASON_DEFAULT, 10, 60) - set_countdown_timer(60) - show_countdown_timer - start_countdown_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_RESCUED_ELVIS, TRUE, /*goto*/ LABEL_2D) - if_countdown_timer_lt(1, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - stop_countdown_timer - hide_countdown_timer - set_stage_flag(STAGEFLAG_ELVIS_DEAD) - show_hudmsg(CHR_BOND, L_LIP_064) // "Elvis has been killed." - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - stop_countdown_timer - hide_countdown_timer - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_check_end_level[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_LIP_02A1, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_RESCUED_ELVIS) - yield - yield - if_all_objectives_complete(/*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - set_invincible(CHR_BOND) - revoke_control(CHR_BOND, 4) - hide_countdown_timer - stop_countdown_timer - restart_timer - - beginloop(LABEL_5C) - if_chr_deadish(CHR_BOND, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - if_chr_deadish(CHR_COOP, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_ailist(CHR_SELF, AILIST_OUTRO) - if_timer_gt(280, /*goto*/ LABEL_5B) - endloop(LABEL_5C) - - label(LABEL_5B) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_give_keycard[] = { - set_chr_chrflag(0x23, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x24, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x25, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x26, CHRCFLAG_KILLCOUNTABLE) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ONE_KEYCARD_GUARD_REMAINING, TRUE, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - label(LABEL_2D) - if_chr_deadish(0x23, /*goto*/ 0x06) - give_object_to_chr(0x10, 0x23) - goto_next(LABEL_2D) - - label(0x06) - if_chr_deadish(0x24, /*goto*/ 0x06) - give_object_to_chr(0x10, 0x24) - goto_next(LABEL_2D) - - label(0x06) - if_chr_deadish(0x25, /*goto*/ 0x06) - give_object_to_chr(0x10, 0x25) - goto_next(LABEL_2D) - - label(0x06) - if_chr_deadish(0x26, /*goto*/ LABEL_2D) - - label(LABEL_2D) - unset_object_flag2(0x10, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0414_init_mechanic[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_MECHANIC) - endlist -}; - -u8 func0413_mechanic[] = { - set_shotlist(AILIST_MECHANIC) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - restart_timer - - beginloop(LABEL_54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - // Injured - label(0x06) - restart_timer - - beginloop(LABEL_55) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_58) - endloop(LABEL_55) - - // Main logic - label(LABEL_2D) - stop_chr - - // Wait for player to attempt to open door - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x0a) - if_chr_activated_object(CHR_P1P2, 0x14, /*goto*/ LABEL_2D) - if_chr_activated_object(CHR_P1P2, 0x15, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - restart_timer - - beginloop(0x0d) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - unlock_door(0x14, 0x10) - unlock_door(0x15, 0x10) - open_door(0x14) - open_door(0x15) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - restart_timer - - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - speak(CHR_BOND, L_LIP_065, SFX_M0_GET_THE_HELL_OUT_OF_HERE, CHANNEL_4, COLOR_08_RED) // "Get the hell out of here!" - restart_timer - chr_do_animation(ANIM_SURRENDER_002E, 0, -1, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(LABEL_64) - if_timer_gt(120, /*goto*/ LABEL_2D) - endloop(LABEL_64) - - label(LABEL_58) - label(LABEL_2D) - run_to_pad(PAD_LIP_01BA) - - beginloop(0x0e) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - label(0x0f) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(LABEL_8A) - if_chr_stopped(/*goto*/ LABEL_2D) - endloop(LABEL_8A) - - label(LABEL_2D) - goto_first(0x0f) - - endlist -}; - -u8 func1011_unhide_warehouse_spawner[] = { - // Wait until player near second elevator - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x00f8, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00f7, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00f6, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00f4, /*goto*/ 0x06) - endloop(0x04) - - // Unhide a guy at the top of the ramp near the start - label(0x06) - unset_chr_chrflag(0x44, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x44, CHRCFLAG_INVINCIBLE) - set_ailist(0x44, AILIST_WAREHOUSE_SPAWNER) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_warehouse_spawner[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x08) - if_chr_in_room(CHR_TARGET, 0x00, 0x00f8, /*goto*/ 0x08) - if_chr_in_room(CHR_TARGET, 0x00, 0x00f7, /*goto*/ 0x08) - if_chr_in_room(CHR_TARGET, 0x00, 0x00f6, /*goto*/ 0x08) - if_chr_in_room(CHR_TARGET, 0x00, 0x00f4, /*goto*/ 0x08) - reloop(0x04) - - label(0x08) - - label(LABEL_2D) - if_never_been_onscreen(/*goto*/ LABEL_4E) - if_can_see_target(/*goto*/ 0x08) - reloop(0x04) - - label(0x08) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(LABEL_4E) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ LABEL_4E) - reloop(0x04) - - label(LABEL_4E) - try_spawn_clone2(CHR_SELF, AILIST_WAREHOUSE_CLONE, 0, /*goto*/ LABEL_2D) - reloop(0x04) - - label(LABEL_2D) - restart_timer - yield - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0417_warehouse_clone[] = { - set_target_chr(CHR_BOND) - set_alertness(100) - try_run_to_target(/*goto*/ LABEL_2D) - label(LABEL_2D) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1013_check_chamber_switch_destroyed[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - beginloop(0x04) - if_object_in_good_condition(OBJ_CHAMBER1_SWITCH, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_CHAMBER1_RAISED, TRUE, /*goto*/ LABEL_2D) - show_hudmsg(CHR_BOND, L_LIP_068) // "Mission critical equipment destroyed." - set_stage_flag(STAGEFLAG_CHAMBER_SWITCH_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - reloop(0x04) - - label(0x06) - endloop(0x04) - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_check_crate_destroyed[] = { - // The unsetting of the wall's IMMUNE_TO_EXPLOSIVES flag suggests that the - // wall was originally intended to only be blown up via the crate. This must - // have been changed at some point, but the unsetting of the flag remains. - beginloop(0x04) - if_object_in_good_condition(OBJ_CRATE, /*goto*/ 0x06) - unset_object_flag(OBJ_WALL, OBJFLAG_INVINCIBLE) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - if_object_in_good_condition(OBJ_WALL, /*goto*/ LABEL_2D) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - show_hudmsg(CHR_BOND, L_LIP_068) // "Mission critical equipment destroyed." - set_stage_flag(STAGEFLAG_CRATE_DESTROYED) - - beginloop(0x08) - if_object_in_good_condition(OBJ_WALL, /*goto*/ LABEL_2D) - goto_next(LABEL_2E) - - label(LABEL_2D) - endloop(0x08) - - label(LABEL_2E) - unset_stage_flag(STAGEFLAG_CRATE_DESTROYED) - show_hudmsg(CHR_BOND, L_LIP_089) // "Alternative entrance to medlabs created." - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - endloop(0x04) - - endlist -}; - -/** - * @unused - */ -u8 func041c_unused_041c[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func041d_unused_041d[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func041e_unused_041e[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_check_undisguised[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_DISGUISE_UNCOVERED, TRUE, /*goto*/ 0x06) - if_chr_dead(CHR_LABTECH_HARRYSMATE, /*goto*/ 0x06) - if_chr_dead(CHR_LABTECH_KEYCARDGUY, /*goto*/ 0x06) - if_chr_dead(CHR_DOORMAN, /*goto*/ 0x06) - if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - unset_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041f_labtech_lights[] = { - set_shotlist(AILIST_LABTECH_LIGHTS) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - restart_timer - - beginloop(LABEL_54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_5E) - - label(0x06) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - restart_timer - - beginloop(LABEL_55) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_5E) - endloop(LABEL_55) - - label(LABEL_5E) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_53) - call_rng - if_rand_lt(86, /*goto*/ LABEL_69) - if_rand_lt(172, /*goto*/ LABEL_6A) - chr_do_animation(ANIM_SITTING_DORMANT, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - - label(LABEL_69) - chr_do_animation(ANIM_SITTING_DORMANT, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - - label(LABEL_6A) - chr_do_animation(ANIM_SITTING_DORMANT, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_53) - if_target_in_sight(/*goto*/ 0x03) - if_chr_idle(/*goto*/ 0x06) - goto_first(LABEL_5E) - - label(0x06) - endloop(0x04) - - // Jo in sight - label(0x03) - object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ LABEL_53) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) - label(0x06) - object_do_animation(ANIM_025A, 0xff, 0x02, 0xffff) - speak(CHR_TARGET, L_LIP_037, SFX_SCI_WHO_THE_HELL_ARE_YOU, CHANNEL_4, COLOR_08_RED) // "Who are you?" - -#if VERSION >= VERSION_JPN_FINAL - label(LABEL_68) - if_sound_finished(CHANNEL_4, /*goto*/ 0x06) - yield - goto_first(LABEL_68) - - label(0x06) -#endif - - goto_next(0x06) - - label(LABEL_2D) - speak(CHR_TARGET, L_LIP_083, MP3_027F, CHANNEL_4, COLOR_08_RED) // "Should you be in here?" - restart_timer - do_preset_animation(PRESETANIM_TALKRANDOM) - - beginloop(LABEL_64) - if_sound_finished(CHANNEL_4, /*goto*/ 0x06) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - label(LABEL_2D) - endloop(LABEL_64) - - label(0x06) - stop_chr - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ 0x0c) - label(0x06) - speak(CHR_TARGET, L_LIP_082, MP3_SCI_LEAVE_THIS_AREA, CHANNEL_4, COLOR_08_RED) // "Leave this area now." - restart_timer - do_preset_animation(PRESETANIM_TALKRANDOM) - - beginloop(LABEL_66) - if_sound_finished(CHANNEL_4, /*goto*/ LABEL_53) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - label(LABEL_2D) - endloop(LABEL_66) - - label(LABEL_53) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - - label(0x0a) - set_target_chr(CHR_BOND) - restart_timer - try_run_to_target(/*goto*/ 0x0b) - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x06) - if_distance_to_target_lt(400, /*goto*/ LABEL_2D) - endloop(0x0b) - - label(0x06) - goto_first(0x0a) - - label(LABEL_2D) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - set_returnlist(CHR_SELF, AILIST_LABTECH_LIGHTS) - set_ailist(CHR_SELF, GAILIST_HAND_COMBAT) - - label(0x0c) - walk_to_pad(PAD_LIP_020D) - - beginloop(0x0d) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ LABEL_2D) - if_saw_injury(0x00, /*goto*/ 0x0f) - label(LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(0x0f) - - label(LABEL_2D) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - set_self_chrflag(CHRCFLAG_CANFACEWALL) - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_0428, /*goto*/ LABEL_6E) - - beginloop(LABEL_6E) - if_timer_gt(120, /*goto*/ LABEL_6F) - if_chr_stopped(/*goto*/ LABEL_6F) - endloop(LABEL_6E) - - label(LABEL_6F) - call_rng - if_rand_lt(86, /*goto*/ LABEL_64) - if_rand_lt(172, /*goto*/ LABEL_66) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x0e) - - label(LABEL_64) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x0e) - - label(LABEL_66) - chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x0e) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ LABEL_2D) - if_saw_injury(0x00, /*goto*/ 0x0f) - label(LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(0x0f) - - label(LABEL_2D) - if_chr_idle(/*goto*/ LABEL_2E) - goto_first(LABEL_6F) - - label(LABEL_2E) - endloop(0x0e) - - label(0x0f) - speak(CHR_TARGET, L_LIP_084, SFX_M1_HOLY, CHANNEL_4, COLOR_08_RED) // "Holy..." - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - chr_do_animation(ANIM_SURPRISED_0202, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - restart_timer - - beginloop(0x10) - if_timer_gt(60, /*goto*/ LABEL_2D) - endloop(0x10) - - label(LABEL_2D) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - goto_first(LABEL_53) - - endlist -}; - -u8 func0421_init_labtech_doors[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_LABTECH_DOORS) - endlist -}; - -u8 func0420_labtech_doors[] = { - set_self_chrflag(CHRCFLAG_CANFACEWALL) - set_shotlist(AILIST_LABTECH_DOORS) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_5E) - - label(0x06) - restart_timer - - beginloop(LABEL_55) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_5E) - endloop(LABEL_55) - - label(LABEL_5E) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(LABEL_6F) - - label(LABEL_64) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(LABEL_6F) - - label(LABEL_66) - chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - label(LABEL_6F) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - set_target_chr(CHR_BOND) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) - label(0x06) - goto_next(LABEL_2E) - - label(LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2E) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2E) - if_self_flag_bankx_eq(CHRFLAG0_COVER_TYPE2, TRUE, BANK_0, /*goto*/ 0x06) - label(LABEL_2E) - if_can_see_target(/*goto*/ 0x03) - label(0x06) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) - if_saw_injury(0x00, /*goto*/ 0x03) - if_saw_death(0x00, /*goto*/ 0x03) - if_chr_idle(/*goto*/ LABEL_2D) - goto_first(LABEL_5E) - - label(LABEL_2D) - endloop(0x04) - - label(0x03) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_saw_injury(0x00, /*goto*/ LABEL_89) - if_saw_death(0x00, /*goto*/ LABEL_89) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) - label(0x06) - goto_next(0x06) - - label(LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - do_preset_animation(PRESETANIM_TALK3) - say_quip(CHR_BOND, QUIP_GREETING, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_COVER_TYPE2, BANK_0) - - beginloop(LABEL_7B) - if_saw_injury(0x00, /*goto*/ LABEL_89) - if_saw_death(0x00, /*goto*/ LABEL_89) - if_chr_not_talking(CHR_SELF, /*goto*/ LABEL_2D) - endloop(LABEL_7B) - - label(LABEL_2D) - stop_chr - goto_first(LABEL_5E) - - label(LABEL_89) - label(0x06) - increase_squadron_alertness(100) - - beginloop(LABEL_83) - if_sound_finished(CHANNEL_4, /*goto*/ LABEL_2D) - endloop(LABEL_83) - - label(LABEL_2D) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_2E) - speak(CHR_BOND, L_LIP_085, MP3_M0_ITS_A_SPY, CHANNEL_4, COLOR_08_RED) // "It's a spy!" - goto_next(LABEL_2D) - - label(LABEL_2E) - speak(CHR_BOND, L_LIP_087, MP3_M0_IMPOSTER, CHANNEL_4, COLOR_08_RED) // "Imposter!" - label(LABEL_2D) - label(0x06) - go_to_target_pad(GOPOSFLAG_JOG) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - restart_timer - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_2D) - try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_03C6, /*goto*/ LABEL_70) - label(LABEL_2D) - try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_03C7, /*goto*/ LABEL_70) - - beginloop(LABEL_70) - if_timer_gt(30, /*goto*/ LABEL_2D) - endloop(LABEL_70) - - label(LABEL_2D) - chr_do_animation(ANIM_OPERATE_0221, -1, 120, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - restart_timer - - beginloop(LABEL_71) - if_timer_gt(120, /*goto*/ LABEL_2D) - if_timer_lt(60, /*goto*/ LABEL_2D) - if_stage_flag_eq(STAGEFLAG_AUTOGUN_ACTIVATED, TRUE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_AUTOGUN_VIRUS_DONE, TRUE, /*goto*/ LABEL_2D) - set_stage_flag(STAGEFLAG_AUTOGUN_ACTIVATED) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ LABEL_75) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, 0x3c, TRUE) - goto_next(LABEL_2D) - - label(LABEL_75) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, 0x3d, TRUE) - label(LABEL_2D) - endloop(LABEL_71) - - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, PAD_LIP_0107, /*goto*/ LABEL_73) - - beginloop(LABEL_73) - if_timer_gt(30, /*goto*/ 0x06) - endloop(LABEL_73) - - label(0x06) - label(0x10) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(LABEL_77) - if_chr_stopped(/*goto*/ LABEL_2D) - endloop(LABEL_77) - - label(LABEL_2D) - goto_first(0x10) - - endlist -}; - -u8 func1017_activate_autogun[] = { - set_object_flag(OBJ_AUTOGUN, OBJFLAG_DEACTIVATED) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_AUTOGUN_ACTIVATED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - if_object_in_good_condition(OBJ_AUTOGUN, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - unset_object_flag(OBJ_AUTOGUN, OBJFLAG_DEACTIVATED) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0423_init_labtech_records[] = { - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_LABTECH_RECORDS) - endlist -}; - -u8 func0422_labtech_records[] = { - set_shotlist(AILIST_LABTECH_RECORDS) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_2D) - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - label(LABEL_54) - yield - if_timer_gt(15, /*goto*/ 0x06) - goto_first(LABEL_54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(LABEL_2D) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(LABEL_5E) - label(0x06) - restart_timer - label(LABEL_55) - yield - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_INJURED1, 0x28, 0x03, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_INJURED2, 0x28, 0x03, 0x01, BANK_0, 0x00, 0x00) - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ LABEL_5E) - goto_first(LABEL_55) - - label(LABEL_5E) - call_rng - if_rand_lt(32, /*goto*/ LABEL_64) - if_rand_lt(64, /*goto*/ LABEL_66) - if_rand_lt(96, /*goto*/ LABEL_68) - if_rand_lt(128, /*goto*/ LABEL_69) - if_rand_lt(160, /*goto*/ LABEL_6A) - if_rand_lt(192, /*goto*/ LABEL_6B) - if_rand_lt(224, /*goto*/ LABEL_6C) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_64) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_66) - chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_68) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_69) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_6A) - chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_6B) - chr_do_animation(ANIM_023A, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x04) - label(LABEL_6C) - chr_do_animation(ANIM_HEAD_ROLL, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - - beginloop(0x04) - if_chr_idle(/*goto*/ LABEL_2D) - goto_first(LABEL_5E) - - label(LABEL_2D) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x03) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) - if_distance_to_target_lt(500, /*goto*/ 0x03) - reloop(0x04) - - label(0x03) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISE_UNCOVERED, /*goto*/ 0x06) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_NONE, /*goto*/ LABEL_2D) - if_chr_weapon_equipped(CHR_TARGET, WEAPON_UNARMED, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - label(0x06) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ LABEL_2D) - increase_squadron_alertness(100) - speak(CHR_TARGET, L_LIP_087, MP3_M0_IMPOSTER, CHANNEL_4, COLOR_08_RED) // "Imposter!" - chr_do_animation(ANIM_SURPRISED_0202, -1, -1, CHRANIMFLAG_PAUSEATEND | CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - restart_timer - - beginloop(LABEL_79) - if_timer_gt(90, /*goto*/ LABEL_2D) - endloop(LABEL_79) - - label(LABEL_2D) - speak(CHR_TARGET, L_LIP_086, SFX_M1_WARN_THE_OTHERS, CHANNEL_4, COLOR_08_RED) // "Warn the others..." - label(LABEL_2D) - label(0x06) - run_to_pad(PAD_LIP_0108) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - label(0x10) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x0e) - if_chr_stopped(/*goto*/ LABEL_2D) - endloop(0x0e) - - label(LABEL_2D) - goto_first(0x10) - - endlist -}; - -/** - * Chambers are actually lifts. They must be disabled so they don't continuously - * go up and down. - */ -u8 func1018_disable_chambers[] = { - set_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER3, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER4, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER5, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER6, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER7, OBJFLAG_DEACTIVATED) - set_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -// This macro is here is reduce the amount of duplicate code. However, each -// chamber's code is not entirely consistant, hence why it's not used by all -// chambers. -#define chamber_logic(switch, chamber, stageflag) \ - /* Wait for player to activate chamber switch */ \ - beginloop(0x04) \ - chr_toggle_p1p2(CHR_SELF) \ - if_chr_activated_object(CHR_P1P2, switch, /*goto*/ 0x06) \ - reloop(0x04) \ - \ - label(0x06) \ - if_stage_flag_eq(stageflag, TRUE, /*goto*/ LABEL_2D) \ - mute_channel(CHANNEL_0) \ - \ - /* Raising chamber */ \ - assign_sound(SFX_DOOR_042B, CHANNEL_0) \ - control_sound_from_object(CHANNEL_0, chamber, TRUE) \ - assign_sound(SFX_043A, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, switch, TRUE) \ - show_hudmsg(CHR_P1P2, 0x2a42) /* "Containment unit raised up." */ \ - set_object_image(switch, 0, TVCMDLIST_13) \ - unset_object_flag(chamber, OBJFLAG_DEACTIVATED) \ - set_stage_flag(stageflag) \ - restart_timer \ - \ - beginloop(0x08) \ - if_timer_gt(200, /*goto*/ 0x06) \ - endloop(0x08) \ - \ - label(0x06) \ - mute_channel(CHANNEL_0) \ - assign_sound(SFX_DOOR_042C, CHANNEL_0) \ - control_sound_from_object(CHANNEL_0, chamber, TRUE) \ - set_object_flag(chamber, OBJFLAG_DEACTIVATED) \ - reloop(0x04) \ - \ - /* Lowering chamber */ \ - label(LABEL_2D) \ - mute_channel(CHANNEL_0) \ - assign_sound(SFX_DOOR_042B, CHANNEL_0) \ - control_sound_from_object(CHANNEL_0, chamber, TRUE) \ - assign_sound(SFX_043A, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, switch, TRUE) \ - show_hudmsg(CHR_P1P2, 0x2a43) /* "Containment unit lowered down." */ \ - set_object_image(switch, 0, TVCMDLIST_12) \ - unset_object_flag(chamber, OBJFLAG_DEACTIVATED) \ - unset_stage_flag(stageflag) \ - restart_timer \ - \ - beginloop(0x09) \ - if_timer_gt(200, /*goto*/ 0x06) \ - endloop(0x09) \ - \ - label(0x06) \ - mute_channel(CHANNEL_0) \ - assign_sound(SFX_DOOR_042C, CHANNEL_0) \ - control_sound_from_object(CHANNEL_0, chamber, TRUE) \ - set_object_flag(chamber, OBJFLAG_DEACTIVATED) \ - endloop(0x04) - -/** - * This chamber has the alien in it. - */ -u8 func1019_chamber1[] = { - // Wait for player to activate chamber switch - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_CHAMBER1_SWITCH, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_CHAMBER1_RAISED, TRUE, /*goto*/ LABEL_2D) - mute_channel(CHANNEL_0) - - // Raising chamber - assign_sound(SFX_DOOR_042B, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_CHAMBER1_SWITCH, TRUE) - set_object_image(OBJ_CHAMBER1_SWITCH, 0, TVCMDLIST_13) - show_hudmsg(CHR_P1P2, L_LIP_066) // "Containment unit raised up." - unset_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) - set_stage_flag(STAGEFLAG_CHAMBER1_RAISED) - restart_timer - - beginloop(0x08) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042C, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) - set_chr_hiddenflag(CHR_ALIEN, CHRHFLAG_00100000) - - beginloop(LABEL_64) - chr_move_to_pad(CHR_ALIEN, PAD_LIP_03CA, 0x01, /*goto*/ 0x06) - endloop(LABEL_64) - - label(0x06) - yield - unset_chr_chrflag(CHR_ALIEN, CHRCFLAG_HIDDEN) - set_ailist(CHR_ALIEN, AILIST_CHECK_LOOKING_AT_ALIEN) - label(0x06) - set_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) - reloop(0x04) - - // Lowering chamber - label(LABEL_2D) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042B, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) - set_chr_chrflag(CHR_ALIEN, CHRCFLAG_HIDDEN) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_CHAMBER1_SWITCH, TRUE) - set_object_image(OBJ_CHAMBER1_SWITCH, 0, TVCMDLIST_12) - show_hudmsg(CHR_P1P2, L_LIP_067) // "Containment unit lowered down." - unset_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) - unset_stage_flag(STAGEFLAG_CHAMBER1_RAISED) - restart_timer - - beginloop(0x09) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042C, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER1, TRUE) - set_object_flag(OBJ_CHAMBER1, OBJFLAG_DEACTIVATED) - endloop(0x04) - endlist -}; - -u8 func101a_chamber2[] = { - // Wait for player to activate chamber switch - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_CHAMBER2_SWITCH, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - mute_channel(CHANNEL_0) - if_stage_flag_eq(STAGEFLAG_CHAMBER2_RAISED, TRUE, /*goto*/ LABEL_2D) - - // Raising chamber - assign_sound(SFX_DOOR_042B, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_CHAMBER2_SWITCH, TRUE) - set_object_image(OBJ_CHAMBER2_SWITCH, 0, TVCMDLIST_13) - show_hudmsg(CHR_P1P2, L_LIP_066) // "Containment unit raised up." - unset_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) - set_stage_flag(STAGEFLAG_CHAMBER2_RAISED) - restart_timer - - beginloop(0x08) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042C, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) - - set_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) - reloop(0x04) - - // Lowering chamber - label(LABEL_2D) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042B, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_CHAMBER2_SWITCH, TRUE) - set_object_image(OBJ_CHAMBER2_SWITCH, 0, TVCMDLIST_12) - show_hudmsg(CHR_P1P2, L_LIP_067) // "Containment unit lowered down." - unset_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) - unset_stage_flag(STAGEFLAG_CHAMBER2_RAISED) - restart_timer - - beginloop(0x09) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042C, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER2, TRUE) - set_object_flag(OBJ_CHAMBER2, OBJFLAG_DEACTIVATED) - endloop(0x04) - endlist -}; - -u8 func101b_chamber3[] = { - chamber_logic(OBJ_CHAMBER3_SWITCH, OBJ_CHAMBER3, STAGEFLAG_CHAMBER3_RAISED) - endlist -}; - -u8 func101c_chamber4[] = { - chamber_logic(OBJ_CHAMBER4_SWITCH, OBJ_CHAMBER4, STAGEFLAG_CHAMBER4_RAISED) - endlist -}; - -u8 func101d_chamber5[] = { - chamber_logic(OBJ_CHAMBER5_SWITCH, OBJ_CHAMBER5, STAGEFLAG_CHAMBER5_RAISED) - endlist -}; - -u8 func101e_chamber6[] = { - chamber_logic(OBJ_CHAMBER6_SWITCH, OBJ_CHAMBER6, STAGEFLAG_CHAMBER6_RAISED) - endlist -}; - -u8 func101f_chamber7[] = { - chamber_logic(OBJ_CHAMBER7_SWITCH, OBJ_CHAMBER7, STAGEFLAG_CHAMBER7_RAISED) - endlist -}; - -u8 func1020_chamber8[] = { - // Wait for player to activate chamber switch - beginloop(0x04) - // Likely @bug: Chamber 8 is the only chamber that doesn't call - // chr_toggle_p1p2 here. - // Co-op player might not be able to activate chamber 8. - if_chr_activated_object(CHR_P1P2, OBJ_CHAMBER8_SWITCH, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_CHAMBER8_RAISED, TRUE, /*goto*/ LABEL_2D) - mute_channel(CHANNEL_0) - - // Raising chamber - assign_sound(SFX_DOOR_042B, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_CHAMBER8_SWITCH, TRUE) - show_hudmsg(CHR_P1P2, L_LIP_066) // "Containment unit raised up." - set_object_image(OBJ_CHAMBER8_SWITCH, 0, TVCMDLIST_13) - unset_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) - set_stage_flag(STAGEFLAG_CHAMBER8_RAISED) - restart_timer - - beginloop(0x08) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042C, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) - - set_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) - reloop(0x04) - - // Lowering chamber - label(LABEL_2D) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042B, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) - - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_CHAMBER8_SWITCH, TRUE) - show_hudmsg(CHR_P1P2, L_LIP_067) // "Containment unit lowered down." - set_object_image(OBJ_CHAMBER8_SWITCH, 0, TVCMDLIST_12) - unset_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) - unset_stage_flag(STAGEFLAG_CHAMBER8_RAISED) - restart_timer - - beginloop(0x09) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - mute_channel(CHANNEL_0) - assign_sound(SFX_DOOR_042C, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_CHAMBER8, TRUE) - set_object_flag(OBJ_CHAMBER8, OBJFLAG_DEACTIVATED) - endloop(0x04) - endlist -}; - -u8 func0424_alien[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, AILIST_CHECK_LOOKING_AT_ALIEN) - endlist -}; - -/** - * Guy that's hidden near the start. He starts sending out clones once you reach - * the second elevator. - */ -u8 func0425_hiddenguy[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0426_check_looking_at_alien[] = { - beginloop(0x04) - set_target_chr(CHR_BOND) - if_self_has_chrflag(CHRCFLAG_HIDDEN, /*goto*/ LABEL_61) - if_distance_to_target_lt(300, /*goto*/ LABEL_64) - goto_next(LABEL_66) - - // Jo is in range - label(LABEL_64) - if_within_targets_fovx_by_angle(10, /*goto*/ LABEL_2D) - - // Jo is too far away or not looking at alien - label(LABEL_66) - set_target_chr(CHR_COOP) - if_distance_to_target_lt(300, /*goto*/ LABEL_68) - goto_next(LABEL_69) - - // Velvet is in range - label(LABEL_68) - if_within_targets_fovx_by_angle(10, /*goto*/ LABEL_2D) - - // Both players are too far away - label(LABEL_69) - - // Alien is lowered/hidden - label(LABEL_61) - unset_stage_flag(STAGEFLAG_LOOKING_AT_CHAMBER) - reloop(0x04) - - label(LABEL_2D) - set_stage_flag(STAGEFLAG_LOOKING_AT_CHAMBER) - endloop(0x04) - - endlist -}; - -u8 func1021_xray_scanning[] = { - beginloop(0x04) - // @bug? In co-op, the player wearing the xray may be the player who is - // not looking at the alien. - chr_toggle_p1p2(CHR_SELF) - if_player_using_device(CHR_P1P2, WEAPON_XRAYSCANNER, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_LOOKING_AT_CHAMBER, TRUE, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LIP_074) // "Scanner target acquired." - restart_timer - - beginloop(0x08) - if_timer_gt(240, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_LOOKING_AT_CHAMBER, FALSE, /*goto*/ LABEL_2D) - endloop(0x08) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LIP_075) // "Target ID confirmed - XT origin." - set_stage_flag(STAGEFLAG_XRAY_DONE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - show_hudmsg(CHR_P1P2, L_LIP_076) // "Scanner lock lost." - endloop(0x04) - - endlist -}; - -/** - * Waits until the player has been in the xray area for over 10 seconds, then - * spawns a dataDyne shock trooper. - * - * Rare may have decided that it was too challenging to have a guard attack you - * while xraying, hence removed the guard but left this function. - */ -u8 unregistered_function1[] = { - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_timer_gt(600, /*goto*/ 0x08) - pause_timer - if_chr_in_room(CHR_P1P2, 0x00, 0x010d, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0102, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0103, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0104, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0105, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0106, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0107, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0108, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0109, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x010c, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fa, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fb, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fc, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fd, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fe, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ff, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0100, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0101, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - resume_timer - reloop(0x04) - - // 10 seconds passed - label(0x08) - if_chr_death_animation_finished(0x46, /*goto*/ LABEL_2D) - reloop(0x04) - - label(LABEL_2D) - try_spawn_chr_at_pad(BODY_DDSHOCK, HEAD_DDSHOCK, PAD_LIP_0101, 0x0427, SPAWNFLAG_00000200, /*goto*/ 0x06) - goto_next(LABEL_2D) - - label(0x06) - restart_timer - reloop(0x04) - - label(LABEL_2D) - endloop(0x04) - - endlist -}; - -/** - * Assigned by the above, which is an unregistered function. - * - * Makes the shock trooper run to one of two xray rooms, depending on which one - * you're in. - * - * @unused - */ -u8 func0427_shock_clone[] = { - stop_chr - set_chr_id(0x46) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x10000000, /*goto*/ 0x04) - - label(0x04) - yield - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x010d, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0102, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0103, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0104, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0105, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0106, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0107, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0108, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0109, /*goto*/ 0x06) - run_to_pad(PAD_LIP_0184) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - label(0x06) - run_to_pad(PAD_LIP_013B) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1023_setup_door_locks[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x09) - - // PA - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Agent - lock big door at bottom of ramp near showers - label(0x06) - lock_door(0x44, 0x80) - lock_door(0x45, 0x80) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA - unlock the small shower doors - label(0x09) - unlock_door(0x2b, 0x80) - unlock_door(0x2c, 0x80) - unlock_door(0x2d, 0x80) - unlock_door(0x2e, 0x80) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c01_outro[] = { - set_invincible(CHR_BOND) - camera_movement(ANIM_CUT_LIP_OUTRO_CAM) - play_cutscene_track(MUSIC_RESCUE_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_ailist(CHR_BIOTECH1, GAILIST_IDLE) - set_ailist(CHR_BIOTECH2, GAILIST_IDLE) - set_invincible(CHR_BOND) - - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - set_chr_chrflag(CHR_BIOTECH1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_BIOTECH1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_BIOTECH1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_OUTRO_BIO1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BIOTECH1, 4) - - set_chr_chrflag(CHR_BIOTECH2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_BIOTECH2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_BIOTECH2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_OUTRO_BIO2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BIOTECH2, 4) - - set_object_flag2(0x2f, OBJFLAG2_04000000) - set_object_flag3(0x2f, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_LIP_OUTRO_BED, 0x2f, 0x04, 0xffff) - show_nonessential_chrs(FALSE) - restart_timer - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ LABEL_8B) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(315, LABEL_73) - open_door(0x30) - open_door(0x31) - - wait_until(344, LABEL_64) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(380, LABEL_66) - speak(CHR_P1P2, L_LIP_100, MP3_0433, CHANNEL_7, COLOR_09_BLUE) // "Put your hands up and step away from the alien." - - wait_until(390, LABEL_68) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(460, LABEL_69) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(500, LABEL_74) - - wait_until(514, LABEL_6A) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(580, LABEL_6C) - speak(CHR_P1P2, L_LIP_102, MP3_0435, CHANNEL_7, COLOR_09_BLUE) // "Don't make me tell you again, Doctor. And turn tha..." - - wait_until(588, LABEL_6B) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(606, LABEL_6D) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(612, LABEL_6E) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(618, LABEL_6F) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(656, LABEL_70) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(720, LABEL_71) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(786, LABEL_72) - play_sound(SFX_0163, CHANNEL_10) - - beginloop(0x08) - if_camera_animating(/*goto*/ LABEL_2D) - goto_next(LABEL_8B) - - label(LABEL_2D) - if_controller_button_pressed(/*goto*/ LABEL_8B) - label(LABEL_2D) - endloop(0x08) - - label(LABEL_8B) - mute_channel(CHANNEL_10) - stop_cutscene_track - stop_ambient_track - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_RESCUE_INTRO) - camera_movement(ANIM_CUT_LIP_INTRO_CAM) - cmd0175(60) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_INTRO_JON, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 4) - - set_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_INTRO_DEAD_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_DEAD_GUARD, 4) - - set_object_flag2(OBJ_CRATE, OBJFLAG2_04000000) - set_object_flag3(OBJ_CRATE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_LIP_INTRO_CRATE, OBJ_CRATE, 0x04, 0xffff) - - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SILENCER, WEAPON_NONE) - - wait_until(62, LABEL_67) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(90, LABEL_64) - speak(CHR_BOND, L_LIP_090, MP3_0429, CHANNEL_5, COLOR_03_RED) // "The problem you have is that there is no way to sn..." - - wait_until(108, LABEL_66) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(686, LABEL_68) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(738, LABEL_69) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(782, LABEL_6A) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(810, LABEL_6B) - speak(CHR_BOND, L_LIP_091, MP3_042A, CHANNEL_5, COLOR_09_BLUE) // "Doesn't sound like a problem to me. Where are thes..." - - wait_until(1104, LABEL_6C) - speak(CHR_BOND, L_LIP_092, MP3_042B, CHANNEL_5, COLOR_03_RED) // "In that crate." - - wait_until(1186, LABEL_6D) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(1222, LABEL_6E) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1246, LABEL_6F) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1316, LABEL_70) - play_sound(SFX_01DC, CHANNEL_10) - - wait_until(1346, LABEL_71) - assign_sound(SFX_8169, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_CRATE, TRUE) - - wait_until(1390, LABEL_72) - speak(CHR_BOND, L_LIP_093, MP3_042C, CHANNEL_5, COLOR_09_BLUE) // "Cute. Very cute." - - wait_until(1440, LABEL_73) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(1492, LABEL_74) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(1584, LABEL_75) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1597, LABEL_76) - speak(CHR_BOND, L_LIP_094, MP3_042D, CHANNEL_5, COLOR_03_RED) // "By the way, the stores are crawling with guards. I..." - - wait_until(1628, LABEL_77) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(1658, LABEL_78) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(1724, LABEL_79) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1792, LABEL_7A) - play_sound(SFX_0164, CHANNEL_10) - - wait_until(1866, LABEL_7B) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(1906, LABEL_7C) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(2024, LABEL_7D) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(2017, LABEL_7E) - speak(CHR_BOND, L_LIP_095, MP3_042E, CHANNEL_5, COLOR_09_BLUE) // "Certainly. Any other pearls of wisdom?" - - wait_until(2275, LABEL_7F) - speak(CHR_BOND, L_LIP_096, MP3_042F, CHANNEL_5, COLOR_03_RED) // "That crate..." - - wait_until(2338, LABEL_80) - speak(CHR_BOND, L_LIP_097, MP3_0430, CHANNEL_5, COLOR_09_BLUE) // "Yes?" - - wait_until(2409, LABEL_81) - speak(CHR_BOND, L_LIP_098, MP3_0431, CHANNEL_5, COLOR_03_RED) // "It really doesn't like being shot." - - wait_until(2440, LABEL_65) - open_door(0x33) - open_door(0x34) - - wait_until(2648, LABEL_82) - play_sound(SFX_0172, CHANNEL_10) - - wait_until(2680, LABEL_83) - speak(CHR_BOND, L_LIP_099, MP3_0432, CHANNEL_5, COLOR_09_BLUE) // "Great. Now, if I can just fight the urge to report..." - - wait_until(2690, LABEL_84) - play_sound(SFX_0173, CHANNEL_10) - - wait_until(2986, LABEL_85) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(3048, LABEL_86) - play_sound(SFX_0162, CHANNEL_10) - - wait_until(3104, LABEL_87) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(3152, LABEL_88) - play_sound(SFX_0164, CHANNEL_10) - - beginloop(0x08) - if_camera_animating(/*goto*/ LABEL_2D) - goto_next(LABEL_8B) - - label(LABEL_2D) - if_controller_button_pressed(/*goto*/ LABEL_8B) - label(LABEL_2D) - endloop(0x08) - - label(LABEL_8B) - mute_channel(CHANNEL_10) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_1) - assign_sound(SFX_8169, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_CRATE, TRUE) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) - remove_chr(CHR_JONATHAN) - unset_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_UNPLAYABLE) - set_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_INVINCIBLE) - set_chr_hiddenflag(CHR_INTRO_DEAD_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LIP_INTRO_GUARD, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_DEAD_GUARD, 2) - mute_channel(CHANNEL_10) - unset_object_flag2(OBJ_CRATE, OBJFLAG2_04000000) - set_object_flag3(OBJ_CRATE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_LIP_INTRO_CRATE, OBJ_CRATE, 0x01, 0xfffe) - close_door(0x33) - close_door(0x34) - stop_cutscene_track - stop_ambient_track - enter_firstperson - yield - set_chr_chrflag(CHR_INTRO_DEAD_GUARD, CHRCFLAG_PERIMDISABLEDTMP) - chr_do_animation(ANIM_CUT_LIP_INTRO_GUARD, 2, 3, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_INTRO_DEAD_GUARD, 2) - set_ailist(CHR_INTRO_DEAD_GUARD, GAILIST_IDLE) - yield - kill(CHR_INTRO_DEAD_GUARD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1024_noop[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_LIGHT_VIRUS_DONE, TRUE, /*goto*/ 0x03) - endloop(0x04) - - label(0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Disable chrs, wait until player has keycard, then activate them. - * Most likely guards in the final corridor. - */ -u8 func1025_toggle_guards[] = { - set_chr_chrflag(0x33, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x34, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x33, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x34, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x37, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x2c, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x2d, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x2e, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x37, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x2c, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x2d, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x2e, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x2f, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x30, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x31, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x32, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x2f, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x30, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x31, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x32, CHRCFLAG_INVINCIBLE) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ LABEL_2D) - endloop(0x08) - - label(LABEL_2D) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - unset_chr_chrflag(0x33, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x34, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x33, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x34, CHRCFLAG_INVINCIBLE) - set_ailist(0x33, AILIST_BIOTECH_GUARD_ALERTED) - set_ailist(0x34, AILIST_BIOTECH_GUARD_ALERTED) - unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x2c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x2d, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x2e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x37, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x2c, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x2d, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x2e, CHRCFLAG_INVINCIBLE) - set_ailist(0x37, AILIST_SUPERDRAGON_GUARD) - set_ailist(0x2c, AILIST_SUPERDRAGON_GUARD) - set_ailist(0x2d, AILIST_SUPERDRAGON_GUARD) - set_ailist(0x2e, AILIST_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x2f, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x30, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x31, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x32, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x2f, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x30, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x31, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x32, CHRCFLAG_INVINCIBLE) - set_ailist(0x2f, AILIST_BIOTECH_GUARD) - set_ailist(0x30, AILIST_SUPERDRAGON_GUARD) - set_ailist(0x31, AILIST_SUPERDRAGON_GUARD) - set_ailist(0x32, AILIST_SUPERDRAGON_GUARD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0429_spawn_while_xraying[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_00040000) - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x0d) - if_timer_gt(1800, /*goto*/ LABEL_2D) - reloop(0x04) - - // 30 seconds passed and not disguised - label(LABEL_2D) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_DISGUISED, /*goto*/ 0x0d) - - // Xray area - if_chr_in_room(CHR_P1P2, 0x00, 0x010d, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0102, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0103, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0104, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0105, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0106, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0107, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0108, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0109, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x010c, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fa, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fb, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fc, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fd, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00fe, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x00ff, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0100, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0101, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - label(LABEL_4E) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ LABEL_4E) - reloop(0x04) - - label(LABEL_4E) - try_spawn_clone2(CHR_SELF, 0x042a, 0, /*goto*/ LABEL_2D) - label(LABEL_2D) - restart_timer - yield - endloop(0x04) - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042a_init_xray_clone[] = { - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x47, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, 0x042b) - endlist -}; - -u8 func042b_xray_clone[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func042c_dragon_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func042d_superdragon_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func042e_biotech_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(18) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func042e_biotech_guard_alerted[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(18) - set_reaction_speed(35) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func142d_start_lifts[] = { - activate_lift(1, 0x35) - activate_lift(4, 0x38) - activate_lift(5, 0x39) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1027_check_disguise_worn[] = { - beginloop(0x04) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - show_hudmsg(CHR_BOND, L_LIP_077) // "Disguise has been worn." - set_returnlist(0x00, 0x0401) - set_returnlist(0x01, 0x0402) - set_returnlist(0x02, 0x0403) - set_returnlist(0x03, 0x0404) - set_returnlist(0x04, 0x0405) - set_returnlist(0x05, AILIST_DRAGON_GUARD) - set_returnlist(0x06, AILIST_DRAGON_GUARD) - set_returnlist(0x07, AILIST_DRAGON_GUARD) - set_returnlist(0x08, AILIST_DRAGON_GUARD) - set_returnlist(0x09, AILIST_DRAGON_GUARD) - set_returnlist(0x0a, AILIST_DRAGON_GUARD) - set_returnlist(0x0b, AILIST_DRAGON_GUARD) - set_returnlist(0x0c, 0x0406) - set_returnlist(0x0d, 0x0406) - set_returnlist(0x0e, 0x0406) - set_returnlist(0x0f, 0x0407) - set_returnlist(0x10, 0x0408) - set_returnlist(0x11, AILIST_DRAGON_GUARD) - set_returnlist(0x27, AILIST_DRAGON_GUARD) - set_returnlist(0x28, AILIST_DRAGON_GUARD) - set_returnlist(0x12, AILIST_DRAGON_GUARD) - set_returnlist(0x13, AILIST_DRAGON_GUARD) - set_returnlist(0x14, 0x0409) - set_returnlist(0x15, 0x040a) - set_returnlist(0x16, AILIST_DRAGON_GUARD) - set_returnlist(0x17, AILIST_DRAGON_GUARD) - set_returnlist(0x18, AILIST_DRAGON_GUARD) - set_returnlist(0x1e, AILIST_DRAGON_GUARD) - set_returnlist(0x19, AILIST_DRAGON_GUARD) - set_returnlist(0x1a, AILIST_DRAGON_GUARD) - set_returnlist(0x1d, AILIST_DRAGON_GUARD) - set_returnlist(0x1b, 0x040b) - set_returnlist(0x1c, 0x040c) - set_returnlist(0x1f, AILIST_DRAGON_GUARD) - set_returnlist(0x20, AILIST_DRAGON_GUARD) - set_returnlist(0x21, AILIST_DRAGON_GUARD) - set_returnlist(0x22, AILIST_DRAGON_GUARD) - set_ailist(0x00, AILIST_BECOME_UNAWARE) - set_ailist(0x01, AILIST_BECOME_UNAWARE) - set_ailist(0x02, AILIST_BECOME_UNAWARE) - set_ailist(0x03, AILIST_BECOME_UNAWARE) - set_ailist(0x04, AILIST_BECOME_UNAWARE) - set_ailist(0x05, AILIST_BECOME_UNAWARE) - set_ailist(0x06, AILIST_BECOME_UNAWARE) - set_ailist(0x07, AILIST_BECOME_UNAWARE) - set_ailist(0x08, AILIST_BECOME_UNAWARE) - set_ailist(0x09, AILIST_BECOME_UNAWARE) - set_ailist(0x0a, AILIST_BECOME_UNAWARE) - set_ailist(0x0b, AILIST_BECOME_UNAWARE) - set_ailist(0x0c, AILIST_BECOME_UNAWARE) - set_ailist(0x0d, AILIST_BECOME_UNAWARE) - set_ailist(0x0e, AILIST_BECOME_UNAWARE) - set_ailist(0x0f, AILIST_BECOME_UNAWARE) - set_ailist(0x10, AILIST_BECOME_UNAWARE) - set_ailist(0x11, AILIST_BECOME_UNAWARE) - set_ailist(0x27, AILIST_BECOME_UNAWARE) - set_ailist(0x28, AILIST_BECOME_UNAWARE) - set_ailist(0x12, AILIST_BECOME_UNAWARE) - set_ailist(0x13, AILIST_BECOME_UNAWARE) - set_ailist(0x14, AILIST_BECOME_UNAWARE) - set_ailist(0x15, AILIST_BECOME_UNAWARE) - set_ailist(0x16, AILIST_BECOME_UNAWARE) - set_ailist(0x17, AILIST_BECOME_UNAWARE) - set_ailist(0x18, AILIST_BECOME_UNAWARE) - set_ailist(0x1e, AILIST_BECOME_UNAWARE) - set_ailist(0x19, AILIST_BECOME_UNAWARE) - set_ailist(0x1a, AILIST_BECOME_UNAWARE) - set_ailist(0x1d, AILIST_BECOME_UNAWARE) - set_ailist(0x1b, AILIST_BECOME_UNAWARE) - set_ailist(0x1c, AILIST_BECOME_UNAWARE) - set_ailist(0x1f, AILIST_BECOME_UNAWARE) - set_ailist(0x20, AILIST_BECOME_UNAWARE) - set_ailist(0x21, AILIST_BECOME_UNAWARE) - set_ailist(0x22, AILIST_BECOME_UNAWARE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1028_toggle_mechanic[] = { - if_savefile_flag_is_set(GAMEFILEFLAG_RESCUE_MECHANIC_DEAD, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - disable_chr(CHR_MECHANIC) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1029_msg_showers[] = { - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x00a9, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x00aa, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x00a9, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x00bc, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x009b, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x00b5, /*goto*/ LABEL_2D) - if_chr_in_room(CHR_BOND, 0x00, 0x00ad, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - speak(CHR_BOND, L_LIP_078, MP3_03BC, CHANNEL_6, COLOR_09_BLUE) // "The showers... Now, if I can convince someone to p..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102a_msg_temperaturedropping[] = { - restart_timer - - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x010a, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - speak(CHR_BOND, L_LIP_079, SFX_8180, CHANNEL_6, COLOR_09_BLUE) // "The temperature's dropping... You must be close to..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102b_msg_airrecycled[] = { - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x007f, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - speak(CHR_BOND, L_LIP_080, MP3_03BE, CHANNEL_6, COLOR_09_BLUE) // "The air's heavily recycled around here - must be n..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102c_msg_hurry[] = { - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x0093, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - speak(CHR_BOND, L_LIP_081, SFX_8181, CHANNEL_6, COLOR_09_BLUE) // "There he is, Jo! Hurry or you'll be too late!" - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This function is run on many guards when Jo puts on the disguise. - */ -u8 func0416_become_unaware[] = { - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00002000) - if_chr_deadish(CHR_SELF, /*goto*/ 0x0f) - if_can_see_target(/*goto*/ LABEL_2D) - set_alertness(0) - return - - label(LABEL_2D) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - - // Dying/dead - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function2[] = { - set_object_flag(OBJ_WALL, OBJFLAG_INVINCIBLE) - - beginloop(0x04) - if_object_in_good_condition(OBJ_CRATE, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - endloop(0x04) - - // Crate destroyed - label(0x06) - unset_object_flag(OBJ_WALL, OBJFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102f_shuffle_disguise[] = { - yield - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0c) - call_rng - if_rand_lt(51, /*goto*/ 0x08) - if_rand_lt(102, /*goto*/ 0x09) - if_rand_lt(153, /*goto*/ 0x0a) - if_rand_lt(204, /*goto*/ 0x0b) - - // Rand >= 204 (52 out of 256 chance) - disable_object(OBJ_LABCOAT1) - disable_object(OBJ_LABCOAT2) - disable_object(OBJ_LABCOAT3) - disable_object(OBJ_LABCOAT4) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Rand < 51 (51 out of 256 chance) - label(0x08) - disable_object(OBJ_LABCOAT2) - disable_object(OBJ_LABCOAT3) - disable_object(OBJ_LABCOAT4) - disable_object(OBJ_LABCOAT5) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Rand >= 51 and < 102 (51 out of 256 chance) - label(0x09) - disable_object(OBJ_LABCOAT1) - disable_object(OBJ_LABCOAT3) - disable_object(OBJ_LABCOAT4) - disable_object(OBJ_LABCOAT5) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Rand >= 102 and < 153 (51 out of 256 chance) - label(0x0a) - disable_object(OBJ_LABCOAT1) - disable_object(OBJ_LABCOAT2) - disable_object(OBJ_LABCOAT4) - disable_object(OBJ_LABCOAT5) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Rand >= 153 and < 204 (51 out of 256 chance) - label(0x0b) - disable_object(OBJ_LABCOAT1) - disable_object(OBJ_LABCOAT2) - disable_object(OBJ_LABCOAT3) - disable_object(OBJ_LABCOAT5) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // A and SA - label(0x0c) - give_object_to_chr(OBJ_LABCOAT1, CHR_LABTECH_SHOWERS) - disable_object(OBJ_LABCOAT2) - disable_object(OBJ_LABCOAT3) - disable_object(OBJ_LABCOAT4) - disable_object(OBJ_LABCOAT5) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - label(0x0d) - disable_object(OBJ_LABCOAT1) - disable_object(OBJ_LABCOAT2) - disable_object(OBJ_LABCOAT4) - disable_object(OBJ_LABCOAT5) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1030_lift_door_sounds[] = { - beginloop(LABEL_5E) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x46, /*goto*/ LABEL_2D) - if_chr_activated_object(CHR_P1P2, 0x47, /*goto*/ LABEL_2D) - if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ LABEL_2D) - if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ LABEL_2D) - reloop(LABEL_5E) - - label(LABEL_2D) - play_sound(SFX_DOOR_81B0, -1) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - endloop(LABEL_5E) - - endlist -}; - -u8 func1031_toggle_doorman[] = { - yield - set_chr_chrflag(CHR_DOORMAN, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_DOORMAN, CHRCFLAG_INVINCIBLE) - - beginloop(LABEL_5E) - label(LABEL_2D) - if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_2D) - if_objective_complete(0, /*goto*/ LABEL_2D) - goto_first(LABEL_5E) - - label(LABEL_2D) - if_difficulty_lt(DIFF_SA, /*goto*/ LABEL_2D) - if_objective_complete(1, /*goto*/ LABEL_2D) - endloop(LABEL_5E) - - label(LABEL_2D) - unset_chr_chrflag(CHR_DOORMAN, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_DOORMAN, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1032_count_last_room_guards[] = { - beginloop(0x04) - set_morale(0) - if_chr_deadish(0x23, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - add_morale(1) - label(0x06) - if_chr_deadish(0x24, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - add_morale(1) - label(0x06) - if_chr_deadish(0x25, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - add_morale(1) - label(0x06) - if_chr_deadish(0x26, /*goto*/ LABEL_2D) - goto_next(0x06) - - label(LABEL_2D) - add_morale(1) - label(0x06) - if_morale_lt(3, /*goto*/ LABEL_2D) - set_stage_flag(STAGEFLAG_ONE_KEYCARD_GUARD_REMAINING) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - endloop(0x04) - - endlist -}; - -/** - * When the player uses the disguise the game sets CHRHFLAG_UNTARGETABLE on - * them. Guards check their targets for this flag periodically and unset their - * targets if found. - * - * This ailist disables the flag after 10 seconds. This causes guards to - * disengage combat and gives the player an opportunity to leave a combat - * situation before the guards can become savvy again and foil the disguise. - */ -u8 func1033_unset_untargetable_flag[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_hiddenflag(CHR_P1P2, CHRHFLAG_UNTARGETABLE, /*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - restart_timer - - beginloop(LABEL_64) - if_timer_gt(600, /*goto*/ LABEL_2D) - endloop(LABEL_64) - - label(LABEL_2D) - unset_chr_hiddenflag(CHR_P1P2, CHRHFLAG_UNTARGETABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1034_setup_rtracker[] = { - yield - set_object_flag3(OBJ_FALCON2SILENCED1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_FALCON2SILENCED2, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_PHOENIX, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1435_setup_environment[] = { - yield - configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0080, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0083, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0084, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0085, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0086, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0087, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0088, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0089, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0090, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0091, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0092, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0093, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0094, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0095, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0096, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0097, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0098, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0099, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x009a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x009b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00aa, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ab, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ac, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ad, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ae, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00af, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ba, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00be, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bf, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ca, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00f2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fa, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fe, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ff, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0100, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0101, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0102, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0103, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0104, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0105, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0106, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0107, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0108, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0109, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0432_init_biotech1[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, AILIST_BIOTECH1) - endlist -}; - -u8 func0433_init_biotech2[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, AILIST_BIOTECH2) - endlist -}; - -u8 func0430_biotech2[] = { - label(0x0b) - call_rng - if_rand_gt(85, /*goto*/ LABEL_62) - if_rand_gt(170, /*goto*/ LABEL_63) - - chr_do_animation(ANIM_OPERATE_0221, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - goto_next(0x04) - - label(LABEL_62) - chr_do_animation(ANIM_OPERATE_0222, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - goto_next(0x04) - - label(LABEL_63) - chr_do_animation(ANIM_OPERATE_0223, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - goto_next(0x04) - - beginloop(0x04) - if_chr_stopped(/*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - goto_first(0x0b) - - endlist -}; - -u8 func0431_biotech1[] = { - label(0x0b) - call_rng - if_rand_gt(85, /*goto*/ LABEL_62) - if_rand_gt(170, /*goto*/ LABEL_63) - - chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - goto_next(0x04) - - label(LABEL_62) - chr_do_animation(ANIM_OPERATE_0205, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - goto_next(0x04) - - label(LABEL_63) - chr_do_animation(ANIM_OPERATE_0206, 0, -1, CHRANIMFLAG_SLOWUPDATE, 0, CHR_SELF, 2) - goto_next(0x04) - - beginloop(0x04) - if_chr_stopped(/*goto*/ LABEL_2D) - endloop(0x04) - - label(LABEL_2D) - goto_first(0x0b) - - endlist -}; - -u8 func1036_check_door_terminal_destroyed[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ LABEL_2E) - - beginloop(0x0b) - if_object_in_good_condition(OBJ_DOOR_TERMINAL, /*goto*/ LABEL_2D) - if_stage_flag_eq(STAGEFLAG_DOOR_VIRUS_DOWNLOADED, TRUE, /*goto*/ LABEL_2E) - show_hudmsg(CHR_BOND, L_LIP_068) // "Mission critical equipment destroyed." - set_stage_flag(STAGEFLAG_UPLINK_TERMINAL_DESTROYED) - label(LABEL_2E) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_2D) - endloop(0x0b) - - endlist -}; - -struct ailist ailists[] = { - { func1400_give_datauplinks, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_uplink_doors, 0x1003 }, - { func1004_uplink_lights, 0x1004 }, - { func1005_uplink_autoguns, 0x1005 }, - { func1006_check_lab_accessed, 0x1006 }, - { func1007_check_disguise_collected, 0x1007 }, - { func1009_disguise_timer, 0x1009 }, - { func100a_random_doors, 0x100a }, - { func100b_check_doorman_dead, 0x100b }, - { func100c_keycardguy_lights, 0x100c }, - { func100d_check_entered_lab, 0x100d }, - { func100e_elvis_timer, 0x100e }, - { func100f_check_end_level, 0x100f }, - { func1010_give_keycard, 0x1010 }, - { func1011_unhide_warehouse_spawner, 0x1011 }, - { func1013_check_chamber_switch_destroyed, 0x1013 }, - { func1014_check_crate_destroyed, 0x1014 }, - { func1016_check_undisguised, 0x1016 }, - { func1017_activate_autogun, 0x1017 }, - { func1018_disable_chambers, 0x1018 }, - { func1019_chamber1, 0x1019 }, - { func101a_chamber2, 0x101a }, - { func101b_chamber3, 0x101b }, - { func101c_chamber4, 0x101c }, - { func101d_chamber5, 0x101d }, - { func101e_chamber6, 0x101e }, - { func101f_chamber7, 0x101f }, - { func1020_chamber8, 0x1020 }, - { func1021_xray_scanning, 0x1021 }, - { func1023_setup_door_locks, 0x1023 }, - { func1024_noop, 0x1024 }, - { func1025_toggle_guards, 0x1025 }, - { func1026_check_records_destroyed, 0x1026 }, - { func1027_check_disguise_worn, 0x1027 }, - { func1028_toggle_mechanic, 0x1028 }, - { func1029_msg_showers, 0x1029 }, - { func102a_msg_temperaturedropping, 0x102a }, - { func102b_msg_airrecycled, 0x102b }, - { func102c_msg_hurry, 0x102c }, - { func142d_start_lifts, 0x142d }, - { func102f_shuffle_disguise, 0x102f }, - { func1030_lift_door_sounds, 0x1030 }, - { func1031_toggle_doorman, 0x1031 }, - { func1032_count_last_room_guards, 0x1032 }, - { func1033_unset_untargetable_flag, 0x1033 }, - { func1034_setup_rtracker, 0x1034 }, - { func1435_setup_environment, 0x1435 }, - { func1036_check_door_terminal_destroyed, 0x1036 }, - { func1002_intro, 0x0c00 }, - { func0c01_outro, 0x0c01 }, - { func0401_start_path00, 0x0401 }, - { func0402_start_path01, 0x0402 }, - { func0403_start_path02, 0x0403 }, - { func0404_start_path03, 0x0404 }, - { func0405_start_path04, 0x0405 }, - { func0406_start_path05, 0x0406 }, - { func0407_start_path06, 0x0407 }, - { func0408_start_path07, 0x0408 }, - { func0409_start_path08, 0x0409 }, - { func040a_start_path09, 0x040a }, - { func040b_start_path10, 0x040b }, - { func040c_start_path11, 0x040c }, - { func040d_start_path12, 0x040d }, - { func040e_start_path13, 0x040e }, - { func040f_start_path14, 0x040f }, - { func0410_labtech_showers_sa_pa, 0x0410 }, - { func0411_labtech_showers_agent, 0x0411 }, - { func0412_init_labtech_showers, 0x0412 }, - { func0413_mechanic, 0x0413 }, - { func0414_init_mechanic, 0x0414 }, - { func0415_warehouse_spawner, 0x0415 }, - { func0416_become_unaware, 0x0416 }, - { func0429_spawn_while_xraying, 0x0429 }, - { func042a_init_xray_clone, 0x042a }, - { func042b_xray_clone, 0x042b }, - { func0417_warehouse_clone, 0x0417 }, - { func0418_doorman, 0x0418 }, - { func0419_init_doorman, 0x0419 }, - { func041a_labtech_harrysmate, 0x041a }, - { func041b_labtech_keycardguy, 0x041b }, - { func041c_unused_041c, 0x041c }, - { func041d_unused_041d, 0x041d }, - { func041e_unused_041e, 0x041e }, - { func041f_labtech_lights, 0x041f }, - { func0420_labtech_doors, 0x0420 }, - { func0421_init_labtech_doors, 0x0421 }, - { func0422_labtech_records, 0x0422 }, - { func0423_init_labtech_records, 0x0423 }, - { func0424_alien, 0x0424 }, - { func0425_hiddenguy, 0x0425 }, - { func0426_check_looking_at_alien, 0x0426 }, - { func0427_shock_clone, 0x0427 }, - { func0c01_outro, 0x0428 }, - { func042c_dragon_guard, 0x042c }, - { func042d_superdragon_guard, 0x042d }, - { func042e_biotech_guard, 0x042e }, - { func042e_biotech_guard_alerted, 0x042f }, - { func0432_init_biotech1, 0x0432 }, - { func0433_init_biotech2, 0x0433 }, - { func0430_biotech2, 0x0430 }, - { func0431_biotech1, 0x0431 }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, 0 }, diff --git a/src/setups/setuplue.c b/src/setups/setuplue.c index 28ed0edef..f7ca43c4a 100644 --- a/src/setups/setuplue.c +++ b/src/setups/setuplue.c @@ -88,7 +88,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -871,2539 +871,3 @@ struct path paths[] = { { path34, 34, PATHFLAG_FLYING }, { NULL, 0, 0 }, }; - -u8 func0426_8420[] = { - try_inherit_properties(0x04, /*goto*/ 0x2e) - label(0x2e) - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -#define init_path(pathid) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(6) \ - set_reaction_speed(50) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - -u8 func0401_start_path00[] = { - init_path(0) - endlist -}; - -u8 func0402_start_path01[] = { - init_path(1) - endlist -}; - -u8 func0403_start_path02[] = { - init_path(2) - endlist -}; - -u8 func0404_start_path03[] = { - init_path(3) - endlist -}; - -u8 func0405_start_path04[] = { - init_path(4) - endlist -}; - -u8 func0406_start_path05[] = { - init_path(5) - endlist -}; - -u8 func0407_start_path06[] = { - assign_path(6) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0408_start_path07[] = { - assign_path(7) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0409_set_rotor_speed[] = { - set_rotor_speed(620, 7200) - beginloop(0x04) - endloop(0x04) - - endlist -}; - -u8 func040b_stop_vehicle[] = { - set_vehicle_speed(0, 1) - - beginloop(0x04) - endloop(0x04) - - endlist -}; - -u8 func0c00_init_intro[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, AILIST_INTRO) - endlist -}; - -u8 func140e_check_interceptors_destroyed[] = { - set_object_flag(OBJ_AUTOGUN_AT_START, OBJFLAG_DEACTIVATED) - - beginloop(0x04) - if_object_in_good_condition(OBJ_INTERCEPTOR1, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_INTERCEPTOR1_DESTROYED, TRUE, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_INTERCEPTOR1_DESTROYED) - show_hudmsg(CHR_BOND, L_LUE_019) // "Robot interceptor disabled." - - label(0x2e) - if_object_in_good_condition(OBJ_INTERCEPTOR2, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_INTERCEPTOR2_DESTROYED, TRUE, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_INTERCEPTOR2_DESTROYED) - show_hudmsg(CHR_BOND, L_LUE_019) // "Robot interceptor disabled." - - label(0x2e) - if_object_in_good_condition(OBJ_INTERCEPTOR3, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_INTERCEPTOR3_DESTROYED, TRUE, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_INTERCEPTOR3_DESTROYED) - show_hudmsg(CHR_BOND, L_LUE_019) // "Robot interceptor disabled." - - label(0x2e) - if_stage_flag_eq(STAGEFLAG_INTERCEPTOR1_DESTROYED, FALSE, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_INTERCEPTOR2_DESTROYED, FALSE, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_INTERCEPTOR3_DESTROYED, FALSE, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_LUE_020) // "All robot interceptors disabled." - - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - endloop(0x04) - - endlist -}; - -u8 func100c_maingate_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_door_state(OBJ_MAINGATE1, DOORSTATE_CLOSING, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - set_object_image(OBJ_MAINGATE_SWITCH, 0, TVCMDLIST_12) - label(0x06) - if_chr_activated_object(CHR_P1P2, OBJ_MAINGATE_SWITCH, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_MAINGATE_SWITCH, 0x012c, 0x0190, 0x00) - set_object_image(OBJ_MAINGATE_SWITCH, 0, TVCMDLIST_13) - if_door_state(OBJ_MAINGATE1, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - show_hudmsg(CHR_P1P2, L_LUE_043) // "Main gate has been opened." - open_door(OBJ_MAINGATE1) - open_door(OBJ_MAINGATE2) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - reloop(0x04) - - label(0x2e) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_MAINGATE_SWITCH, 0x012c, 0x0190, 0x00) - set_object_image(OBJ_MAINGATE_SWITCH, 0, TVCMDLIST_12) - show_hudmsg(CHR_P1P2, L_LUE_044) // "Main gate has been closed." - close_door(OBJ_MAINGATE1) - close_door(OBJ_MAINGATE2) - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1400_give_bugs[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - give_object_to_chr(OBJ_BUG1_BOND, CHR_BOND) - label(0x2e) - give_object_to_chr(OBJ_BUG2_BOND, CHR_BOND) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - give_object_to_chr(OBJ_BUG1_COOP, CHR_COOP) - label(0x2e) - give_object_to_chr(OBJ_BUG2_COOP, CHR_COOP) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - label(0x2e) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -#define check_bug_wasted(chr) \ - yield \ - beginloop(0x00) \ - if_ammo_quantity_lt(chr, AMMOTYPE_BUG, 1, /*goto*/ 0x2e) \ - endloop(0x00) \ - \ - beginloop(0x2e) \ - if_weapon_thrown(WEAPON_COMMSRIDER, /*goto*/ 0x06) \ - endloop(0x2e) \ - \ - label(0x06) \ - restart_timer \ - \ - beginloop(0x09) \ - if_weapon_thrown_on_object(WEAPON_COMMSRIDER, OBJ_ANTENNA, /*goto*/ 0x0a) \ - if_timer_gt(120, /*goto*/ 0x0b) \ - endloop(0x09) \ - \ - label(0x0a) \ - set_stage_flag(STAGEFLAG_COMMSBUG_PLACED) \ - show_hudmsg(chr, 0x2c1a) /* "Communications bug placed correctly." */ \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - label(0x0b) \ - if_stage_flag_eq(STAGEFLAG_ONE_BUG_WASTED, TRUE, /*goto*/ 0x2e) \ - set_stage_flag(STAGEFLAG_ONE_BUG_WASTED) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - label(0x2e) \ - set_stage_flag(STAGEFLAG_COMMSBUG_MISPLACED) \ - show_hudmsg(chr, 0x2c1b) /* "Communications bug placed incorrectly." */ \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -/** - * @unused - */ -u8 func0422_check_bug_wasted_target[] = { - check_bug_wasted(CHR_TARGET) - endlist -}; - -u8 func1003_check_bug_wasted_bond[] = { - set_target_chr(CHR_BOND) - check_bug_wasted(CHR_BOND) - endlist -}; - -u8 func1023_check_bug_wasted_coop[] = { - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) - set_target_chr(CHR_COOP) - goto_next(0x06) - - label(0x2e) - set_stage_flag(STAGEFLAG_ONE_BUG_WASTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - check_bug_wasted(CHR_COOP) - endlist -}; - -u8 func1004_check_antenna_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_ANTENNA, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_LUE_028) // "Antenna has been destroyed." - set_stage_flag(STAGEFLAG_ANTENNA_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - endloop(0x04) - - endlist -}; - -u8 func1405_antenna_switch[] = { - set_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_ANTENNA_SWITCH, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_stage_flag_eq(STAGEFLAG_ANTENNA_LOWERED, TRUE, /*goto*/ 0x06) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801E, 0x00, 0x00) - play_sound_from_object2(CHANNEL_1, OBJ_ANTENNA, SFX_00CD, 0x00, 0x02) -#else - assign_sound(SFX_00CD, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_ANTENNA_SWITCH, TRUE) -#endif - set_object_image(OBJ_ANTENNA_SWITCH, 0, TVCMDLIST_12) - unset_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) - show_hudmsg(CHR_P1P2, L_LUE_030) // "Antenna lowered." - set_stage_flag(STAGEFLAG_ANTENNA_LOWERED) - restart_timer - -#if VERSION >= VERSION_NTSC_1_0 - beginloop(0x09) - if_timer_gt(20, /*goto*/ 0x2e) - reloop(0x09) - - label(0x2e) - if_lift_stationary(OBJ_ANTENNA, /*goto*/ 0x2e) - endloop(0x09) -#else - beginloop(0x09) - if_timer_gt(270, /*goto*/ 0x2e) - endloop(0x09) -#endif - - label(0x2e) - mute_channel(CHANNEL_1) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801F, 0x00, 0x00) -#endif - set_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) - reloop(0x04) - - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801E, 0x00, 0x00) - play_sound_from_object2(CHANNEL_1, OBJ_ANTENNA, SFX_00CD, 0x00, 0x02) -#else - assign_sound(SFX_00CD, CHANNEL_1) - control_sound_from_object(CHANNEL_1, OBJ_ANTENNA_SWITCH, TRUE) -#endif - set_object_image(OBJ_ANTENNA_SWITCH, 0, TVCMDLIST_13) - unset_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) - unset_stage_flag(STAGEFLAG_ANTENNA_LOWERED) - show_hudmsg(CHR_P1P2, L_LUE_029) // "Antenna raised." - restart_timer - -#if VERSION >= VERSION_NTSC_1_0 - beginloop(0x0a) - if_timer_gt(20, /*goto*/ 0x2e) - reloop(0x0a) - - label(0x2e) - if_lift_stationary(OBJ_ANTENNA, /*goto*/ 0x2e) - endloop(0x0a) -#else - beginloop(0x0a) - if_timer_gt(270, /*goto*/ 0x2e) - endloop(0x0a) -#endif - - label(0x2e) - mute_channel(CHANNEL_1) -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_9, OBJ_ANTENNA_SWITCH, SFX_DOOR_801F, 0x00, 0x00) -#endif - set_object_flag(OBJ_ANTENNA, OBJFLAG_DEACTIVATED) - endloop(0x04) - - endlist -}; - -u8 func1006_lift_switches[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT1_SWITCH, /*goto*/ 0x09) - if_chr_activated_object(CHR_P1P2, OBJ_LIFT2_SWITCH, /*goto*/ 0x0a) - reloop(0x04) - - label(0x09) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LIFT1_SWITCH, 0x012c, 0x0190, 0x00) - if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2e) - show_hudmsg(CHR_P1P2, L_LUE_036) // "Lift access denied - key card needed." - goto_next(0x0b) - - label(0x2e) - set_object_image(OBJ_LIFT1_SWITCH, 0, TVCMDLIST_13) - if_stage_flag_eq(STAGEFLAG_LIFT1_CALLED, TRUE, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_LIFT1_CALLED) - open_door(0x0e) - open_door(0x38) - unlock_door(0x0e, 0x02) - unlock_door(0x38, 0x02) - show_hudmsg(CHR_P1P2, L_LUE_037) // "Key card accepted - lift operational." - goto_next(0x0b) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LUE_038) // "Lift is fully operational." - goto_next(0x0b) - - label(0x0a) - assign_sound(SFX_043F, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, OBJ_LIFT2_SWITCH, 0x012c, 0x0190, 0x00) -#if VERSION >= VERSION_PAL_BETA - if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2e) -#else - if_chr_has_object(CHR_BOND, OBJ_KEYCARD, /*goto*/ 0x2e) -#endif - show_hudmsg(CHR_P1P2, L_LUE_036) // "Lift access denied - key card needed." - goto_next(0x0b) - - label(0x2e) - set_object_image(OBJ_LIFT2_SWITCH, 0, TVCMDLIST_13) - if_stage_flag_eq(STAGEFLAG_LIFT2_CALLED, TRUE, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_LIFT2_CALLED) - open_door(0x0f) - open_door(0x39) - yield - yield - unlock_door(0x0f, 0x02) - unlock_door(0x39, 0x02) - show_hudmsg(CHR_P1P2, L_LUE_037) // "Key card accepted - lift operational." - goto_next(0x0b) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LUE_038) // "Lift is fully operational." - goto_next(0x0b) - - label(0x0b) - restart_timer - - beginloop(0x0c) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - endloop(0x04) - - endlist -}; - -u8 func1007_check_hangar_accessed[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0042, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0043, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_HANGAR_ACCESSED) - show_hudmsg(CHR_P1P2, L_LUE_039) // "Hangar has been accessed." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_check_end_level[] = { - beginloop(0x04) - if_door_state(0x11, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x09) - if_door_state(0x12, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x09) - endloop(0x04) - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0060, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - show_hudmsg(CHR_P1P2, L_LUE_040) // "Met up with CI agent." - set_stage_flag(STAGEFLAG_MET_JON) - yield - yield - if_chr_deadish(CHR_BOND, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_check_radar_shut_down[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_RADAR_TERMINAL, /*goto*/ 0x06) - goto_next(0x2e) - label(0x06) - endloop(0x04) - - label(0x2e) - show_hudmsg(CHR_BOND, L_LUE_041) // "Air intercept radar shut down." - mute_channel(CHANNEL_0) - set_stage_flag(STAGEFLAG_RADAR_SHUT_DOWN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_final_hangar[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_objective_complete(0, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_objective_complete(1, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - if_objective_complete(2, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_objective_complete(3, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_LUE_01D2, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_stage_flag(STAGEFLAG_ENTERED_FINAL_HANGAR) - play_x_track(XREASON_DEFAULT, 10, 60) - restart_timer - unlock_door(0x11, 0x08) - unlock_door(0x12, 0x08) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0411, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x09) - - beginloop(0x09) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0412, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0a) - - beginloop(0x0a) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0413, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0b) - - beginloop(0x0b) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, 0x0414, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0c) - - // @bug: This timer check will pass immediately. - // It was probably intended to be 120. - beginloop(0x0c) - if_timer_gt(1, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - - // This guard will shoot the spawned guards above, but this guard is NOT Jon - beginloop(0x60) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_01C6, AILIST_TRAITOR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x0d) - endloop(0x60) - - label(0x0d) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0411_init_hangar_guard1[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(10) - set_recovery_speed(35) - set_shield(0) - set_squadron(SQUADRON_0B) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_self_chrflag(CHRCFLAG_00000040) - set_chr_id(0x2c) - set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - jog_to_pad(PAD_LUE_0420) - yield - set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) - endlist -}; - -u8 func0412_init_hangar_guard2[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(10) - set_recovery_speed(35) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_squadron(SQUADRON_0B) - set_self_chrflag(CHRCFLAG_00000040) - set_chr_id(0x2d) - set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - jog_to_pad(PAD_LUE_041F) - yield - set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) - endlist -}; - -u8 func0413_init_hangar_guard3[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(10) - set_recovery_speed(35) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_squadron(SQUADRON_0B) - set_self_chrflag(CHRCFLAG_00000040) - set_chr_id(0x2e) - set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - jog_to_pad(PAD_LUE_041E) - yield - set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) - endlist -}; - -u8 func0414_init_hangar_guard4[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(10) - set_recovery_speed(35) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_squadron(SQUADRON_0B) - set_self_chrflag(CHRCFLAG_00000040) - set_chr_id(0x2f) - set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - jog_to_pad(PAD_LUE_041D) - yield -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, AILIST_ALERT_WHEN_STOPPED) - endlist -}; - -u8 func0415_alert_when_stopped[] = { - // @bug: This loop should have a check for seeing Jo or a distance check to - // Jo. Without it, the guards will run past Jo at the end if she's already - // at the door. - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * This is NOT assigned to Jon. - */ -u8 func0417_traitor[] = { - set_self_chrflag(CHRCFLAG_00000040) - set_self_flag_bankx(CHRFLAG1_PREWARNED, BANK_1) - set_accuracy(100) - set_reaction_speed(100) - restart_timer - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x00000000, /*goto*/ 0x03) - - beginloop(0x03) - if_timer_gt(300, /*goto*/ 0x09) - endloop(0x03) - - label(0x09) - open_door(0x11) - if_chr_dead(0x2f, /*goto*/ 0x0d) - if_chr_knockedout(0x2f, /*goto*/ 0x0d) - set_target_chr(0x2f) - goto_next(0x2e) - - label(0x0d) - if_chr_dead(0x2e, /*goto*/ 0x0e) - if_chr_knockedout(0x2e, /*goto*/ 0x0e) - set_target_chr(0x2e) - goto_next(0x2e) - - label(0x0e) - if_chr_dead(0x2d, /*goto*/ 0x0f) - if_chr_knockedout(0x2d, /*goto*/ 0x0f) - set_target_chr(0x2d) - goto_next(0x2e) - - label(0x0f) - if_chr_dead(0x2c, /*goto*/ 0x10) - if_chr_knockedout(0x2c, /*goto*/ 0x10) - set_target_chr(0x2c) - - label(0x2e) - call_rng - if_rand_gt(128, /*goto*/ 0x2e) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x0a) - - label(0x2e) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x0a) - yield - label(0x0a) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - goto_next(0x0c) - - beginloop(0x0b) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -1373, OPERATOR_LESS_THAN, /*goto*/ 0x10) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -1373, OPERATOR_LESS_THAN, /*goto*/ 0x10) - if_chr_stopped(/*goto*/ 0x0c) - endloop(0x0b) - - label(0x0c) - if_chr_death_animation_finished(0x2f, /*goto*/ 0x2e) - chr_damage_chr(CHR_SELF, 0x2f, HITPART_HEAD) - goto_next(0x06) - - label(0x2e) - if_chr_death_animation_finished(0x2e, /*goto*/ 0x2e) - chr_damage_chr(CHR_SELF, 0x2e, HITPART_HEAD) - goto_next(0x06) - - label(0x2e) - if_chr_death_animation_finished(0x2d, /*goto*/ 0x2e) - chr_damage_chr(CHR_SELF, 0x2d, HITPART_HEAD) - goto_next(0x06) - - label(0x2e) - if_chr_death_animation_finished(0x2c, /*goto*/ 0x06) - chr_damage_chr(CHR_SELF, 0x2c, HITPART_HEAD) - label(0x06) - goto_first(0x09) - - label(0x10) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) - run_to_pad(PAD_LUE_0197) - - beginloop(0x60) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x60) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0416_mechanic[] = { - set_shotlist(AILIST_MECHANIC) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0f) - goto_next(0x04) - - label(0x2e) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - - beginloop(0x6a) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x6a) - - // Not alert - at interceptor - label(0x04) - call_rng - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_INTERCEPTOR, TRUE, /*goto*/ 0x2f) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - if_target_in_sight(/*goto*/ 0x2e) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x04) - - label(0x2f) - jog_to_pad(PAD_LUE_0385) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x0e) - endloop(0x0c) - - // In bunker - label(0x0e) - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0d) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_heard_target_recently(/*goto*/ 0x2e) - if_target_in_sight(/*goto*/ 0x2e) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - goto_first(0x0e) - - label(0x2e) - set_alertness(100) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) - - beginloop(0x0a) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0a) - - label(0x0f) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons -#if VERSION >= VERSION_NTSC_1_0 - play_sound(SFX_M0_HOLY_SHH, CHANNEL_7) -#else - play_sound(SFX_80F6, CHANNEL_7) -#endif - label(0x06) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_object_flag2(OBJ_MINE1, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_MINE2, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_MINE3, OBJFLAG2_INVISIBLE) - set_object_flag2(0x1a, OBJFLAG2_INVISIBLE) // invalid object - set_object_flag2(OBJ_MINE4, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_MINE5, OBJFLAG2_INVISIBLE) - set_object_flag2(OBJ_MINE6, OBJFLAG2_INVISIBLE) - set_chr_chrflag(CHR_MECHANIC, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func040a_top_interceptor[] = { - set_chr_maxdamage(CHR_SELF, 5000) - set_object_flag(OBJ_INTERCEPTOR3, OBJFLAG_CHOPPER_INACTIVE) - restart_timer - - beginloop(0x03) - if_object_in_good_condition(OBJ_INTERCEPTOR3, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_TRIGGER_INTERCEPTOR, TRUE, /*goto*/ 0x06) - endloop(0x03) - - label(0x06) - unset_object_flag(OBJ_INTERCEPTOR3, OBJFLAG_CHOPPER_INACTIVE) - chopper_arm_weapons - begin_hovercar_path(0x22) - set_chr_maxdamage(CHR_SELF, 5000) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x59) - endloop(0x04) - - label(0x58) - yield - label(0x09) - begin_hovercar_path(0x22) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - label(0x06) - if_can_see_target(/*goto*/ 0x59) - reloop(0x0a) - - // Unreachable - label(0x5a) - goto_first(0x09) - - label(0x59) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x5b) - reloop(0x0a) - - label(0x5b) - yield - if_can_see_target(/*goto*/ 0x5c) - restart_timer - - beginloop(0x5d) - if_timer_gt(480, /*goto*/ 0x5e) - if_can_see_target(/*goto*/ 0x5c) - endloop(0x5d) - - label(0x5e) - stop_chr - endloop(0x0a) - - label(0x5c) - goto_first(0x5b) - - endlist -}; - -u8 func040c_init_bottom_interceptors[] = { - set_chr_maxdamage(CHR_SELF, 5000) - set_object_flag(OBJ_INTERCEPTOR1, OBJFLAG_CHOPPER_INACTIVE) - set_object_flag(OBJ_INTERCEPTOR2, OBJFLAG_CHOPPER_INACTIVE) - - beginloop(0x04) - endloop(0x04) - - endlist -}; - -u8 func040d_90c8[] = { - set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) - set_accuracy(30) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040e_outro[] = { - open_door(0x11) - disable_object(OBJ_HOVERBIKE) - camera_movement(ANIM_CUT_LUE_OUTRO_CAM) - play_cutscene_track(MUSIC_INFILTRATION_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_INVINCIBLE) - - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - set_chr_hudpiece_visible(CHR_P1P2, TRUE) - - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_OUTRO_JON, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 4) - - set_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_OUTRO_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD, 4) - - restart_timer - show_nonessential_chrs(FALSE) - set_cutscene_weapon(CHR_P1P2, -1, -1) - yield - set_cutscene_weapon(CHR_P1P2, -1, WEAPON_FALCON2) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x54) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(1, 0x60) - speak(CHR_P1P2, L_LUE_067, MP3_0421, CHANNEL_5, COLOR_07_RED) // "Agent Dark! Over here!" - - wait_until(46, 0x61) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(74, 0x62) - play_sound(SFX_0172, CHANNEL_6) - - wait_until(100, 0x64) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(150, 0x65) - speak(CHR_P1P2, L_LUE_068, MP3_0422, CHANNEL_5, COLOR_09_BLUE) // "There you are! I was beginning to wonder if..." - - wait_until(188, 0x66) - play_sound(SFX_0174, CHANNEL_6) - - wait_until(278, 0x67) - play_sound(SFX_0175, CHANNEL_7) - - wait_until(290, 0x68) - set_chr_shooting_in_cutscene(CHR_JONATHAN, TRUE) - yield - yield - set_chr_shooting_in_cutscene(CHR_JONATHAN, FALSE) - - wait_until(296, 0x79) - play_sound(SFX_HIT_CHR, CHANNEL_10) - - wait_until(310, 0x7a) - play_sound(SFX_ARGH_MALE_0090, CHANNEL_10) - - wait_until(392, 0x69) - play_sound(SFX_THUD_808E, CHANNEL_10) - - wait_until(406, 0x6c) - speak(CHR_P1P2, L_LUE_069, MP3_0423, CHANNEL_5, COLOR_07_RED) // "If what?" - - wait_until(410, 0x6a) - play_sound(SFX_0176, CHANNEL_6) - - wait_until(424, 0x6b) - play_sound(SFX_0177, CHANNEL_6) - - wait_until(426, 0x6c) - play_sound(SFX_0177, CHANNEL_7) - - wait_until(464, 0x6d) - play_sound(SFX_007D, CHANNEL_10) - - wait_until(472, 0x6e) - speak(CHR_P1P2, L_LUE_070, MP3_0424, CHANNEL_5, COLOR_09_BLUE) // "If you'd been discovered yet. And frankly, if this..." - - wait_until(900, 0x70) - speak(CHR_P1P2, L_LUE_071, MP3_0425, CHANNEL_5, COLOR_07_RED) // "I was tidying up one of your loose ends." - - wait_until(936, 0x6f) - play_sound(SFX_0178, CHANNEL_7) - - wait_until(1080, 0x71) - speak(CHR_P1P2, L_LUE_072, MP3_0426, CHANNEL_5, COLOR_09_BLUE) // "My loose ends?" - - wait_until(1180, 0x72) - speak(CHR_P1P2, L_LUE_073, MP3_0427, CHANNEL_5, COLOR_07_RED) // "I'm sorry, I didn't realize you wanted him to shoo..." - - wait_until(1228, 0x73) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(1286, 0x74) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(1434, 0x75) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(1462, 0x77) - play_sound(SFX_0174, CHANNEL_6) - - wait_until(1585, 0x76) - speak(CHR_P1P2, L_LUE_074, MP3_0428, CHANNEL_5, COLOR_09_BLUE) // "Okay, okay, forget about it. I'm going to let the ..." - - wait_until(1588, 0x78) - play_sound(SFX_0175, CHANNEL_7) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x54) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x54) - label(0x2e) - endloop(0x09) - - label(0x54) - label(0x06) - remove_chr(CHR_OUTRO_GUARD) - set_chr_hudpiece_visible(CHR_P1P2, FALSE) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0410_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - if_controller_button_pressed(/*goto*/ 0x54) - play_cutscene_track(MUSIC_INFILTRATION_INTRO) - camera_movement(ANIM_CUT_LUE_INTRO_CAM_01) - set_chr_chrflag(0x0c, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x0d, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x32, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x32, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x32, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x32, 4) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2, WEAPON_NONE) - - wait_until(26, 0x60) - speak(CHR_BOND, L_LUE_058, MP3_0418, CHANNEL_7, COLOR_06_WHITE) // "Okay, Joanna, take a look at this. Our operative i..." - - wait_until(500, 0x61) - speak(CHR_BOND, L_LUE_059, MP3_0419, CHANNEL_7, COLOR_06_WHITE) // "This is your entry point... A deserted helipad on ..." - - wait_until(800, 0x62) - speak(CHR_BOND, L_LUE_060, MP3_041A, CHANNEL_7, COLOR_06_WHITE) // "The lift down to the hangars and the rendezvous po..." - - wait_until(1200, 0x63) - - wait_until(1236, 0x64) - speak(CHR_BOND, L_LUE_061, MP3_041B, CHANNEL_7, COLOR_06_WHITE) // "Here is the communications antenna. Attach a comms..." - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x06) - label(0x2e) - endloop(0x09) - - label(0x06) - label(0x55) - unset_chr_chrflag(0x32, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - label(0x54) - if_controller_button_pressed(/*goto*/ 0x54) - camera_movement(ANIM_CUT_LUE_INTRO_CAM_02) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - - set_chr_chrflag(0x29, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x29, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x29, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_LAB_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x29, 4) - - set_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2a, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x2a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_BIO1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2a, 4) - - set_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2b, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x2b, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_BIO2_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2b, 4) - - set_object_flag2(0x2f, OBJFLAG2_04000000) - set_object_flag3(0x2f, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_LUE_INTRO_BED_01, 0x2f, 0x04, 0xffff) - restart_timer - - wait_until(186, 0x65) - speak(CHR_BOND, L_LUE_062, SFX_81B9, CHANNEL_7, COLOR_09_BLUE) // "Oh, my God!" - - wait_until(380, 0x66) - speak(CHR_BOND, L_LUE_063, MP3_041D, CHANNEL_7, COLOR_06_WHITE) // "Here is our friend. He appears to be physically un..." - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x06) - label(0x2e) - endloop(0x0a) - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x29, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) - unset_object_flag2(0x2f, OBJFLAG2_04000000) - label(0x54) - if_controller_button_pressed(/*goto*/ 0x54) - camera_movement(ANIM_CUT_LUE_INTRO_CAM_03) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - - set_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2a, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x2a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_BIO1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2a, 4) - - set_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2b, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x2b, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_BIO2_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2b, 4) - - set_object_flag2(0x2f, OBJFLAG2_04000000) - set_object_flag3(0x2f, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_LUE_INTRO_BED_02, 0x2f, 0x04, 0xffff) - restart_timer - - wait_until(416, 0x67) - speak(CHR_BOND, L_LUE_064, MP3_041E, CHANNEL_7, COLOR_09_BLUE) // "But who was...?" - - wait_until(485, 0x68) - speak(CHR_BOND, L_LUE_065, MP3_041F, CHANNEL_7, COLOR_06_WHITE) // "Any questions? No. Good. Away you go to the hangar..." - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x06) - label(0x2e) - endloop(0x0b) - - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x2a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) - unset_object_flag2(0x2f, OBJFLAG2_04000000) - label(0x54) - camera_movement(ANIM_CUT_LUE_INTRO_CAM_04) - cmd0175(60) - if_controller_button_pressed(/*goto*/ 0x54) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(0x03, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(0x03, CHRHFLAG_00020000) - unset_chr_chrflag(0x03, CHRCFLAG_HIDDEN) - restart_timer - - wait_until(1, 0x69) - speak(CHR_BOND, L_LUE_066, MP3_0420, CHANNEL_10, COLOR_09_BLUE) // "Agent Dark Mission Log, 1028 hours. Against my bet..." - - wait_until(340, 0x6a) - play_sound(SFX_FOOTSTEP_80D5, CHANNEL_10) - - wait_until(364, 0x6b) - play_sound(SFX_04B0, CHANNEL_10) - - wait_until(458, 0x6c) - play_sound(SFX_046E, CHANNEL_10) - - play_sound(SFX_FOOTSTEP_80D5, CHANNEL_10) - wait_until(496, 0x6d) - play_sound(SFX_FOOTSTEP_80CC, CHANNEL_10) - - play_sound(SFX_FOOTSTEP_80CD, CHANNEL_10) - wait_until(638, 0x6e) - - wait_until(688, 0x6f) - play_sound(SFX_JO_LANDING_046F, CHANNEL_10) - play_sound(SFX_FOOTSTEP_80CE, CHANNEL_10) - play_sound(SFX_FOOTSTEP_80CF, CHANNEL_10) - - wait_until(750, 0x70) - play_sound(SFX_016A, CHANNEL_10) - - wait_until(815, 0x71) - play_sound(SFX_016B, CHANNEL_10) - - wait_until(844, 0x72) - play_sound(SFX_016C, CHANNEL_10) - - wait_until(908, 0x73) - play_sound(SFX_0169, CHANNEL_10) - - wait_until(916, 0x74) - - beginloop(0x0c) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x54) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x54) - label(0x2e) - endloop(0x0c) - - label(0x54) - mute_channel(CHANNEL_10) - mute_channel(CHANNEL_7) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0d, CHRCFLAG_HIDDEN) - remove_chr(0x32) - remove_chr(0x29) - remove_chr(0x2a) - remove_chr(0x2b) - disable_object(0x2f) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_LUE_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(0x03, CHRCFLAG_UNPLAYABLE) - set_ailist(0x02, 0x0426) - set_ailist(0x03, 0x0426) - unset_object_flag2(OBJ_INTERCEPTOR1, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_INTERCEPTOR2, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_INTERCEPTOR3, OBJFLAG2_INVISIBLE) - stop_cutscene_track - stop_ambient_track - enter_firstperson - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This pad is right next to where you start. Most likely the guard was changed - * to use a path instead, but this function remained. - * - * @unused - */ -u8 func0418_walk_to_pad[] = { - walk_to_pad(PAD_LUE_0019) - beginloop(0x09) - endloop(0x09) - - endlist -}; - -u8 func1010_bunker_lighting[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - mute_channel(CHANNEL_0) - yield - assign_sound(SFX_ALARM_INFILTRATION, CHANNEL_0) - play_sound_from_object(CHANNEL_0, 0x10, 1, 800, 1100) - set_lights_state(0x0009, LIGHTOP_3, 0xff, 0x32, 0x78) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) - restart_timer - - beginloop(0x0a) - if_timer_gt(30, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - - beginloop(0x0b) - if_timer_gt(40, /*goto*/ 0x2e) - endloop(0x0b) - - label(0x2e) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_bunker_laser1[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA and PA only - label(0x2e) - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x0a) - endloop(0x09) - - label(0x0a) - restart_timer - close_door(0x1e) - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - restart_timer - open_door(0x1e) - - beginloop(0x0c) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - goto_first(0x0a) - - label(0x10) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_bunker_lasers234[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2e) - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x0a) - endloop(0x09) - - label(0x0a) - restart_timer - close_door(0x1f) - close_door(0x20) - close_door(0x21) - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - restart_timer - open_door(0x1f) - open_door(0x20) - open_door(0x21) - - beginloop(0x0c) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - goto_first(0x0a) - - label(0x10) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_bunker_lasers56[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2e) - restart_timer - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x0a) - endloop(0x09) - - label(0x0a) - restart_timer - close_door(0x22) - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - restart_timer - open_door(0x22) - close_door(0x23) - - beginloop(0x0c) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - label(0x06) - restart_timer - open_door(0x23) - close_door(0x24) - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - label(0x06) - restart_timer - open_door(0x24) - - beginloop(0x0e) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x10) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - goto_first(0x0a) - - label(0x10) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_bunker_lasers[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x03) - - // Agent - hide lasers - disable_object(0x1e) - disable_object(0x1f) - disable_object(0x20) - disable_object(0x21) - disable_object(0x22) - disable_object(0x23) - disable_object(0x24) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA and PA - label(0x03) - set_object_flag(0x1e, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x1f, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x20, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x21, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x22, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x23, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x24, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x1e) - open_door(0x1f) - open_door(0x20) - open_door(0x21) - open_door(0x22) - open_door(0x23) - open_door(0x24) - set_object_flag(0x1e, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x1f, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x20, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x21, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x22, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x23, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x24, OBJFLAG_DOOR_KEEPOPEN) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x09) - if_door_state(0x1e, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - goto_first(0x03) - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_RADAR_SHUT_DOWN, TRUE, /*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - open_door(0x1e) - open_door(0x1f) - open_door(0x20) - open_door(0x21) - open_door(0x22) - open_door(0x23) - open_door(0x24) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_bunker_explosives[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_RADAR_TERMINAL, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_EXPLOSIVES, /*goto*/ 0x2e) - show_hudmsg(CHR_P1P2, L_LUE_045) // "Access denied." - goto_first(0x04) - - label(0x2e) - unset_object_flag2(OBJ_EXPLOSIVE_BRICK, OBJFLAG2_INVISIBLE) - show_hudmsg(CHR_P1P2, L_LUE_046) // "Explosive has been placed." - remove_weapon_from_inventory(WEAPON_EXPLOSIVES) - set_stage_flag(STAGEFLAG_EXPLOSIVES_PLACED) - restart_timer - - beginloop(0x0a) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - yield - set_countdown_timer(20) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x06) - show_hudmsg(CHR_P1P2, L_LUE_047) // "Intruder detected - security system online." - goto_next(0x06) - - // Agent - label(0x2e) - show_hudmsg(CHR_P1P2, L_LUE_075) // "Foreign object detected - security alerted." - label(0x06) - play_x_track(XREASON_DEFAULT, 10, 20) - yield - show_countdown_timer - start_countdown_timer - - beginloop(0x09) - if_countdown_timer_lt(1, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - hide_countdown_timer - unset_object_flag(OBJ_RADAR_TERMINAL, OBJFLAG_INVINCIBLE) - yield - move_object_to_pad(0x25, PAD_LUE_036B) - disable_object(OBJ_EXPLOSIVE_BRICK) - unset_object_flag(0x25, OBJFLAG_INVINCIBLE) - destroy_object(0x25) - destroy_object(OBJ_RADAR_TERMINAL) - mute_channel(CHANNEL_0) - assign_sound(SFX_0479, CHANNEL_0) - control_sound_from_object(CHANNEL_0, OBJ_RADAR_TERMINAL, TRUE) - restart_timer - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - move_object_to_pad(0x26, PAD_LUE_0375) - unset_object_flag(0x26, OBJFLAG_INVINCIBLE) - destroy_object(0x26) - move_object_to_pad(0x27, PAD_LUE_0376) - unset_object_flag(0x27, OBJFLAG_INVINCIBLE) - destroy_object(0x27) - move_object_to_pad(0x28, PAD_LUE_0372) - unset_object_flag(0x28, OBJFLAG_INVINCIBLE) - destroy_object(0x28) - yield - restart_timer - - beginloop(0x0c) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - unset_object_flag(0x51, OBJFLAG_INVINCIBLE) - destroy_object(0x51) - restart_timer - - beginloop(0x7b) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x7b) - - label(0x06) - unset_object_flag(0x2d, OBJFLAG_INVINCIBLE) - move_object_to_pad(0x2d, PAD_LUE_0379) - destroy_object(0x2d) - restart_timer - - beginloop(0x11) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x11) - - label(0x06) - label(0x06) - unset_object_flag(0x29, OBJFLAG_INVINCIBLE) - move_object_to_pad(0x29, PAD_LUE_0373) - destroy_object(0x29) - restart_timer - - beginloop(0x0d) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - unset_object_flag(0x2a, OBJFLAG_INVINCIBLE) - move_object_to_pad(0x2a, PAD_LUE_0374) - destroy_object(0x2a) - restart_timer - - beginloop(0x0e) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - unset_object_flag(0x2b, OBJFLAG_INVINCIBLE) - move_object_to_pad(0x2b, PAD_LUE_0377) - destroy_object(0x2b) - restart_timer - - beginloop(0x0f) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0f) - - label(0x06) - unset_object_flag(0x2c, OBJFLAG_INVINCIBLE) - move_object_to_pad(0x2c, PAD_LUE_0378) - destroy_object(0x2c) - restart_timer - - beginloop(0x10) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x10) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_trigger_interceptor[] = { - restart_timer - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_COMMSBUG_PLACED, TRUE, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0a) - - // PA - 60 seconds - if_timer_gt(3600, /*goto*/ 0x06) - goto_first(0x04) - - // Agent - 120 seconds - label(0x09) - if_timer_gt(7200, /*goto*/ 0x06) - reloop(0x04) - - // SA - 90 seconds - label(0x0a) - if_timer_gt(5400, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_INTERCEPTOR) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_radar_terminal_noise[] = { - yield - assign_sound(SFX_8146, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_RADAR_TERMINAL, 1, 800, 1100) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_unhide_guards[] = { - set_chr_chrflag(0x35, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x1f, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x20, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x21, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x22, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x23, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x24, CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - set_chr_chrflag(0x35, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x1f, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x20, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x21, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x22, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x23, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x24, CHRCFLAG_INVINCIBLE) -#endif - - // Agent: wait until guards 0x10 and 0x11 are dead - // (two guards near antenna blue door) - // SA and PA: Wait until bug thrown on antenna - beginloop(0x04) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_objective_complete(1, /*goto*/ 0x2e) - reloop(0x04) - - label(0x06) - if_chr_deadish(0x10, /*goto*/ 0x06) - goto_first(0x04) - - label(0x06) - if_chr_deadish(0x11, /*goto*/ 0x2e) - endloop(0x04) - - // Enable 4 more guards - the ones inside the blue door - label(0x2e) - unset_chr_chrflag(0x1f, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x20, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x21, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x22, CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(0x1f, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x20, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x21, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x22, CHRCFLAG_INVINCIBLE) -#endif - set_ailist(0x1f, AILIST_TROOPER_ALERTED) - set_ailist(0x20, AILIST_TROOPER_ALERTED) - set_ailist(0x21, AILIST_TROOPER_ALERTED) - set_ailist(0x22, AILIST_TROOPER_ALERTED) - - // Wait until player in room 0x0044 (first hangar ramp) - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0044, /*goto*/ 0x2e) - endloop(0x09) - - // Enable 2 more guards - label(0x2e) - unset_chr_chrflag(0x23, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x24, CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(0x23, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x24, CHRCFLAG_INVINCIBLE) -#endif - set_ailist(0x23, AILIST_DRAGON_ALERTED) - set_ailist(0x24, AILIST_DRAGON_ALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0419_clone_spawner[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(8) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(10) - set_recovery_speed(35) - set_shield(0) - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_INVINCIBLE) -#endif - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ENTERED_FINAL_HANGAR, TRUE, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_never_been_onscreen(/*goto*/ 0x4f) - if_can_see_target(/*goto*/ 0x09) - reloop(0x04) - - label(0x09) - set_ailist(CHR_SELF, AILIST_ALERTED_SPAWNED_GUARD) - - label(0x4f) - unset_self_chrflag(CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - unset_self_chrflag(CHRCFLAG_INVINCIBLE) -#endif - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - label(0x4f) - try_spawn_clone2(CHR_SELF, AILIST_INIT_ALERTED_SPAWNED_GUARD, 0, /*goto*/ 0x2e) - set_ailist(CHR_SELF, AILIST_ALERTED_SPAWNED_GUARD) - - label(0x2e) - yield - endloop(0x04) - - endlist -}; - -u8 func041a_init_alerted_spawned_guard[] = { - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x25, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_ALERTED_SPAWNED_GUARD) - endlist -}; - -u8 func041b_alerted_spawned_guard[] = { - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func1019_spawn_guards_at_antenna[] = { - // Agent: wait until guards 0x10 and 0x11 are dead - // (two guards near antenna blue door) - // SA and PA: Wait until bug thrown on antenna - beginloop(0x04) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_objective_complete(1, /*goto*/ 0x2e) - reloop(0x04) - - label(0x06) - if_chr_deadish(0x10, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_chr_deadish(0x11, /*goto*/ 0x2e) - endloop(0x04) - - // Spawn 3 guards - label(0x2e) - label(0x06) - set_morale(3) - - beginloop(0x56) - if_morale_lt(1, /*goto*/ 0x06) - try_spawn_chr_at_pad(BODY_A51TROOPER, HEAD_RANDOM, PAD_LUE_00A0, AILIST_SPAWNED_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x57) - reloop(0x56) - - label(0x57) - yield - subtract_morale(1) - restart_timer - - beginloop(0x09) - if_timer_gt(10, /*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - endloop(0x56) - - label(0x06) - yield - yield - yield - yield - yield - unset_chr_chrflag(0x35, CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(0x35, CHRCFLAG_INVINCIBLE) -#endif - set_ailist(0x35, GAILIST_SEARCH_FOR_PLAYER) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040f_spawned_guard[] = { - try_equip_weapon(MODEL_CHRLEEGUN1, WEAPON_MAGSEC4, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_HOLD_POSITION, BANK_0) - set_squadron(SQUADRON_0E) - set_self_chrflag(CHRCFLAG_RUNFASTER) - try_inherit_properties(0x35, /*goto*/ 0x06) - label(0x06) - restart_timer - - beginloop(0x0a) - if_timer_gt(300, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - run_to_pad(PAD_LUE_0095) // outside blue door - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -#define init_guard(accuracy, reaction, armor, recovery, function) \ - set_accuracy(accuracy) \ - set_reaction_speed(reaction) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(armor) \ - set_recovery_speed(recovery) \ - set_shield(0) \ - set_ailist(CHR_SELF, function) - -u8 func041d_trooper_unalerted[] = { - set_chr_dodge_rating(2, 10) - init_guard(6, 50, 0, 0, GAILIST_UNALERTED) - endlist -}; - -u8 func041f_trooper_alerted[] = { - set_chr_dodge_rating(2, 10) - init_guard(6, 50, 0, 0, GAILIST_ALERTED) - endlist -}; - -u8 func041e_dragon_unalerted[] = { - init_guard(8, 30, 10, 35, GAILIST_UNALERTED) - endlist -}; - -u8 func0420_dragon_alerted[] = { - init_guard(8, 30, 10, 35, GAILIST_ALERTED) - endlist -}; - -u8 func141f_start_lifts[] = { - activate_lift(2, 0x31) - activate_lift(3, 0x32) - activate_lift(4, 0x33) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_check_mechanic_dead[] = { - yield - unset_savefile_flag(GAMEFILEFLAG_RESCUE_MECHANIC_DEAD) - - beginloop(0x04) - if_chr_dead(CHR_MECHANIC, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_savefile_flag(GAMEFILEFLAG_RESCUE_MECHANIC_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @bug: This message cannot be played because the player has no way to get to - * room 0x0001, which is above the bunker roof. - */ -u8 func101b_msg_airinterceptradar[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0001, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - speak(CHR_P1P2, L_LUE_053, SFX_817D, CHANNEL_6, COLOR_09_BLUE) // "The air intercept radar is controlled from that bu..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_msg_cantthrow[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0013, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - speak(CHR_P1P2, L_LUE_054, MP3_03B9, CHANNEL_6, COLOR_09_BLUE) // "There's the antenna, but... I can't throw a bug th..." - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This message is also unplayable. - */ -u8 func101d_msg_hangarlift[] = { - // Wait for radar shut down and player in room 0x0001 (which is impossible) - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_objective_complete(0, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x0001, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - speak(CHR_P1P2, L_LUE_055, SFX_817E, CHANNEL_6, COLOR_09_BLUE) // "The hangar lift is on the other side of that huge ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_msg_triggerfinger[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0051, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - speak(CHR_P1P2, L_LUE_056, SFX_817F, CHANNEL_6, COLOR_09_BLUE) // "Careful with that trigger finger, Agent Dark - you..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0421_activate_autogun[] = { - set_shotlist(GAILIST_ALERTED) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x2e) - if_heard_target_recently(/*goto*/ 0x2e) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - run_to_pad(PAD_LUE_0384) - - beginloop(0x09) - if_object_in_good_condition(OBJ_AUTOGUN_AT_START, /*goto*/ 0x06) - goto_next(0x0e) - - label(0x06) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 120, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - if_object_in_good_condition(OBJ_AUTOGUN_AT_START, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - unset_object_flag(OBJ_AUTOGUN_AT_START, OBJFLAG_DEACTIVATED) - label(0x06) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(0x0e) - say_quip(CHR_BOND, QUIP_SURPRISED, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - restart_timer - chr_do_animation(ANIM_SURPRISED_0202, 0, -1, 0, 16, CHR_SELF, 2) - - beginloop(0x7c) - if_timer_gt(60, /*goto*/ 0x7d) - endloop(0x7c) - - label(0x7d) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * Randomly select one of two guards near the start to be the one who will - * attempt to activate the autogun. - */ -u8 func1020_choose_autogun_guard[] = { - yield - call_rng - if_rand_gt(128, /*goto*/ 0x2e) - set_ailist(0x00, AILIST_ACTIVATE_AUTOGUN) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2e) - set_ailist(0x01, AILIST_ACTIVATE_AUTOGUN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1021_damage_rl_guard[] = { - yield - damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_ROCKETLAUNCHER_GUARD, WEAPON_SUPERDRAGON) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_check_lift_switches_destroyed[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_LIFT1_CALLED, TRUE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_LIFT2_CALLED, TRUE, /*goto*/ 0x06) - if_object_in_good_condition(OBJ_LIFT1_SWITCH, /*goto*/ 0x2e) - if_object_in_good_condition(OBJ_LIFT2_SWITCH, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_LUE_057) // "Lift access terminals destroyed." - set_stage_flag(STAGEFLAG_LIFT_SWITCHES_DESTROYED) - goto_next(0x06) - - label(0x2e) - endloop(0x04) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1024_lift_door_sounds[] = { - beginloop(0x7e) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x3c, /*goto*/ 0x0a) - if_chr_activated_object(CHR_P1P2, 0x3e, /*goto*/ 0x0b) - if_chr_activated_object(CHR_P1P2, 0x3d, /*goto*/ 0x41) - if_chr_activated_object(CHR_P1P2, 0x3f, /*goto*/ 0x41) - if_chr_activated_object(CHR_P1P2, 0x40, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x41, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x42, /*goto*/ 0x2e) - if_chr_activated_object(CHR_P1P2, 0x43, /*goto*/ 0x2e) - goto_first(0x7e) - - label(0x0a) - if_door_locked(0x3c, 0x02, /*goto*/ 0x2f) - goto_next(0x41) - - label(0x0b) - if_door_locked(0x3e, 0x02, /*goto*/ 0x2f) - goto_next(0x41) - - label(0x41) - play_sound(SFX_01DC, -1) - goto_next(0x06) - - label(0x2e) - play_sound(SFX_DOOR_81B0, -1) - goto_next(0x06) - - label(0x2f) - play_sound(SFX_MENU_SELECT, -1) - label(0x06) - restart_timer - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - endloop(0x7e) - - endlist -}; - -u8 func1025_spawn_bunker_guards[] = { - // This logic is pointless and all leads to label 0x04 anyway - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2e) - goto_next(0x04) - label(0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0e) - - beginloop(0x04) - yield - yield - yield - yield - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x2e) - label(0x06) - endloop(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, FALSE, /*goto*/ 0x0e) - label(0x2e) - restart_timer - - beginloop(0x60) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_0057, 0x0423, SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, /*goto*/ 0x0a) - endloop(0x60) - - beginloop(0x0a) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - - beginloop(0x61) - try_spawn_chr_at_pad(BODY_A51AIRMAN, HEAD_RANDOM, PAD_LUE_0050, 0x0423, SPAWNFLAG_IGNORECOLLISION | SPAWNFLAG_00000200, /*goto*/ 0x0b) - endloop(0x61) - - beginloop(0x0b) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0423_a5e8[] = { - try_inherit_properties(0x25, /*goto*/ 0x06) - label(0x06) - set_alertness(100) - set_self_flag_bankx(CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_self_flag_bankx(CHRFLAG0_CAN_HEARSPAWN, BANK_0) - try_equip_weapon(MODEL_CHRDRAGON, WEAPON_DRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - yield - yield - yield - yield - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_TROOPER_ALERTED) - endlist -}; - -#define watch_for_laser_broken(crate1, crate2, laser) \ - if_difficulty_gt(DIFF_A, /*goto*/ 0x7e) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - /* SA and PA */ \ - beginloop(0x7e) \ - if_object_in_good_condition(crate1, /*goto*/ 0x2e) \ - goto_next(0x06) \ - \ - label(0x2e) \ - if_object_in_good_condition(crate2, /*goto*/ 0x2e) \ - goto_next(0x06) \ - \ - label(0x2e) \ - endloop(0x7e) \ - \ - label(0x06) \ - disable_object(laser) \ - set_ailist(CHR_SELF, AILIST_ACTIVATE_LASERS) - -u8 func1026_check_laser1_broken[] = { - watch_for_laser_broken(0x44, 0x45, 0x1e) - endlist -}; - -u8 func1027_check_laser2_broken[] = { - watch_for_laser_broken(0x46, 0x47, 0x1f) - endlist -}; - -u8 func1028_check_laser3_broken[] = { - watch_for_laser_broken(0x48, 0x49, 0x20) - endlist -}; - -u8 func1029_check_laser4_broken[] = { - watch_for_laser_broken(0x4a, 0x4b, 0x21) - endlist -}; - -u8 func102a_check_laser5_broken[] = { - watch_for_laser_broken(0x4c, 0x4d, 0x22) - endlist -}; - -u8 func102b_check_laser6_broken[] = { - watch_for_laser_broken(0x4e, 0x4f, 0x23) - endlist -}; - -u8 func102c_check_laser7_broken[] = { - watch_for_laser_broken(0x50, 0x52, 0x24) - endlist -}; - -u8 func0424_activate_lasers[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - - // PA - label(0x7e) - if_stage_flag_eq(STAGEFLAG_ANY_LASER_DESTROYED, TRUE, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_ANY_LASER_DESTROYED) - if_stage_flag_eq(STAGEFLAG_EXPLOSIVES_PLACED, TRUE, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_LUE_047) // "Intruder detected - security system online." - - // A and SA - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0425_a7d4[] = { - label(0x04) - yield - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This hidden guard is used as a template for cloning others. - */ -u8 func041c_template_guard[] = { - label(0x04) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102d_check_antenna_switch_destroyed[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) - - beginloop(0x04) - if_object_in_good_condition(OBJ_ANTENNA_SWITCH, /*goto*/ 0x06) - goto_next(0x2e) - - label(0x06) - endloop(0x04) - - label(0x2e) - if_stage_flag_eq(STAGEFLAG_ANTENNA_LOWERED, TRUE, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_LUE_042) // "Critical mission object destroyed." - set_stage_flag(STAGEFLAG_ANTENNA_DESTROYED) - label(0x2e) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102e_setup_rtracker[] = { - yield - set_object_flag3(OBJ_ROCKETLAUNCHER, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func142f_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x0001, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_start_path00, 0x0401 }, - { func0402_start_path01, 0x0402 }, - { func0403_start_path02, 0x0403 }, - { func0404_start_path03, 0x0404 }, - { func0405_start_path04, 0x0405 }, - { func0406_start_path05, 0x0406 }, - { func0407_start_path06, 0x0407 }, - { func0408_start_path07, 0x0408 }, - { func0409_set_rotor_speed, 0x0409 }, - { func040a_top_interceptor, 0x040a }, - { func040b_stop_vehicle, 0x040b }, - { func040c_init_bottom_interceptors, 0x040c }, - { func040d_90c8, 0x040d }, - { func0411_init_hangar_guard1, 0x0411 }, - { func0412_init_hangar_guard2, 0x0412 }, - { func0413_init_hangar_guard3, 0x0413 }, - { func0414_init_hangar_guard4, 0x0414 }, - { func0415_alert_when_stopped, 0x0415 }, - { func0416_mechanic, 0x0416 }, - { func0417_traitor, 0x0417 }, - { func0418_walk_to_pad, 0x0418 }, - { func040f_spawned_guard, 0x040f }, - { func040e_outro, 0x040e }, - { func0410_intro, 0x0410 }, - { func0419_clone_spawner, 0x0419 }, - { func041a_init_alerted_spawned_guard, 0x041a }, - { func041c_template_guard, 0x041c }, - { func041b_alerted_spawned_guard, 0x041b }, - { func041d_trooper_unalerted, 0x041d }, - { func041e_dragon_unalerted, 0x041e }, - { func041f_trooper_alerted, 0x041f }, - { func0420_dragon_alerted, 0x0420 }, - { func0421_activate_autogun, 0x0421 }, - { func0422_check_bug_wasted_target, 0x0422 }, - { func0423_a5e8, 0x0423 }, - { func0424_activate_lasers, 0x0424 }, - { func0425_a7d4, 0x0425 }, - { func0426_8420, 0x0426 }, - { func0c00_init_intro, 0x0c00 }, - { func040e_outro, 0x0c01 }, - { func1400_give_bugs, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func0c00_init_intro, 0x1002 }, - { func1003_check_bug_wasted_bond, 0x1003 }, - { func1004_check_antenna_destroyed, 0x1004 }, - { func1405_antenna_switch, 0x1405 }, - { func1006_lift_switches, 0x1006 }, - { func1007_check_hangar_accessed, 0x1007 }, - { func1008_check_end_level, 0x1008 }, - { func1009_check_radar_shut_down, 0x1009 }, - { func100b_final_hangar, 0x100b }, - { func100c_maingate_switch, 0x100c }, - { func140e_check_interceptors_destroyed, 0x140e }, - { func1010_bunker_lighting, 0x1010 }, - { func1011_bunker_explosives, 0x1011 }, - { func1012_bunker_laser1, 0x1012 }, - { func1013_bunker_lasers, 0x1013 }, - { func1013_bunker_lasers234, 0x1014 }, - { func1013_bunker_lasers56, 0x1015 }, - { func1016_trigger_interceptor, 0x1016 }, - { func1017_radar_terminal_noise, 0x1017 }, - { func1018_unhide_guards, 0x1018 }, - { func1019_spawn_guards_at_antenna, 0x1019 }, - { func101a_check_mechanic_dead, 0x101a }, - { func101b_msg_airinterceptradar, 0x101b }, - { func101c_msg_cantthrow, 0x101c }, - { func101d_msg_hangarlift, 0x101d }, - { func101e_msg_triggerfinger, 0x101e }, - { func141f_start_lifts, 0x141f }, - { func1020_choose_autogun_guard, 0x1020 }, - { func1021_damage_rl_guard, 0x1021 }, - { func1022_check_lift_switches_destroyed, 0x1022 }, - { func1023_check_bug_wasted_coop, 0x1023 }, - { func1024_lift_door_sounds, 0x1024 }, - { func1025_spawn_bunker_guards, 0x1025 }, - { func1026_check_laser1_broken, 0x1026 }, - { func1027_check_laser2_broken, 0x1027 }, - { func1028_check_laser3_broken, 0x1028 }, - { func1029_check_laser4_broken, 0x1029 }, - { func102a_check_laser5_broken, 0x102a }, - { func102b_check_laser6_broken, 0x102b }, - { func102c_check_laser7_broken, 0x102c }, - { func102d_check_antenna_switch_destroyed, 0x102d }, - { func102e_setup_rtracker, 0x102e }, - { func142f_setup_environment, 0x142f }, - { NULL, 0 }, -}; diff --git a/src/setups/setupmp1.c b/src/setups/setupmp1.c index 092d2fe5b..749a10a2d 100644 --- a/src/setups/setupmp1.c +++ b/src/setups/setupmp1.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp10.c b/src/setups/setupmp10.c index 27cce04c9..e55e389d3 100644 --- a/src/setups/setupmp10.c +++ b/src/setups/setupmp10.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp11.c b/src/setups/setupmp11.c index 3ec4ab3f1..a6c552616 100644 --- a/src/setups/setupmp11.c +++ b/src/setups/setupmp11.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp12.c b/src/setups/setupmp12.c index 3d788c4f5..f32b590fd 100644 --- a/src/setups/setupmp12.c +++ b/src/setups/setupmp12.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp13.c b/src/setups/setupmp13.c index c9262b6c3..7994c19a9 100644 --- a/src/setups/setupmp13.c +++ b/src/setups/setupmp13.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupmp14.c b/src/setups/setupmp14.c index 547203cee..39684dc4c 100644 --- a/src/setups/setupmp14.c +++ b/src/setups/setupmp14.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp15.c b/src/setups/setupmp15.c index b90535aaa..8927da7d2 100644 --- a/src/setups/setupmp15.c +++ b/src/setups/setupmp15.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp16.c b/src/setups/setupmp16.c index 26f90428f..f2d002f10 100644 --- a/src/setups/setupmp16.c +++ b/src/setups/setupmp16.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp17.c b/src/setups/setupmp17.c index c69278d4c..90d771a95 100644 --- a/src/setups/setupmp17.c +++ b/src/setups/setupmp17.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupmp18.c b/src/setups/setupmp18.c index 95157b40c..d33427085 100644 --- a/src/setups/setupmp18.c +++ b/src/setups/setupmp18.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp19.c b/src/setups/setupmp19.c index d19432449..25719ea9c 100644 --- a/src/setups/setupmp19.c +++ b/src/setups/setupmp19.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp2.c b/src/setups/setupmp2.c index d9387668e..dd0bbc12a 100644 --- a/src/setups/setupmp2.c +++ b/src/setups/setupmp2.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp20.c b/src/setups/setupmp20.c index bd11e999a..57193752a 100644 --- a/src/setups/setupmp20.c +++ b/src/setups/setupmp20.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupmp3.c b/src/setups/setupmp3.c index ebf3c8015..3a79949eb 100644 --- a/src/setups/setupmp3.c +++ b/src/setups/setupmp3.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,15 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1000_0038[] = { - set_wind_speed(20) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_0038, 0x1000 }, - { NULL, 0 }, -}; - diff --git a/src/setups/setupmp4.c b/src/setups/setupmp4.c index 454744af0..065060437 100644 --- a/src/setups/setupmp4.c +++ b/src/setups/setupmp4.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -35,12 +35,3 @@ s32 path00[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func0000_0034[] = { - endlist -}; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupmp5.c b/src/setups/setupmp5.c index 3e0e5a028..cbe40177a 100644 --- a/src/setups/setupmp5.c +++ b/src/setups/setupmp5.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp6.c b/src/setups/setupmp6.c index 50cbbb3d8..8498dad47 100644 --- a/src/setups/setupmp6.c +++ b/src/setups/setupmp6.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp7.c b/src/setups/setupmp7.c index 5cbad2c77..7e1f9d3f1 100644 --- a/src/setups/setupmp7.c +++ b/src/setups/setupmp7.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp8.c b/src/setups/setupmp8.c index 763f6511b..49ce9e70e 100644 --- a/src/setups/setupmp8.c +++ b/src/setups/setupmp8.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupmp9.c b/src/setups/setupmp9.c index dd8883fcf..b5d8b9d76 100644 --- a/src/setups/setupmp9.c +++ b/src/setups/setupmp9.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupoat.c b/src/setups/setupoat.c index d0a255070..d603e5b06 100644 --- a/src/setups/setupoat.c +++ b/src/setups/setupoat.c @@ -20,7 +20,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -40,175 +40,6 @@ s32 intro[] = { endintro }; -u8 func0406_idle[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0408_idle_with_10_health[] = { - set_chr_maxdamage(CHR_SELF, 10) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0404_spawn_enemies[] = { - // Spawn 12 enemies - set_chr_team(CHR_SELF, TEAM_ENEMY) - restart_timer - set_morale(12) - label(0x04) - if_morale_lt(1, /*goto*/ 0x01) - try_spawn_chr_at_chr(BODY_DDSHOCK, HEAD_DDSHOCK, 0x06, AILIST_INIT_ENEMY, SPAWNFLAG_00000010, /*goto*/ 0xa2) - goto_next(0x01) - label(0xa2) - yield - subtract_morale(1) - goto_first(0x04) - - label(0x01) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_INIT_ENEMY) - endlist -}; - -u8 func0401_init_enemy[] = { - try_equip_weapon(MODEL_CHRCMP150, WEAPON_CMP150, 0x00000000, /*goto*/ 0x01) - label(0x01) - try_inherit_properties(0x06, /*goto*/ 0x01) - label(0x01) - assign_path(0) - start_patrol - set_returnlist(CHR_SELF, GAILIST_CHOOSE_TARGET) - set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) - endlist -}; - -u8 func0405_spawn_maians[] = { - // Spawn 12 Maians - set_chr_team(CHR_SELF, TEAM_ALLY) - stop_chr - restart_timer - set_morale(12) - label(0x04) - if_morale_lt(1, /*goto*/ 0x01) - try_spawn_chr_at_chr(BODY_ELVIS1, HEAD_ELVIS, 0x07, AILIST_INIT_MAIAN, SPAWNFLAG_00000010, /*goto*/ 0xa2) - goto_next(0x01) - label(0xa2) - yield - subtract_morale(1) - goto_first(0x04) - - label(0x01) - rebuild_teams - rebuild_squadrons - yield - yield - yield - yield - yield - set_ailist(CHR_SELF, AILIST_INIT_MAIAN) - endlist -}; - -u8 func0402_init_maian[] = { - set_chr_team(CHR_SELF, TEAM_ALLY) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_MAGSEC4, 0x00000000, /*goto*/ 0x01) - label(0x01) - try_inherit_properties(0x07, /*goto*/ 0x01) - label(0x01) - assign_path(0) - start_patrol - set_returnlist(CHR_SELF, GAILIST_CHOOSE_TARGET) - set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) - endlist -}; - -u8 func1001_01a4[] = { - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function1[] = { - // Print "t" to console when Joanna is looking at some object. - // The object doesn't exist in the props code though, so was likely removed. - label(0x04) - yield - if_chr_looking_at_object(CHR_BOND, 0x00, /*goto*/ 0x01) - goto_first(0x04) - - label(0x01) - goto_first(0x04) - - endlist -}; - -u8 func1000_idle[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_init_some_sound[] = { - play_sound(SFX_0037, -1) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -// This function is never assigned. -u8 func0407_defend_pad[] = { - set_shotlist(0x0407) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0xa5) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x01) - - // Go to target pad, but stop when seen player or when near pad - label(0xdb) - jog_to_pad(PAD_PRESET) - label(0xdc) - yield - if_enemy_distance_lt_and_los(2540, /*goto*/ 0xa5) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x01) - goto_first(0xdc) - - // Near pad. Wait until detected player. - label(0x01) - stop_chr - label(0xa6) - yield - if_enemy_distance_lt_and_los(2540, /*goto*/ 0xa5) - if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x01) - goto_first(0xa6) - - label(0x01) - goto_first(0xdb) - - // Do combat - label(0xa5) - set_returnlist(CHR_SELF, 0x0407) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -struct ailist ailists[] = { - { func0401_init_enemy, 0x0401 }, - { func0402_init_maian, 0x0402 }, - { func0403_init_some_sound, 0x0403 }, - { func0404_spawn_enemies, 0x0404 }, - { func0405_spawn_maians, 0x0405 }, - { func0406_idle, 0x0406 }, - { func0407_defend_pad, 0x0407 }, - { func0408_idle_with_10_health, 0x0408 }, - { func1000_idle, 0x1000 }, - { func1001_01a4, 0x1001 }, - { NULL, 0 }, -}; - s32 path00[] = { PAD_OAT_0014, PAD_OAT_0015, diff --git a/src/setups/setupold.c b/src/setups/setupold.c index d64889abf..492ef6b63 100644 --- a/src/setups/setupold.c +++ b/src/setups/setupold.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -38,7 +38,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; diff --git a/src/setups/setuppam.c b/src/setups/setuppam.c index a36f5df23..5f40662ce 100644 --- a/src/setups/setuppam.c +++ b/src/setups/setuppam.c @@ -107,7 +107,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -719,4083 +719,6 @@ s32 path10[] = { -1, }; -u8 func0401_unused[] = { - begin_hovercar_path(0x00) - set_vehicle_speed(384, 120) - - beginloop(0x04) - endloop(0x04) - - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func040b_init_elvis[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_PUSHABLE) - set_accuracy(100) - set_reaction_speed(100) - set_alertness(100) - set_chr_maxdamage(CHR_SELF, 1) - add_health_or_armor(900) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - endlist -}; - -u8 func0402_elvis_follow_and_reactive_teleportals[] = { - set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - set_shotlist(AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Injured - label(0x2e) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2f) - goto_next(0x12) - - label(0x2f) - say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x12) - - // Not injured - label(0x06) - if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - goto_next(0x06) - - // Has flag - label(0x2e) - if_enemy_distance_lt_and_los(100, /*goto*/ 0x08) - - // No enemy nearby - label(0x06) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - - // Jo distance >= 200 - label(0x03) - set_target_chr(CHR_PRESET) - restart_timer - if_distance_to_target_gt(300, /*goto*/ 0x06) - try_jog_to_target(/*goto*/ 0x04) - - // Jo distance < 200 or distance > 300 - label(0x06) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - goto_next(0x06) - label(0x2e) - if_enemy_distance_lt_and_los(100, /*goto*/ 0x08) - label(0x06) - if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x2e) - if_chr_in_room(CHR_ELVIS, 0x00, 0x003c, /*goto*/ 0x5f) - label(0x2e) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - goto_first(0x03) - - // Waiting next to Jo? - label(0x06) - stop_chr - - beginloop(0x09) - if_self_flag_bankx_eq(CHRFLAG1_HANDCOMBATONLY, TRUE, BANK_1, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - goto_next(0x06) - label(0x2e) - if_enemy_distance_lt_and_los(100, /*goto*/ 0x08) - label(0x06) - if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x2e) - if_chr_in_room(CHR_ELVIS, 0x00, 0x003c, /*goto*/ 0x5f) - label(0x2e) - set_target_chr(CHR_PRESET) - if_distance_to_target_gt(300, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - // Enemy detected - label(0x08) - yield - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - goto_next(0x2e) - label(0x06) - call_rng - if_rand_lt(85, /*goto*/ 0x63) - if_rand_lt(170, /*goto*/ 0x64) - - say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - - label(0x63) - say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - - label(0x64) - say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - label(0x2e) - set_shotlist(AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // In teleport control room - label(0x5f) - stop_chr - speak(CHR_TARGET, L_PAM_029, MP3_04EB, CHANNEL_6, COLOR_04_ORANGE) // "Time to reactivate those teleportals." - jog_to_pad(PAD_PAM_01C3) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x0f) - - label(0x6f) - label(0x2e) - unset_self_chrflag(CHRCFLAG_PUSHABLE) - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x10) - - label(0x06) - say_quip(CHR_BOND, 0x2c, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - show_hudmsg(CHR_BOND, L_PAM_030) // "Teleportals have been reactivated." - set_stage_flag(STAGEFLAG_TELEPORTALS_ACTIVATED) - set_self_chrflag(CHRCFLAG_PUSHABLE) - play_sound(SFX_8148, -1) - set_lights_state(0x003c, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_chr_chrflag(0x14, CHRCFLAG_00040000) - set_chr_chrflag(0x15, CHRCFLAG_00040000) - set_chr_chrflag(0x16, CHRCFLAG_00040000) - unset_chr_chrflag(0x14, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x15, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) - set_ailist(0x14, AILIST_TELEPORT_ACTIVATION_RESPONDER) - set_ailist(0x15, AILIST_TELEPORT_ACTIVATION_RESPONDER) - set_ailist(0x16, AILIST_TELEPORT_ACTIVATION_RESPONDER) - goto_first(0x03) - - label(0x60) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - endlist -}; - -u8 func0433_unused[] = { - beginloop(0x04) - set_target_chr(CHR_BOND) - if_nearly_in_targets_sight(30, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_nearly_in_targets_sight(30, /*goto*/ 0x06) - set_target_chr(CHR_ANTI) - if_nearly_in_targets_sight(30, /*goto*/ 0x06) - goto_next(0x2e) - - label(0x06) - endloop(0x04) - - label(0x2e) - unset_self_flag_bankx(CHRFLAG0_SURPRISABLE, BANK_0) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * This is also assigned to Elvis on PA, but in that case it's a general follow - * function because he can't enter the agent megaweapon room on PA. - */ -u8 func0404_elvis_follow_and_do_agent_megaweapon[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - unset_self_flag_bankx(CHRFLAG1_NOOP_00200000, BANK_1) - set_shotlist(AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Injured - label(0x2e) - say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x12) - - // Healthy - label(0x06) - if_stage_flag_eq(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_ELVIS_SAID_SABOTAGE, TRUE, /*goto*/ 0x5f) - label(0x2e) - if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - label(0x03) - set_target_chr(CHR_PRESET) - restart_timer - if_distance_to_target_gt(300, /*goto*/ 0x06) - try_jog_to_target(/*goto*/ 0x04) - label(0x06) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) - if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ 0x1d) - label(0x2e) - if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - goto_first(0x03) - - label(0x06) - stop_chr - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) - if_chr_in_room(CHR_ELVIS, 0x00, 0x006c, /*goto*/ 0x1d) - label(0x2e) - if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_gt(300, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - label(0x08) - call_rng - if_rand_lt(85, /*goto*/ 0x63) - if_rand_lt(170, /*goto*/ 0x64) - - say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - - label(0x63) - say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - - label(0x64) - say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - - label(0x2e) - set_shotlist(AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) - set_returnlist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // In Agent megaweapon room - label(0x1d) - speak(CHR_TARGET, L_PAM_028, MP3_04EC, CHANNEL_6, COLOR_04_ORANGE) // "It looks like this could benefit from a little bit..." - label(0x5f) - set_stage_flag(STAGEFLAG_ELVIS_SAID_SABOTAGE) - stop_chr - jog_to_pad(PAD_PAM_005F) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x0f) - - label(0x6f) - label(0x2e) - unset_self_chrflag(CHRCFLAG_PUSHABLE) - restart_timer - chr_do_animation(ANIM_OPERATE_0205, -1, -1, 0, 16, CHR_SELF, 2) - - beginloop(0x10) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x10) - - label(0x06) - say_quip(CHR_BOND, 0x2c, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - set_self_chrflag(CHRCFLAG_PUSHABLE) - show_hudmsg(CHR_BOND, L_PAM_020) // "Cetan megaweapon has been disabled." - set_stage_flag(STAGEFLAG_AGENT_MEGAWEAPON_DISABLED) - set_stage_flag(STAGEFLAG_MEGAWEAPON_DISABLED) - set_lights_state(0x006c, LIGHTOP_3, 0x64, 0xff, 0x78) - assign_sound(SFX_8148, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) - unlock_door(0xb7, 0x02) - unlock_door(0xb8, 0x02) - goto_first(0x03) - - label(0x60) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) - endlist -}; - -/** - * Seems to be a general follow function for Elvis. - * He does not engage in combat. - * - * @unused - */ -u8 func0405_elvis_follow_nocombat[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - unset_self_flag_bankx(CHRFLAG1_NOOP_00200000, BANK_1) - set_shotlist(0x0405) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Injured - label(0x2e) - say_quip(CHR_BOND, 0x29, 0xff, 0x03, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x12) - - label(0x06) - if_enemy_distance_lt_and_los(300, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - label(0x03) - set_target_chr(CHR_PRESET) - restart_timer - if_distance_to_target_gt(300, /*goto*/ 0x06) - try_jog_to_target(/*goto*/ 0x04) - label(0x06) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - label(0x2e) - if_enemy_distance_lt_and_los(300, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - goto_first(0x03) - - label(0x06) - stop_chr - - beginloop(0x09) - label(0x2e) - if_enemy_distance_lt_and_los(2000, /*goto*/ 0x08) - set_target_chr(CHR_PRESET) - if_distance_to_target_gt(300, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - // Detected enemy - label(0x08) - restart_timer - say_quip(CHR_BOND, 0x29, 0xff, 0x14, 0xff, BANK_1, 0x00, 0x00) - retreat(GOPOSFLAG_RUN, 1) - - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - goto_first(0x03) - - endlist -}; - -u8 func0406_elvis_follow_and_do_sa_megaweapon[] = { - set_shotlist(AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x5f) - - // Injured - label(0x2e) - say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x5f) - endloop(0x12) - - label(0x5f) - if_stage_flag_eq(STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON, TRUE, /*goto*/ 0x1b) - restart_timer - if_distance_to_target_lt(400, /*goto*/ 0x2e) - jog_to_pad(PAD_PAM_00B4) - goto_next(0x0f) - - label(0x2e) - label(0x1c) - run_to_pad(PAD_PAM_00B4) - - beginloop(0x0f) - if_timer_gt(300, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x0f) - - label(0x06) - goto_first(0x5f) - - label(0x2e) - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, 0x0115, /*goto*/ 0x97) - - beginloop(0x97) - if_timer_gt(60, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x97) - - label(0x06) - restart_timer - - label(0x1b) - set_stage_flag(STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON) - unset_self_chrflag(CHRCFLAG_PUSHABLE) - call_rng - if_rand_lt(86, /*goto*/ 0x63) - if_rand_lt(172, /*goto*/ 0x64) - - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x11) - - label(0x63) - chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x11) - - label(0x64) - chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 16, CHR_SELF, 2) - goto_next(0x11) - - beginloop(0x11) - if_chr_idle(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_timer_gt(3600, /*goto*/ 0x2e) - endloop(0x11) - - label(0x06) - goto_first(0x1b) - - label(0x2e) - say_quip(CHR_BOND, 0x2c, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - set_self_chrflag(CHRCFLAG_PUSHABLE) - show_hudmsg(CHR_BOND, L_PAM_020) // "Cetan megaweapon has been disabled." - set_stage_flag(STAGEFLAG_MEGAWEAPON_DISABLED) - try_equip_weapon(MODEL_CHRMAIANPISTOL, WEAPON_PHOENIX, 0x00000000, /*goto*/ 0x04) - label(0x04) - set_ailist(CHR_SELF, AILIST_ELVIS_GO_TO_SA_TELEPORT) - goto_first(0x03) - - label(0x60) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON) - endlist -}; - -u8 func0407_elvis_go_to_sa_teleport[] = { - set_shotlist(AILIST_ELVIS_GO_TO_SA_TELEPORT) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x5f) - - // Injured - label(0x2e) - say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x12) - - label(0x06) - set_target_chr(CHR_PRESET) - label(0x5f) - restart_timer - if_distance_to_target_lt(1400, /*goto*/ 0x2e) - jog_to_pad(PAD_PAM_00C0) - goto_next(0x0f) - - label(0x2e) - run_to_pad(PAD_PAM_00C0) - - beginloop(0x0f) - if_enemy_distance_lt_and_los(800, /*goto*/ 0x08) - if_timer_gt(300, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x0f) - - label(0x06) - goto_first(0x5f) - - label(0x2e) - stop_chr - - beginloop(0x10) - if_enemy_distance_lt_and_los(800, /*goto*/ 0x08) - endloop(0x10) - - label(0x06) - restart_timer - label(0x08) - call_rng - if_rand_lt(85, /*goto*/ 0x63) - if_rand_lt(170, /*goto*/ 0x64) - say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - - label(0x63) - say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - - label(0x64) - say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - label(0x2e) - set_shotlist(AILIST_ELVIS_GO_TO_SA_TELEPORT) - set_returnlist(CHR_SELF, AILIST_ELVIS_GO_TO_SA_TELEPORT) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func0403_elvis_give_farsight[] = { - set_shotlist(AILIST_ELVIS_GIVE_FARSIGHT) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Injured - label(0x2e) - say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x12) - - // Healthy - label(0x06) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - - label(0x03) - set_target_chr(CHR_PRESET) - restart_timer - if_distance_to_target_gt(300, /*goto*/ 0x06) - try_jog_to_target(/*goto*/ 0x04) - label(0x06) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - set_target_chr(CHR_PRESET) - if_distance_to_target_lt(200, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - goto_first(0x03) - - label(0x06) - stop_chr - label(0x09) - do_preset_animation(PRESETANIM_TALK5) - speak(CHR_TARGET, L_PAM_018, MP3_02EA, CHANNEL_6, COLOR_04_ORANGE) // "Here, take this gun and keep those Skedar off my b..." - give_object_to_chr(0x73, CHR_TARGET) - yield - set_stage_flag(STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING) - - beginloop(0x0a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2e) - endloop(0x0a) - - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - - // PA - unset_self_flag_bankx(CHRFLAG1_NOOP_00200000, BANK_1) - yield - try_equip_weapon(MODEL_CHRMAIANPISTOL, WEAPON_PHOENIX, 0x00000000, /*goto*/ 0x2f) - label(0x2f) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) - - // SA - label(0x06) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_SA_MEGAWEAPON) - - // Agent - label(0x2e) - yield - try_equip_weapon(MODEL_CHRMAIANPISTOL, WEAPON_PHOENIX, 0x00000000, /*goto*/ 0x2e) - label(0x2e) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW_AND_DO_AGENT_MEGAWEAPON) - endlist -}; - -u8 func1003_powernode1[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_POWERNODE1, /*goto*/ 0x2e) - if_door_state(0x03, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - open_door(0x03) - endloop(0x04) - - label(0x2e) - if_object_health_lt(OBJ_POWERNODE1, 250, /*goto*/ 0x2e) - set_object_health(OBJ_POWERNODE1, 0) - set_object_flag(OBJ_POWERNODE1, OBJFLAG_INVINCIBLE) - open_door(0x03) - set_object_flag(0x03, OBJFLAG_DOOR_KEEPOPEN) - goto_first(0x04) - - label(0x2e) - goto_first(0x04) - endlist -}; - -u8 func1004_powernode2[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_POWERNODE2, /*goto*/ 0x2e) - if_door_state(0x04, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - open_door(0x04) - endloop(0x04) - - label(0x2e) - if_object_health_lt(OBJ_POWERNODE2, 250, /*goto*/ 0x2e) - set_object_health(OBJ_POWERNODE2, 0) - set_object_flag(OBJ_POWERNODE2, OBJFLAG_INVINCIBLE) - open_door(0x04) - set_object_flag(0x04, OBJFLAG_DOOR_KEEPOPEN) - goto_first(0x04) - - label(0x2e) - goto_first(0x04) - endlist -}; - -u8 func1005_powernode3[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_POWERNODE3, /*goto*/ 0x2e) - if_door_state(0x05, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - open_door(0x05) - endloop(0x04) - - label(0x2e) - if_object_health_lt(OBJ_POWERNODE3, 250, /*goto*/ 0x2e) - set_object_flag(OBJ_POWERNODE3, OBJFLAG_INVINCIBLE) - set_object_health(OBJ_POWERNODE3, 0) - open_door(0x05) - set_object_flag(0x05, OBJFLAG_DOOR_KEEPOPEN) - goto_first(0x04) - - label(0x2e) - goto_first(0x04) - endlist -}; - -u8 func0c01_midcutscene[] = { - remove_weapon_from_inventory(WEAPON_BACKUPDISK) - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 15) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - play_cutscene_track(MUSIC_DEEPSEA_MIDCUTSCENE) - camera_movement(ANIM_CUT_PAM_MID_CAM) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_MID_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_MID_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - set_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_MID_DRC, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 4) - enable_object(0xbb) - set_object_flag2(0xbb, OBJFLAG2_04000000) - set_object_flag3(0xbb, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_PAM_MID_CARD, 0xbb, 0x04, 0xffff) - restart_timer - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_P1P2, WEAPON_NONE, WEAPON_NONE) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - show_nonessential_chrs(FALSE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x57) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - #define wait_until_with_images(time, loopid, image1, image2) \ - beginloop(loopid) \ - set_drcaroll_images(CHR_DRCAROLL, image1, image2) \ - if_controller_button_pressed(/*goto*/ 0x57) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(114, 0x63) - speak(CHR_BOND, L_PAM_035, MP3_046D, CHANNEL_10, COLOR_09_BLUE) // "Here goes. I just hope dataDyne haven't done anyth..." - - wait_until(300, 0x64) - play_sound(SFX_0171, CHANNEL_2) - - wait_until(378, 0x65) - play_sound(SFX_04FC, CHANNEL_3) - - wait_until(408, 0x6a) - play_sound(SFX_0423, CHANNEL_5) - - wait_until(440, 0x1a) - play_sound(SFX_04F7, CHANNEL_10) - - wait_until(490, 0x6b) - speak(CHR_BOND, L_PAM_036, MP3_046E, CHANNEL_10, COLOR_04_ORANGE) // "Virus detected." - - wait_until(570, 0x69) - - label(0x6c) - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_X) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_X, DRCAROLLIMAGE_EYESFROWNING) - yield - if_controller_button_pressed(/*goto*/ 0x57) - if_timer_gt(600, /*goto*/ 0x06) - goto_first(0x6c) - - label(0x06) - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_EYESFROWNING) - speak(CHR_BOND, L_PAM_037, MP3_046F, CHANNEL_10, COLOR_09_BLUE) // "Me and my big mouth." - - wait_until(700, 0x6d) - play_sound(SFX_0172, CHANNEL_6) - - wait_until(712, 0x6f) - play_sound(SFX_04F8, CHANNEL_2) - - wait_until(716, 0x70) - play_sound(SFX_0127, CHANNEL_3) - - label(0x71) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_RANDOM25, DRCAROLLIMAGE_RANDOM25) - if_controller_button_pressed(/*goto*/ 0x57) - if_timer_gt(742, /*goto*/ 0x06) - goto_first(0x71) - - label(0x06) - speak(CHR_BOND, L_PAM_038, MP3_0470, CHANNEL_10, COLOR_04_ORANGE) // "Commencing countermeasures. Commenc..... *** ooOOo..." - - wait_until_with_images(746, 0x73, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0128, CHANNEL_5) - - wait_until_with_images(760, 0x75, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(764, 0x76, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESFROWNING) - play_sound(SFX_0173, CHANNEL_2) - - wait_until_with_images(784, 0x79, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0174, CHANNEL_5) - - wait_until_with_images(808, 0x7c, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESFROWNING) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(872, 0x81, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_04FA, CHANNEL_7) - - wait_until_with_images(886, 0x83, 0x00, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0129, CHANNEL_3) - - wait_until_with_images(894, 0x85, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESFROWNING) - play_sound(SFX_012A, CHANNEL_5) - label(0x86) - - wait_until_with_images(914, 0x87, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(980, 0x8b, 0x00, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(992, 0x8e, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_04F9, CHANNEL_2) - - wait_until_with_images(1012, 0x90, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_012B, CHANNEL_4) - - wait_until_with_images(1018, 0x91, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1026, 0x93, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0129, CHANNEL_7) - - wait_until_with_images(1034, 0x94, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_0176, CHANNEL_2) - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - - wait_until_with_images(1036, 0x95, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1068, 0x98, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_0177, CHANNEL_6) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1074, 0x99, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1090, 0xfc, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1112, 0x9e, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0127, CHANNEL_6) - - wait_until_with_images(1124, 0xa0, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_04F7, CHANNEL_2) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1130, 0xa1, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_CAMSPY_SHUTTER, CHANNEL_3) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1188, 0xa7, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1238, 0xaa, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_04F7, CHANNEL_6) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1304, 0xb2, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0129, CHANNEL_2) - - wait_until_with_images(1308, 0xb3, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0178, CHANNEL_3) - - wait_until_with_images(1354, 0xba, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_04F7, CHANNEL_4) - - wait_until_with_images(1406, 0xc5, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1468, 0xcd, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_012B, CHANNEL_5) - - wait_until_with_images(1480, 0xcf, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - play_sound(SFX_0173, CHANNEL_6) - - wait_until_with_images(1487, 0xd0, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_04F9, CHANNEL_2) - emit_sparks(CHR_DRCAROLL) - - wait_until_with_images(1494, 0xd1, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - play_sound(SFX_0171, CHANNEL_3) - - wait_until_with_images(1500, 0xd4, DRCAROLLIMAGE_RANDOM, DRCAROLLIMAGE_EYESDEFAULT) - speak(CHR_BOND, L_PAM_039, MP3_0471, CHANNEL_10, COLOR_09_BLUE) // "Dr. Caroll? Are you in control again? Can you stop..." - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - - wait_until(1534, 0xd6) - play_sound(SFX_04F9, CHANNEL_6) - - wait_until(1564, 0xda) - play_sound(SFX_0178, CHANNEL_5) - - wait_until(1630, 0xe0) - play_sound(SFX_0175, CHANNEL_5) - - wait_until(1810, 0xe3) - speak(CHR_BOND, L_PAM_040, MP3_0472, CHANNEL_10, COLOR_04_ORANGE) // "Yes, I'm back again, my dear. But the program has ..." - - wait_until(1810, 0xe5) - play_sound(SFX_0177, CHANNEL_3) - - wait_until(1886, 0xe7) - play_sound(SFX_0175, CHANNEL_5) - - wait_until(2378, 0xe9) - mute_channel(CHANNEL_7) - speak(CHR_BOND, L_PAM_041, MP3_0473, CHANNEL_10, COLOR_09_BLUE) // "What do you mean?" - - wait_until(2510, 0xea) - speak(CHR_BOND, L_PAM_042, MP3_0474, CHANNEL_10, COLOR_04_ORANGE) // "When the program has run, I will have control of a..." - - wait_until(3126, 0xf5) - play_sound(SFX_012B, CHANNEL_5) - - wait_until(3156, 0xf6) - emit_sparks(CHR_DRCAROLL) - - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - - wait_until(3266, 0xf7) - emit_sparks(CHR_DRCAROLL) - - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - - wait_until(3556, 0xf8) - - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - emit_sparks(CHR_DRCAROLL) - - wait_until(3606, 0xf9) - emit_sparks(CHR_DRCAROLL) - - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - - wait_until(3985, 0x10) - play_sound(SFX_0424, CHANNEL_1) - - wait_until(4046, 0xfa) - emit_sparks(CHR_DRCAROLL) - - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_RANDOM) - yield - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESDEFAULT, DRCAROLLIMAGE_EYESDEFAULT) - - wait_until(4106, 0xfb) - emit_sparks(CHR_DRCAROLL) - - label(0x11) - yield - if_controller_button_pressed(/*goto*/ 0x57) - if_timer_gt(4250, /*goto*/ 0x06) - mute_channel(CHANNEL_1) - goto_first(0x11) - - label(0x06) - fade_to_color(0x000000ff, 250) - - wait_until(4500, 0x12) - play_sound(SFX_012B, CHANNEL_5) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x57) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x57) - label(0x2e) - endloop(0x08) - - label(0x57) - mute_channel(CHANNEL_10) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_3) - mute_channel(CHANNEL_2) - mute_channel(CHANNEL_1) - mute_channel(CHANNEL_0) - fade_to_color(0xffffffff, 0) - fade_to_color(0x00000000, 15) - disable_object(0xbb) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_MID_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 2) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_MID_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) - unset_chr_chrflag(CHR_DRCAROLL, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_DRCAROLL, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_MID_DRC, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_DRCAROLL, 2) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS, WEAPON_PHOENIX, WEAPON_NONE) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - yield - chr_move_to_pad(CHR_ELVIS, PAD_PAM_0013, 0x01, /*goto*/ 0x2e) - label(0x2e) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_move_to_pad(CHR_BOND, PAD_PAM_019F, 0x01, /*goto*/ 0x2e) - label(0x2e) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - stop_cutscene_track - stop_ambient_track - play_x_track(XREASON_DEFAULT, 10, 60) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_0017, 0x01, /*goto*/ 0x2e) - label(0x2e) - remove_weapon_from_inventory(WEAPON_BACKUPDISK) - set_ailist(CHR_ELVIS, AILIST_ELVIS_WARP_TO_OUTSIDE_DRCAROLL) - show_nonessential_chrs(TRUE) - set_stage_flag(STAGEFLAG_MIDCUTSCENE_FINISHED) - set_ailist(CHR_SELF, GAILIST_END_CINEMA) - endlist -}; - -u8 func042d_elvis_warp_to_outside_drcaroll[] = { - stop_chr - - beginloop(0x04) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_0017, 0x01, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - stop_chr - set_ailist(CHR_SELF, AILIST_ELVIS_RUN_TO_EXIT) - endlist -}; - -u8 func0c02_outro[] = { - show_nonessential_chrs(FALSE) - hide_countdown_timer - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_DEEPSEA_OUTRO) - camera_movement(ANIM_CUT_PAM_OUTRO_CAM) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - restart_timer - - // @bug: Missing button checks makes the outro unskippable until a certain - // point. - #define blow_mine1(time, loopid, msg, mine, pad) \ - beginloop(loopid) \ - if_timer_gt(time, /*goto*/ 0x2e) \ - endloop(loopid) \ - label(0x2e) \ - enable_object(mine) \ - yield \ - move_object_to_pad(mine, pad) \ - yield \ - destroy_object(mine) - - #define blow_mine2(time, loopid, msg1, msg2, mine, pad) \ - beginloop(loopid) \ - if_timer_gt(time, /*goto*/ 0x2e) \ - endloop(loopid) \ - label(0x2e) \ - enable_object(mine) \ - yield \ - move_object_to_pad(mine, pad) \ - yield \ - destroy_object(mine) - - blow_mine1(40, 0x63, '1', 0x76, 0x028c) - blow_mine1(72, 0x64, '2', 0x77, 0x028b) - blow_mine1(155, 0x65, '3', 0x78, 0x028a) - blow_mine1(176, 0x66, '4', 0x79, 0x0289) - blow_mine1(194, 0x6a, '5', 0x7a, 0x0288) - blow_mine1(252, 0x6b, '6', 0x7b, 0x0287) - blow_mine1(300, 0x6c, '7', 0x7c, 0x0286) - blow_mine1(331, 0x6d, '8', 0x7d, 0x0285) - blow_mine1(355, 0x6e, '9', 0x7e, 0x0284) - blow_mine2(411, 0x6f, '1','0', 0x7f, 0x0283) - blow_mine2(441, 0x70, '1','1', 0x80, 0x0282) - blow_mine2(485, 0x71, '1','2', 0x81, 0x0281) - blow_mine2(543, 0x72, '1','3', 0x82, 0x0280) - blow_mine2(594, 0x73, '1','4', 0x83, 0x027f) - blow_mine2(607, 0x74, '1','5', 0x84, 0x027e) - blow_mine2(629, 0x75, '1','6', 0x85, 0x027d) - blow_mine2(671, 0x76, '1','7', 0x86, 0x027c) - blow_mine2(720, 0x77, '1','8', 0x87, 0x027b) - blow_mine2(776, 0x78, '1','9', 0x88, 0x027a) - blow_mine2(865, 0x79, '2','0', 0x89, 0x0279) - blow_mine2(914, 0x7a, '2','1', 0x8a, 0x0278) - blow_mine2(991, 0x7b, '2','2', 0x8b, 0x0277) - - beginloop(0x7c) - if_timer_gt(1011, /*goto*/ 0x2e) - endloop(0x7c) - - label(0x2e) - - blow_mine2(1038, 0x7d, '2','4', 0x8d, 0x0275) - blow_mine2(1071, 0x7e, '2','5', 0x8e, 0x0274) - blow_mine2(1090, 0x7f, '2','6', 0x8f, 0x0273) - blow_mine2(1110, 0x80, '2','7', 0x90, 0x0272) - blow_mine2(1137, 0x81, '2','8', 0x91, 0x0271) - - wait_until(1150, 0x8e) - open_door(0xb3) - open_door(0xb4) - open_door(0xb5) - open_door(0xb6) - - blow_mine2(1191, 0x82, '2','9', 0x92, 0x0270) - blow_mine2(1214, 0x83, '3','0', 0x93, 0x026f) - blow_mine2(1266, 0x84, '3','1', 0x94, 0x026e) - blow_mine2(1285, 0x85, '3','2', 0x95, 0x026d) - blow_mine2(1296, 0x86, '3','3', 0x96, 0x026c) - blow_mine2(1320, 0x87, '3','4', 0x97, 0x026b) - - wait_until(1355, 0x8f) - close_door(0xb5) - close_door(0xb6) - - blow_mine2(1360, 0x88, '3','5', 0x98, 0x026a) - blow_mine2(1390, 0x89, '3','6', 0x99, 0x0269) - blow_mine2(1412, 0x8a, '3','7', 0x9a, 0x0268) - - wait_until(1416, 0x90) - close_door(0xb3) - close_door(0xb4) - - blow_mine2(1424, 0x8b, '3','8', 0x9b, 0x0267) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x57) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x57) - label(0x2e) - endloop(0x08) - - label(0x57) - if_all_objectives_complete(/*goto*/ 0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_INVINCIBLE) - explosions_around_chr(CHR_BOND) - label(0x2e) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) - enter_firstperson - grant_control(CHR_BOND) - restart_timer - - beginloop(0x0d) - if_timer_gt(120, /*goto*/ 0x2f) - endloop(0x0d) - - label(0x2f) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) - explosions_around_chr(CHR_COOP) - label(0x2e) - - beginloop(0x0e) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2e) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_intro[] = { - set_drcaroll_images(CHR_DRCAROLL, DRCAROLLIMAGE_EYESFROWNING, DRCAROLLIMAGE_EYESFROWNING) - chr_draw_weapon_in_cutscene(CHR_BOND, WEAPON_FALCON2_SCOPE) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_DEEPSEA_INTRO) - camera_movement(ANIM_CUT_PAM_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_INTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - set_object_flag(0x07, OBJFLAG_DEACTIVATED) - set_object_flag2(0x07, OBJFLAG2_04000000) - set_object_flag3(0x07, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_PAM_INTRO_LIFT, 0x07, 0x04, 0xffff) - set_chr_chrflag(0x40, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x40, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x40, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_INTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x40, 4) - restart_timer - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - - wait_until(0, 0x63) - play_sound_from_object2(CHANNEL_5, 0x07, SFX_DOOR_81AA, 0x00, 0x00) - - wait_until(260, 0x8a) - play_sound(SFX_FOOTSTEP_80D5, CHANNEL_10) - - wait_until(280, 0x8b) - play_sound(SFX_FOOTSTEP_80D4, CHANNEL_10) - - wait_until(300, 0x89) - play_sound(SFX_CLOAK_ON, CHANNEL_7) - set_chr_hiddenflag(0x40, CHRHFLAG_CLOAKED) - play_sound(SFX_FOOTSTEP_80D7, CHANNEL_10) - - wait_until(320, 0x8c) - play_sound(SFX_FOOTSTEP_80D6, CHANNEL_10) - - wait_until(852, 0x64) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(1210, 0x65) - speak(CHR_BOND, L_PAM_031, MP3_0469, CHANNEL_10, COLOR_04_ORANGE) // "This doesn't seem normal. No one's around." - - wait_until(1266, 0x66) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(1300, 0x6a) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(1430, 0x6b) - mute_channel(CHANNEL_5) - play_sound_from_object2(CHANNEL_5, 0x07, SFX_81A9, 0x00, 0x00) - - wait_until(1522, 0x6c) - speak(CHR_BOND, L_PAM_032, MP3_046A, CHANNEL_10, COLOR_09_BLUE) // "No signs of conflict. No spent ammo cases or bulle..." - - wait_until(1548, 0x6d) - play_sound(SFX_0174, CHANNEL_7) - - wait_until(1594, 0x6e) - play_sound(SFX_0175, CHANNEL_7) - - wait_until(1662, 0x6f) - play_sound(SFX_0176, CHANNEL_7) - - wait_until(1762, 0x70) - play_sound(SFX_0177, CHANNEL_7) - - wait_until(1945, 0x71) - speak(CHR_BOND, L_PAM_033, MP3_046B, CHANNEL_10, COLOR_04_ORANGE) // "But there ought to be a rear guard at least. It ma..." - - wait_until(1958, 0x72) - play_sound(SFX_0178, CHANNEL_7) - - wait_until(2066, 0x73) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(2118, 0x74) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(2167, 0x75) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(2213, 0x76) - play_sound(SFX_0174, CHANNEL_7) - - wait_until(2346, 0x77) - play_sound(SFX_0175, CHANNEL_7) - - wait_until(2362, 0x78) - play_sound(SFX_0176, CHANNEL_7) - - wait_until(2376, 0x79) - play_sound(SFX_0177, CHANNEL_7) - - wait_until(2390, 0x7a) - play_sound(SFX_0178, CHANNEL_7) - - wait_until(2420, 0x7b) - speak(CHR_BOND, L_PAM_034, MP3_046C, CHANNEL_10, COLOR_09_BLUE) // "There has to be someone farther inside. Cover me." - - wait_until(2426, 0x7c) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(2470, 0x7d) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(2485, 0x7e) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(2520, 0x7f) - play_sound(SFX_0174, CHANNEL_7) - - wait_until(2545, 0x80) - play_sound(SFX_0175, CHANNEL_7) - - wait_until(2582, 0x81) - play_sound(SFX_0171, CHANNEL_7) - - wait_until(2585, 0x82) - play_sound(SFX_0176, CHANNEL_6) - - wait_until(2720, 0x83) - play_sound(SFX_0172, CHANNEL_7) - - wait_until(2842, 0x84) - play_sound(SFX_0173, CHANNEL_7) - - wait_until(2880, 0x85) - play_sound(SFX_0174, CHANNEL_7) - - wait_until(2898, 0x86) - play_sound(SFX_0175, CHANNEL_7) - - wait_until(3040, 0x87) - play_sound(SFX_0176, CHANNEL_7) - - wait_until(3042, 0x88) - play_sound(SFX_0177, CHANNEL_6) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2e) - goto_next(0x57) - - label(0x2e) - if_controller_button_pressed(/*goto*/ 0x57) - label(0x2e) - endloop(0x08) - - label(0x57) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_10) - remove_chr(0x40) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PAM_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) - if_coop_mode(/*goto*/ 0x45) - unset_object_flag(0x07, OBJFLAG_DEACTIVATED) - unset_object_flag2(0x07, OBJFLAG2_04000000) - set_object_flag3(0x07, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_PAM_INTRO_LIFT, 0x07, 0x01, 0xfffe) - goto_next(0x46) - - label(0x45) - disable_object(0x07) - label(0x46) - stop_cutscene_track - stop_ambient_track - label(0x0d) - enter_firstperson - yield - set_ailist(CHR_ELVIS, AILIST_INIT_ELVIS) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042f_init_pelagic_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(20) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 70) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0430_unused[] = { - set_accuracy(20) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(70) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1006_msg_thiswillhelpus[] = { - beginloop(0x04) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) - if_objective_complete(0, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x08) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) - if_timer_gt(180, /*goto*/ 0x2e) - endloop(0x08) - - label(0x2e) - speak(CHR_P1P2, L_PAM_010, MP3_03D4, CHANNEL_6, COLOR_04_ORANGE) // "This will help us to get round the ship quicker." - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_msg_antibodymasking[] = { - restart_timer - - beginloop(0x04) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) - endloop(0x04) - - // Unreachable - label(0x2e) - speak(CHR_BOND, L_PAM_011, MP3_03D5, CHANNEL_6, COLOR_09_BLUE) // "This antibody masking will protect us from the aut..." - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_msg_theresdrcaroll[] = { - beginloop(0x04) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) - - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x0d) - - if_door_state(0xae, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_chr_in_room(CHR_ELVIS, 0x00, 0x004c, /*goto*/ 0x2e) - goto_next(0x0d) - - label(0x2e) - if_chr_not_talking(CHR_ELVIS, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - speak(CHR_BOND, L_PAM_012, MP3_03D6, CHANNEL_6, COLOR_04_ORANGE) // "There's Dr. Caroll. Let's see if we can reverse wh..." - - // Elvis dead, Dr Caroll dead, or Elvis didn't get teleported - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_msg_getoutofhere[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x08) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) - if_timer_gt(120, /*goto*/ 0x2e) - endloop(0x08) - - label(0x2e) - speak(CHR_BOND, L_PAM_013, MP3_03D7, CHANNEL_6, COLOR_04_ORANGE) // "We have to get out of here!" - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Entry point for all of Joanna's teleports. - * - * Map of how these ailists call each other: - * - * 100a func100a_bond_teleports - * - calls 0414 teleport_bond_to_sapa - * - calls 0416 teleport_bond_to_a_pa_drcaroll - * - calls 0415 teleport_bond_to_drcaroll - * - calls 0415 teleport_bond_to_drcaroll - */ -u8 func100a_bond_teleports[] = { - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x04) - endloop(0x1f) - - beginloop(0x04) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_STARTAREA_TELEPORT, /*goto*/ 0x59) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x09) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_DONE_FIRST_TELEPORT, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - // Done first teleport - label(0x2e) - if_difficulty_gt(DIFF_A, /*goto*/ 0x2e) - goto_first(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - goto_first(0x04) - - // Done first teleport and difficulty is SA - label(0x2e) - set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - if_objective_complete(1, /*goto*/ 0x2e) - goto_first(0x04) - - // Done first teleport, difficult is SA and megaweapon is disabled - label(0x2e) - unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - goto_first(0x04) - - // - // At start area teleport - // - label(0x59) - set_stage_flag(STAGEFLAG_DONE_FIRST_TELEPORT) - revoke_control(CHR_BOND, 0) - teleport_to_pad(PAD_STARTAREA_TELEPORT, CHR_BOND) - - label(0x5b) - if_teleport_full_white(/*goto*/ 0x5e, CHR_BOND) - yield - goto_first(0x5b) - - label(0x5e) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x64) - set_ailist(CHR_BOND, AILIST_TELEPORT_BOND_TO_SAPA) - unset_stage_flag(STAGEFLAG_TELEPORT_DONE) - - beginloop(0x31) - if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) - endloop(0x31) - - label(0x2e) - grant_control(CHR_BOND) - teleport_to_pad(PAD_PAM_0000, CHR_BOND) - goto_first(0x04) - - // - // At SA/PA area teleport - // - beginloop(0x09) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - if_objective_complete(1, /*goto*/ 0x2e) - reloop(0x09) - - // Teleport is active - label(0x2e) - unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x59) - endloop(0x09) - - label(0x59) - teleport_to_pad(PAD_PAM_00C0, CHR_BOND) - revoke_control(CHR_BOND, 0) - - label(0x5c) - if_teleport_full_white(/*goto*/ 0x5e, CHR_BOND) - yield - goto_first(0x5c) - - label(0x5e) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x64) - goto_next(0x2e) - - // - // At start area teleport on Agent, or SA/PA area teleport on SA - // - label(0x64) - goto_next(0x2e) - - label(0x2e) - set_ailist(CHR_BOND, AILIST_TELEPORT_BOND_TO_A_PA_DRCAROLL) - unset_stage_flag(STAGEFLAG_TELEPORT_DONE) - - beginloop(0x32) - if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) - endloop(0x32) - - label(0x2e) - grant_control(CHR_BOND) - teleport_to_pad(PAD_PAM_0000, CHR_BOND) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - label(0x06) - goto_first(0x04) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // - // At Agent or PA teleport - // - beginloop(0x08) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x59) - if_chr_distance_to_pad_lt(CHR_BOND, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x5a) - endloop(0x08) - - // Agent teleport - label(0x59) - revoke_control(CHR_BOND, 0) - teleport_to_pad(PAD_PAM_0054, CHR_BOND) - goto_next(0x5d) - - // PA teleport - label(0x5a) - revoke_control(CHR_BOND, 0) - teleport_to_pad(PAD_PAM_0111, CHR_BOND) - - label(0x5d) - if_teleport_full_white(/*goto*/ 0x5e, CHR_BOND) - yield - goto_first(0x5d) - - label(0x5e) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - set_ailist(CHR_BOND, AILIST_TELEPORT_BOND_TO_DRCAROLL) - unset_stage_flag(STAGEFLAG_TELEPORT_DONE) - - beginloop(0x33) - if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) - endloop(0x33) - - label(0x2e) - grant_control(CHR_BOND) - teleport_to_pad(PAD_PAM_0000, CHR_BOND) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0414_teleport_bond_to_sapa[] = { - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - - label(0x08) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) - - beginloop(0x63) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01C6, 0x01, /*goto*/ 0x06) - endloop(0x63) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - label(0x62) - - beginloop(0x64) - chr_move_to_pad(CHR_SELF, PAD_SAPAAREA_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x64) - - label(0x06) - yield - stop_chr - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) - label(0x62) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_teleport_bond_to_drcaroll[] = { - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - - beginloop(0x65) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BF, 0x01, /*goto*/ 0x06) - endloop(0x65) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - goto_next(0x63) - label(0x07) - show_hudmsg(CHR_BOND, L_PAM_014) // "Elvis has been killed." - - label(0x62) - - beginloop(0x63) - chr_move_to_pad(CHR_SELF, PAD_DRCAROLLROOM_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x63) - - label(0x06) - stop_chr - yield - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - - label(0x62) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * If Agent: Warp to Agent area - * If SA: Warp to Dr Caroll Area - * If PA: Warp to PA area - */ -u8 func0416_teleport_bond_to_a_pa_drcaroll[] = { - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - - label(0x62) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) - - // PA - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - - beginloop(0x66) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BE, 0x01, /*goto*/ 0x06) - endloop(0x66) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - label(0x62) - label(0x07) - - beginloop(0x67) - chr_move_to_pad(CHR_SELF, PAD_PAAREA_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x67) - - label(0x06) - label(0x2e) - stop_chr - yield - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - - label(0x62) - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA - label(0x08) - set_ailist(CHR_SELF, AILIST_TELEPORT_BOND_TO_DRCAROLL) - - // Agent - label(0x09) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - - beginloop(0x6b) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_0040, 0x01, /*goto*/ 0x06) - endloop(0x6b) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - label(0x62) - label(0x07) - - beginloop(0x68) - chr_move_to_pad(CHR_SELF, PAD_AGENTAREA_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x68) - - label(0x06) - label(0x2e) - stop_chr - yield - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, FALSE, /*goto*/ 0x61) - if_chr_deadish(CHR_COOP, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) - label(0x62) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Entry point for all of Velvet's teleports. - * - * Map of how these ailists call each other: - * - * 100b func100b_coop_teleports - * - calls 0417 teleport_coop_to_sapa - * - calls 0419 teleport_coop_to_a_pa_drcaroll - * - calls 0418 teleport_coop_to_drcaroll - * - calls 0418 teleport_coop_to_drcaroll - */ -u8 func100b_coop_teleports[] = { - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) - goto_next(0x1f) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x1f) - if_stage_flag_eq(STAGEFLAG_TELEPORTALS_ACTIVATED, TRUE, /*goto*/ 0x04) - endloop(0x1f) - - beginloop(0x04) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_STARTAREA_TELEPORT, /*goto*/ 0x59) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x09) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x08) - endloop(0x04) - - // - // At start area teleport - // - label(0x59) - revoke_control(CHR_COOP, 0) - teleport_to_pad(PAD_STARTAREA_TELEPORT, CHR_COOP) - - label(0x5b) - if_teleport_full_white(/*goto*/ 0x5e, CHR_COOP) - yield - goto_first(0x5b) - - label(0x5e) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - label(0x62) - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x64) - set_ailist(CHR_COOP, AILIST_TELEPORT_COOP_TO_SAPA) - unset_stage_flag(STAGEFLAG_TELEPORT_DONE) - - beginloop(0x31) - if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) - endloop(0x31) - - label(0x2e) - grant_control(CHR_COOP) - teleport_to_pad(PAD_PAM_0000, CHR_COOP) - goto_first(0x04) - - // - // At SA/PA area teleport - // - beginloop(0x09) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2e) - set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - if_objective_complete(1, /*goto*/ 0x2e) - reloop(0x09) - - label(0x2e) - unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_SAPAAREA_TELEPORT, /*goto*/ 0x59) - endloop(0x09) - - label(0x59) - teleport_to_pad(PAD_PAM_00C0, CHR_COOP) - revoke_control(CHR_COOP, 0) - - label(0x5c) - if_teleport_full_white(/*goto*/ 0x5e, CHR_COOP) - yield - goto_first(0x5c) - - label(0x5e) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - label(0x62) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x64) - goto_next(0x2e) - - label(0x64) - goto_next(0x2e) - - label(0x2e) - set_ailist(CHR_COOP, AILIST_TELEPORT_COOP_TO_A_PA_DRCAROLL) - unset_stage_flag(STAGEFLAG_TELEPORT_DONE) - - beginloop(0x32) - if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) - endloop(0x32) - - label(0x2e) - grant_control(CHR_COOP) - teleport_to_pad(PAD_PAM_0000, CHR_COOP) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - label(0x06) - goto_first(0x04) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // - // At Agent or PA area teleport - // - beginloop(0x08) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_AGENTAREA_TELEPORT, /*goto*/ 0x59) - if_chr_distance_to_pad_lt(CHR_COOP, 250, PAD_PAAREA_TELEPORT, /*goto*/ 0x5a) - endloop(0x08) - - // Agent teleport - label(0x59) - revoke_control(CHR_COOP, 0) - teleport_to_pad(PAD_PAM_0054, CHR_COOP) - goto_next(0x5d) - - // PA teleport - label(0x5a) - revoke_control(CHR_COOP, 0) - teleport_to_pad(PAD_PAM_0111, CHR_COOP) - - label(0x5d) - if_teleport_full_white(/*goto*/ 0x5e, CHR_COOP) - yield - goto_first(0x5d) - - label(0x5e) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - label(0x62) - set_ailist(CHR_COOP, AILIST_TELEPORT_COOP_TO_DRCAROLL) - unset_stage_flag(STAGEFLAG_TELEPORT_DONE) - - beginloop(0x33) - if_stage_flag_eq(STAGEFLAG_TELEPORT_DONE, TRUE, /*goto*/ 0x2e) - endloop(0x33) - - label(0x2e) - grant_control(CHR_COOP) - teleport_to_pad(PAD_PAM_0000, CHR_COOP) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0417_teleport_coop_to_sapa[] = { - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - - label(0x08) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) - - beginloop(0x63) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01C6, 0x01, /*goto*/ 0x06) - endloop(0x63) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - label(0x62) - - beginloop(0x64) - chr_move_to_pad(CHR_SELF, PAD_SAPAAREA_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x64) - - label(0x06) - yield - stop_chr - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) - - label(0x62) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0418_teleport_coop_to_drcaroll[] = { - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - - beginloop(0x65) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BF, 0x01, /*goto*/ 0x06) - endloop(0x65) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - goto_next(0x63) - - label(0x07) - show_hudmsg(CHR_BOND, L_PAM_014) // "Elvis has been killed." - label(0x62) - - beginloop(0x63) - chr_move_to_pad(CHR_SELF, PAD_DRCAROLLROOM_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x63) - - label(0x06) - stop_chr - yield - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - label(0x62) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * If Agent: Warp to Agent area - * If SA: Warp to Dr Caroll Area - * If PA: Warp to PA area - */ -u8 func0419_teleport_coop_to_a_pa_drcaroll[] = { - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_STOP) - label(0x62) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x09) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) - - // PA - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - - beginloop(0x66) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BE, 0x01, /*goto*/ 0x06) - endloop(0x66) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - label(0x62) - label(0x07) - - beginloop(0x67) - chr_move_to_pad(CHR_SELF, PAD_PAAREA_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x67) - - label(0x06) - label(0x2e) - stop_chr - yield - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - label(0x62) - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA - label(0x08) - set_ailist(CHR_SELF, AILIST_TELEPORT_COOP_TO_DRCAROLL) - - // Agent - label(0x09) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - label(0x61) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x07) - - beginloop(0x6b) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_0040, 0x01, /*goto*/ 0x06) - endloop(0x6b) - - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - label(0x62) - label(0x07) - - beginloop(0x68) - chr_move_to_pad(CHR_SELF, PAD_AGENTAREA_ENTRY, 0x01, /*goto*/ 0x06) - endloop(0x68) - - label(0x06) - label(0x2e) - stop_chr - yield - set_stage_flag(STAGEFLAG_TELEPORT_DONE) - if_stage_flag_eq(STAGEFLAG_ELVIS_FOLLOWING_COOP, TRUE, /*goto*/ 0x61) - if_chr_deadish(CHR_BOND, /*goto*/ 0x61) - goto_next(0x62) - - label(0x61) - set_ailist(CHR_ELVIS, AILIST_ELVIS_GIVE_FARSIGHT) - label(0x62) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Wait until not in sight of player (usually immediately), then unhide. - * - * Once the teleportals are activated, this is assigned to 3 guards at the - * entrance to the grotto thing. - */ -u8 func041c_teleport_activation_responder[] = { - beginloop(0x04) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2e) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2e) - unset_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, AILIST_INIT_SNIPER) - label(0x2e) - endloop(0x04) - - endlist -}; - -u8 func041a_init_sniper[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - - // SA and PA - set_accuracy(30) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(70) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_SNIPER_WAIT_FOR_DETECTION) - - // Agent - label(0x2e) - set_accuracy(20) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(70) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_SNIPER_WAIT_FOR_DETECTION) - endlist -}; - -u8 func041b_sniper_wait_for_detection[] = { - unset_self_chrflag(CHRCFLAG_UNEXPLODABLE) - yield - set_shotlist(AILIST_SNIPER) - label(0x06) - set_reaction_speed(100) - set_shotlist(AILIST_SNIPER) - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x2e) - if_enemy_distance_lt_and_los(1000, /*goto*/ 0x2e) - if_saw_death(0x00, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_distance_to_target_lt(400, /*goto*/ 0x06) - if_target_in_fov(30, /*goto*/ 0x06) - if_chr_in_view(/*goto*/ 0x06) - if_saw_death(0x00, /*goto*/ 0x06) - if_alertness(100, OPERATOR_GREATER_THAN, /*goto*/ 0x06) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - if_timer_gt(180, /*goto*/ 0x06) - label(0x2e) - endloop(0x04) - - label(0x06) - increase_squadron_alertness(100) - set_self_chrflag(CHRCFLAG_00040000) - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - set_ailist(CHR_SELF, AILIST_SNIPER) - endlist -}; - -u8 func041d_sniper[] = { - set_self_chrflag(CHRCFLAG_00000040) - set_shotlist(AILIST_SNIPER) - set_chr_cloaked(CHR_SELF, TRUE, FALSE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x03) - - // Dying - label(0x06) - goto_next(0x10) - - // Alive - label(0x03) - restart_timer - cmd0139(70, 0x02, TRUE) - - beginloop(0x63) - chr_toggle_p1p2(CHR_SELF) - if_can_see_target(/*goto*/ 0x2e) - if_enemy_distance_lt_and_los(1000, /*goto*/ 0x2f) - goto_next(0x2f) - - label(0x2e) - set_target_chr(CHR_P1P2) - label(0x2f) - if_target_is_player(/*goto*/ 0x2f) - goto_next(0x2e) - - label(0x2f) - if_timer_gt(180, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x63) - - label(0x06) - stop_chr - call_rng - if_rand_gt(128, /*goto*/ 0x06) - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - set_chrpreset(CHR_TARGET) - goto_next(0x06) - - // Unreachable - if_target_is_player(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_within_targets_fovx_by_angle(20, /*goto*/ 0x0d) - label(0x06) - if_can_see_target(/*goto*/ 0x2e) - goto_next(0x0d) - - label(0x2e) - restart_timer - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - label(0x0a) - label(0x2e) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2e) - label(0x2e) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x0c) - endloop(0x0b) - - label(0x0c) - if_target_is_player(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_chr_injured_target(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - set_stage_flag(STAGEFLAG_PURPLE_GUARD_SHOT_JO_OR_ELVIS) - label(0x06) - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - label(0x0d) - set_target_chr(CHR_PRESET) - goto_first(0x03) - - label(0x10) - if_chr_has_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_blonde[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unset_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_shotlist(GAILIST_ALERTED) - - beginloop(0x08) - if_saw_injury(0x00, /*goto*/ 0x06) - if_saw_death(0x00, /*goto*/ 0x06) - if_can_see_target(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func100c_countdown_timer[] = { - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x2e) - endloop(0x03) - - label(0x2e) - set_countdown_timer(60) - show_countdown_timer - start_countdown_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_countdown_timer_lt(1, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x000c, /*goto*/ 0x2e) - endloop(0x04) - - // Timer expired - label(0x06) - set_stage_flag(STAGEFLAG_TIMER_EXPIRED) - yield - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Player escaped - label(0x2e) - show_hudmsg(CHR_P1P2, L_PAM_016) // "Cetan ship evacuation successful." - set_stage_flag(STAGEFLAG_ESCAPED) - restart_timer - stop_countdown_timer - hide_countdown_timer - - label(0x09) - yield - label(0x2e) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) - goto_next(0x06) - - // Both players dead - label(0x2e) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x06) - set_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_check_elvis_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - show_hudmsg(CHR_BOND, L_PAM_014) // "Elvis has been killed." - set_stage_flag(STAGEFLAG_ALLY_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_check_drcaroll_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - show_hudmsg(CHR_BOND, L_PAM_015) // "Dr. Caroll has been killed." - set_stage_flag(STAGEFLAG_ALLY_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040f_miniskedar_send_clones[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x04) - goto_next(0x52) - reloop(0x04) - - label(0x52) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x52) - reloop(0x04) - - label(0x52) - try_spawn_clone2(CHR_SELF, AILIST_INIT_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - yield - endloop(0x04) - - endlist -}; - -u8 func040e_init_miniskedar[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_accuracy(0) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 20) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_MINISKEDAR) - endlist -}; - -u8 func040f_miniskedar[] = { - set_shotlist(AILIST_MINISKEDAR) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - yield - restart_timer - - beginloop(0x10) - if_timer_gt(30, /*goto*/ 0x2e) - endloop(0x10) - - label(0x2e) - say_quip(CHR_BOND, QUIP_GRENADE2, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - - beginloop(0x03) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2e) - label(0x2e) - if_can_see_target(/*goto*/ 0x2e) - goto_next(0x1e) - - label(0x2e) - if_distance_to_target_lt(400, /*goto*/ 0x30) - label(0x1e) - restart_timer - - label(0x09) - restart_timer - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) - label(0x06) - try_run_to_target(/*goto*/ 0x0a) - - beginloop(0x0a) - if_can_see_target(/*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_distance_to_target_lt(400, /*goto*/ 0x30) - label(0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - goto_first(0x09) - - label(0x30) - restart_timer - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - beginloop(0x0b) - if_timer_gt(30, /*goto*/ 0x06) - reloop(0x0b) - - label(0x2e) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - say_quip(CHR_BOND, QUIP_RETREAT1, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00) - if_distance_to_target_lt(200, /*goto*/ 0x2f) - miniskedar_try_pounce(0x04, 0x000e, /*goto*/ 0x34) - reloop(0x03) - - beginloop(0x34) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x34) - - label(0x2e) - restart_timer - if_chr_injured_target(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - label(0x2f) - retreat(GOPOSFLAG_RUN, 1) - - beginloop(0x0c) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - endloop(0x03) - - endlist -}; - -u8 func1010_agent_hallway_spawner[] = { - // This flag is also set when Elvis gives you the Farsight, so perhaps that - // used to be the trigger for miniskedar spawning but was changed so they - // spawn immediately. - set_stage_flag(STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING) - - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MINISKEDAR_SPAWNING, TRUE, /*goto*/ 0x2e) - endloop(0x03) - - label(0x2e) - set_ailist(0x25, AILIST_MINISKEDAR_SEND_CLONES) - set_ailist(0x26, AILIST_MINISKEDAR_SEND_CLONES) - - // Wait until player in a certain room - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0054, /*goto*/ 0x2e) - endloop(0x04) - - // Activate a different set of miniskedar - label(0x2e) - remove_chr(0x25) - remove_chr(0x26) - set_ailist(0x27, AILIST_MINISKEDAR_SEND_CLONES) - set_ailist(0x28, AILIST_MINISKEDAR_SEND_CLONES) - - // Wait until player in a certain room - beginloop(0x08) - chr_toggle_p1p2(CHR_P1P2) - if_chr_in_room(CHR_P1P2, 0x00, 0x005a, /*goto*/ 0x2e) - endloop(0x08) - - // Activate a different set of miniskedar - label(0x2e) - remove_chr(0x27) - remove_chr(0x28) - set_ailist(0x2b, AILIST_MINISKEDAR_SEND_CLONES) - set_ailist(0x2a, AILIST_MINISKEDAR_SEND_CLONES) - - // Wait until player in a certain room - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0067, /*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0411_hide[] = { -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_INVINCIBLE) -#endif - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_unused[] = { - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to 3 guards who appear after teleports activated. - */ -u8 func0413_cloak_and_hide[] = { - set_chr_cloaked(CHR_SELF, TRUE, FALSE) - stop_chr - yield - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_sa_megaweapon_spawner[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ELVIS_STARTED_SA_MEGAWEAPON, TRUE, /*goto*/ 0x1f) - endloop(0x04) - - label(0x1f) - restart_timer - - beginloop(0x20) - if_stage_flag_eq(STAGEFLAG_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x06) - - // Megaweapon not disabled yet - spawn every 8 seconds - if_timer_lt(480, /*goto*/ 0x21) - goto_next(0x2e) - - // Megaweapon disabled - spawn every 48 seconds - label(0x06) - if_timer_lt(2880, /*goto*/ 0x21) - - // Consider spawn - label(0x2e) - if_num_chrs_in_squadron_gt(5, 0x0e, /*goto*/ 0x21) - call_rng - if_rand_gt(86, /*goto*/ 0x63) - if_rand_gt(172, /*goto*/ 0x64) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01F4, AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x22) - goto_next(0x21) - - label(0x63) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01F5, AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x22) - goto_next(0x21) - - label(0x64) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01F6, AILIST_INIT_SA_MEGAWEAPON_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x22) - goto_next(0x21) - - label(0x21) - endloop(0x20) - - label(0x22) - yield - rebuild_teams - rebuild_squadrons - goto_first(0x1f) - - endlist -}; - -// SA megaweapon miniskedar -u8 func041e_init_sa_megaweapon_miniskedar[] = { - set_squadron(SQUADRON_0E) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) - endlist -}; - -/** - * On PA, in the room with 5 cylinders that must be destroyed to open the door. - */ -#define doorcylinder_logic(glass1, glass2, glass3, mine, stageflag) \ - beginloop(0x04) \ - if_object_in_good_condition(glass1, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass2, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass3, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - endloop(0x04) \ - \ - label(0x06) \ - assign_sound(SFX_8147, CHANNEL_7) \ - control_sound_from_object(CHANNEL_7, mine, TRUE) \ - yield \ - destroy_object(mine) \ - destroy_object(glass1) \ - destroy_object(glass2) \ - destroy_object(glass3) \ - set_stage_flag(stageflag) \ - set_ailist(CHR_SELF, 0x0408) - -u8 func1013_pa_doorcylinder1[] = { - set_lights_state(0x00a1, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00a9, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00ac, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00b4, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00b7, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00bf, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00c0, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00c1, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00c2, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x00c3, LIGHTOP_4, 0x00, 0xff, 0xb4) - set_lights_state(0x006c, LIGHTOP_4, 0x00, 0xff, 0xf0) - - doorcylinder_logic(0x11, 0x12, 0x13, 0x9c, STAGEFLAG_PA_EARLYDOORCYLINDER1_DESTROYED) - endlist -}; - -u8 func1014_pa_doorcylinder2[] = { - doorcylinder_logic(0x14, 0x15, 0x16, 0x9d, STAGEFLAG_PA_EARLYDOORCYLINDER2_DESTROYED) - endlist -}; - -u8 func1015_pa_doorcylinder3[] = { - doorcylinder_logic(0x17, 0x18, 0x19, 0x9e, STAGEFLAG_PA_EARLYDOORCYLINDER3_DESTROYED) - endlist -}; - -u8 func1016_pa_doorcylinder4[] = { - doorcylinder_logic(0x1a, 0x1b, 0x1c, 0x9f, STAGEFLAG_PA_EARLYDOORCYLINDER4_DESTROYED) - endlist -}; - -u8 func1017_pa_doorcylinder5[] = { - doorcylinder_logic(0x1d, 0x1e, 0x1f, 0xa0, STAGEFLAG_PA_EARLYDOORCYLINDER5_DESTROYED) - endlist -}; - -u8 func0408_check_pa_earlydoorcylinders_destroyed[] = { - label(0x04) - yield - if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER1_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER2_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER3_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER4_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_EARLYDOORCYLINDER5_DESTROYED, TRUE, /*goto*/ 0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x08) - if_door_state(0x09, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_lights_state(0x008b, LIGHTOP_3, 0xff, 0x0a, 0x78) - set_lights_state(0x00bf, LIGHTOP_3, 0xff, 0x0a, 0x78) - set_lights_state(0x00c0, LIGHTOP_3, 0xff, 0x0a, 0x78) - set_lights_state(0x00c1, LIGHTOP_3, 0xff, 0x0a, 0x78) - set_lights_state(0x00c2, LIGHTOP_3, 0xff, 0x0a, 0x78) - set_lights_state(0x00c3, LIGHTOP_3, 0xff, 0x0a, 0x78) - open_door(0x09) - open_door(0x0a) - goto_first(0x08) - - endlist -}; - -#define pa_cylinder(glass, mine) \ - /* Wait until any object destroyed */ \ - beginloop(0x04) \ - if_object_in_good_condition(glass, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 1, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 2, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 3, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 4, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 5, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 6, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 7, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 8, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 9, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 10, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - if_object_in_good_condition(glass + 11, /*goto*/ 0x2e) \ - goto_next(0x06) \ - label(0x2e) \ - endloop(0x04) \ - \ - label(0x06) \ - destroy_object(mine) \ - destroy_object(glass) \ - destroy_object(glass + 1) \ - destroy_object(glass + 2) \ - destroy_object(glass + 3) \ - destroy_object(glass + 4) \ - destroy_object(glass + 5) \ - destroy_object(glass + 6) \ - destroy_object(glass + 7) \ - destroy_object(glass + 8) \ - destroy_object(glass + 9) \ - destroy_object(glass + 10) \ - destroy_object(glass + 11) - -u8 func1018_pa_door1[] = { - pa_cylinder(0x20, 0xa1) - set_stage_flag(STAGEFLAG_PA_MIDDOORCYLINDER_DESTROYED) - set_lights_state(0x00a1, LIGHTOP_3, 0xff, 0x0a, 0x78) - - beginloop(0x08) - if_door_state(0x0b, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - reloop(0x08) - - label(0x06) - open_door(0x0b) - open_door(0x0c) - endloop(0x08) - - endlist -}; - -/** - * The 4 cylinders in the tunnels that must be destroyed before the door to the - * final room opens. - */ -u8 func0409_check_pa_latedoorcylinders_destroyed[] = { - label(0x04) - yield - if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER1_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER2_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER3_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_LATEDOORCYLINDER4_DESTROYED, TRUE, /*goto*/ 0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x08) - if_door_state(0x0d, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - open_door(0x0d) - open_door(0x0e) - goto_first(0x08) - - endlist -}; - -u8 func1019_pa_door2[] = { - pa_cylinder(0x2c, 0xa2) - set_lights_state(0x00a9, LIGHTOP_3, 0xff, 0x0a, 0x78) - label(0x08) - set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER1_DESTROYED) - set_ailist(CHR_SELF, 0x0409) - endlist -}; - -u8 func101a_pa_door3[] = { - pa_cylinder(0x38, 0xa3) - set_lights_state(0x00ac, LIGHTOP_3, 0xff, 0x0a, 0x78) - label(0x08) - set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER2_DESTROYED) - set_ailist(CHR_SELF, 0x0409) - endlist -}; - -u8 func101b_pa_door4[] = { - pa_cylinder(0x44, 0xa4) - set_lights_state(0x00b4, LIGHTOP_3, 0xff, 0x0a, 0x78) - label(0x08) - set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER3_DESTROYED) - set_ailist(CHR_SELF, 0x0409) - endlist -}; - -u8 func101c_pa_door5[] = { - // @bug: One of the PA door glasses is checked twice, and one is not - // checked at all, hence why this doesn't use the pa_cylinder macro. - - // Wait until any object destroyed - beginloop(0x04) - if_object_in_good_condition(0x50, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x51, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x52, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x52, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x53, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x54, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x55, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x56, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x57, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x58, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x59, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - if_object_in_good_condition(0x5a, /*goto*/ 0x2e) - goto_next(0x06) - label(0x2e) - endloop(0x04) - - label(0x06) - destroy_object(0xa5) - destroy_object(0x50) - destroy_object(0x51) - destroy_object(0x52) - destroy_object(0x52) - destroy_object(0x53) - destroy_object(0x54) - destroy_object(0x55) - destroy_object(0x56) - destroy_object(0x57) - destroy_object(0x58) - destroy_object(0x59) - destroy_object(0x5a) - - set_lights_state(0x00b7, LIGHTOP_3, 0xff, 0x0a, 0x78) - label(0x08) - set_stage_flag(STAGEFLAG_PA_LATEDOORCYLINDER4_DESTROYED) - set_ailist(CHR_SELF, 0x0409) - endlist -}; - -u8 func101d_pa_canister1[] = { - pa_cylinder(0x5b, 0xa6) - label(0x08) - set_stage_flag(STAGEFLAG_PA_CANISTER1_DESTROYED) - set_ailist(CHR_SELF, 0x040a) - endlist -}; - -u8 func101e_pa_canister2[] = { - pa_cylinder(0x67, 0xa7) - label(0x08) - set_stage_flag(STAGEFLAG_PA_CANISDER2_DESTROYED) - set_ailist(CHR_SELF, 0x040a) - endlist -}; - -u8 func040a_check_pa_canisters_destroyed[] = { - label(0x04) - yield - if_stage_flag_eq(STAGEFLAG_PA_CANISTER1_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PA_CANISDER2_DESTROYED, TRUE, /*goto*/ 0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Both canisters destroyed - label(0x2e) - set_object_flag(0x0f, OBJFLAG_DOOR_KEEPOPEN) - set_lights_state(0x00bc, LIGHTOP_3, 0xff, 0x0a, 0x78) - - beginloop(0x08) - if_door_state(0x0f, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) - show_hudmsg(CHR_BOND, L_PAM_043) // "Cetan megaweapon has been disabled." - set_stage_flag(STAGEFLAG_MEGAWEAPON_DISABLED) - label(0x2e) - open_door(0x0f) - open_door(0x10) - goto_first(0x08) - - endlist -}; - -/** - * The room with 5 cylinders that open a door. - */ -u8 func101f_pa_circleroom_spawner[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_door_state(0x09, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x008b, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - restart_timer - - beginloop(0x0d) - if_door_state(0x09, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x1f) - if_timer_gt(300, /*goto*/ 0x1f) - endloop(0x0d) - - label(0x1f) - restart_timer - - beginloop(0x20) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x008c, /*goto*/ 0x58) - if_timer_lt(300, /*goto*/ 0x21) - label(0x2e) - if_num_chrs_in_squadron_gt(3, 0x0d, /*goto*/ 0x21) - call_rng - if_rand_gt(128, /*goto*/ 0x63) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_00DD, AILIST_INIT_PA_CIRCLEROOM_MINISKEDAR, 0, /*goto*/ 0x22) - goto_next(0x21) - label(0x63) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_00DD, AILIST_INIT_PA_CIRCLEROOM_MINISKEDAR, 0, /*goto*/ 0x22) - goto_next(0x21) - label(0x21) - endloop(0x20) - - label(0x22) - yield - rebuild_teams - rebuild_squadrons - goto_first(0x1f) - - label(0x58) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041f_init_pa_circleroom_miniskedar[] = { - set_squadron(SQUADRON_0D) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) - endlist -}; - -u8 func1020_pa_deadendroom_spawner[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b4, /*goto*/ 0x2e) - if_chr_in_room(CHR_P1P2, 0x00, 0x00b8, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_ailist(0x38, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) - set_ailist(0x39, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) - set_ailist(0x3a, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) - set_ailist(0x3b, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR) - label(0x1f) - restart_timer - - beginloop(0x20) - if_timer_lt(300, /*goto*/ 0x21) - label(0x2e) - if_num_chrs_in_squadron_gt(3, 0x0b, /*goto*/ 0x21) - call_rng - if_rand_gt(64, /*goto*/ 0x63) - if_rand_gt(128, /*goto*/ 0x64) - if_rand_gt(196, /*goto*/ 0x65) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01AF, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) - goto_next(0x21) - label(0x63) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01B0, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) - goto_next(0x21) - label(0x64) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01B1, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) - goto_next(0x21) - label(0x65) - try_spawn_chr_at_pad(BODY_MINISKEDAR, HEAD_RANDOM, PAD_PAM_01B2, AILIST_INIT_PA_DEADENDROOM_MINISKEDAR, 0, /*goto*/ 0x22) - goto_next(0x21) - label(0x21) - endloop(0x20) - - label(0x22) - yield - rebuild_teams - rebuild_squadrons - goto_first(0x1f) - - endlist -}; - -u8 func0420_init_pa_deadendroom_miniskedar[] = { - set_squadron(SQUADRON_0B) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) - endlist -}; - -u8 func1021_c6c4[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_PA_MIDDOORCYLINDER_DESTROYED, TRUE, /*goto*/ 0x2e) - if_chr_dead(0x30, /*goto*/ 0x2e) - if_chr_dead(0x31, /*goto*/ 0x2e) - if_chr_dead(0x32, /*goto*/ 0x2e) - if_chr_dead(0x33, /*goto*/ 0x2e) - if_chr_dead(0x34, /*goto*/ 0x2e) - if_chr_dead(0x35, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_ailist(0x30, AILIST_INIT_MINISKEDAR) - set_ailist(0x31, AILIST_INIT_MINISKEDAR) - set_ailist(0x32, AILIST_INIT_MINISKEDAR) - set_ailist(0x33, AILIST_INIT_MINISKEDAR) - set_ailist(0x34, AILIST_INIT_MINISKEDAR) - set_ailist(0x35, AILIST_INIT_MINISKEDAR) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_path(pathid, function) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(20) \ - set_reaction_speed(65) \ - set_chr_maxdamage(CHR_SELF, 70) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - set_returnlist(CHR_SELF, function) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - -u8 func0421_start_path02[] = { - init_path(2, 0x0421) - endlist -}; - -u8 func0422_start_path03[] = { - init_path(3, 0x0422) - endlist -}; - -u8 func0423_start_path04[] = { - init_path(4, 0x0423) - endlist -}; - -u8 func0424_start_path05[] = { - init_path(5, 0x0424) - endlist -}; - -u8 func0425_start_path06[] = { - init_path(6, 0x0425) - endlist -}; - -u8 func0426_start_path07[] = { - init_path(7, 0x0426) - endlist -}; - -u8 func0427_start_path08[] = { - init_path(8, 0x0427) - endlist -}; - -u8 func0428_start_path09[] = { - init_path(9, 0x0428) - endlist -}; - -u8 func0429_start_path10[] = { - init_path(10, 0x0429) - endlist -}; - -u8 func1022_control_room[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2e) - goto_next(0x04) - - // Agent - label(0x2e) - remove_chr(CHR_BLONDE1) - remove_chr(CHR_BLONDE2) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA and PA - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - if_chr_deadish(CHR_BLONDE1, /*goto*/ 0x2e) - goto_first(0x04) - - label(0x2e) - if_chr_deadish(CHR_BLONDE2, /*goto*/ 0x2e) - goto_first(0x04) - - label(0x2e) - show_hudmsg(CHR_P1P2, L_PAM_021) // "Control Room has been secured." - set_stage_flag(STAGEFLAG_BLONDES_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1023_check_drcaroll_restored[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x04) - yield - give_object_to_chr(OBJ_BACKUPDISK, CHR_BOND) - - beginloop(0x04) - if_chr_deadish(CHR_DRCAROLL, /*goto*/ 0x0d) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0d) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_PAM_0193, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_BLONDES_DEAD, TRUE, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_P1P2, 200, PAD_PAM_0193, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_BACKUPDISK, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_stage_flag(STAGEFLAG_DRCAROLL_RESTORED) - label(0x08) - set_ailist(CHR_SELF, AILIST_MIDCUTSCENE) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1024_update_elvis_target_chr[] = { - beginloop(0x04) - if_chr_deadish(CHR_BOND, /*goto*/ 0x08) - set_chr_target_chr(CHR_ELVIS, CHR_BOND) - unset_stage_flag(STAGEFLAG_ELVIS_FOLLOWING_COOP) - endloop(0x04) - - beginloop(0x08) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2e) - set_chr_target_chr(CHR_ELVIS, CHR_COOP) - set_stage_flag(STAGEFLAG_ELVIS_FOLLOWING_COOP) - endloop(0x08) - - label(0x2e) - goto_first(0x04) - - endlist -}; - -u8 unregistered_function1[] = { - label(0x04) - chr_move_to_pad(CHR_ELVIS, PAD_PAM_01BF, 0x01, /*goto*/ 0x06) - label(0x06) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - set_ailist(CHR_ELVIS, AILIST_ELVIS_FOLLOW_AND_REACTIVATE_TELEPORTALS) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1026_setup_autoguns[] = { - yield - set_autogun_target_team(0xa8, TEAM_ENEMY | TEAM_ALLY) - set_autogun_target_team(0xa9, TEAM_ENEMY | TEAM_ALLY) - set_autogun_target_team(0xaa, TEAM_ENEMY | TEAM_ALLY) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042e_elvis_run_to_exit[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_shotlist(AILIST_ELVIS_RUN_TO_EXIT) - set_returnlist(CHR_SELF, AILIST_ELVIS_RUN_TO_EXIT) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x06) - - // Dying - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2e) - goto_next(0x5f) - - // Injured - label(0x2e) - say_quip(CHR_BOND, 0x29, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - - beginloop(0x12) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x12) - - // Healthy - label(0x1f) - label(0x06) - set_target_chr(CHR_PRESET) - label(0x5f) - restart_timer - if_distance_to_target_lt(1400, /*goto*/ 0x2e) - jog_to_pad(PAD_PAM_0004) - goto_next(0x0f) - - label(0x2e) - run_to_pad(PAD_PAM_0004) - - beginloop(0x0f) - if_enemy_distance_lt_and_los(800, /*goto*/ 0x08) - if_timer_gt(300, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x2e) - endloop(0x0f) - - label(0x06) - goto_first(0x5f) - - label(0x2e) - stop_chr - goto_first(0x1f) - - label(0x06) - restart_timer - label(0x08) - if_target_is_player(/*goto*/ 0x06) - goto_next(0x2e) - label(0x06) - goto_first(0x1f) - - label(0x2e) - call_rng - if_rand_lt(85, /*goto*/ 0x63) - if_rand_lt(170, /*goto*/ 0x64) - say_quip(CHR_BOND, 0x26, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - label(0x63) - say_quip(CHR_BOND, 0x27, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - goto_next(0x2e) - label(0x64) - say_quip(CHR_BOND, 0x28, 0xff, 0x0f, 0xff, BANK_1, 0x00, 0x00) - label(0x2e) - set_shotlist(AILIST_ELVIS_RUN_TO_EXIT) - set_returnlist(CHR_SELF, AILIST_ELVIS_RUN_TO_EXIT) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func1027_powernode_illumination[] = { - beginloop(0x04) - if_door_state(0x03, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - unset_object_flag(OBJ_POWERNODE1, OBJFLAG_IGNOREFLOORCOLOUR) - goto_next(0x06) - label(0x2e) - set_object_flag(OBJ_POWERNODE1, OBJFLAG_IGNOREFLOORCOLOUR) - - label(0x06) - if_door_state(0x04, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - unset_object_flag(OBJ_POWERNODE2, OBJFLAG_IGNOREFLOORCOLOUR) - goto_next(0x06) - label(0x2e) - set_object_flag(OBJ_POWERNODE2, OBJFLAG_IGNOREFLOORCOLOUR) - - label(0x06) - if_door_state(0x05, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - unset_object_flag(OBJ_POWERNODE3, OBJFLAG_IGNOREFLOORCOLOUR) - goto_next(0x06) - label(0x2e) - set_object_flag(OBJ_POWERNODE3, OBJFLAG_IGNOREFLOORCOLOUR) - label(0x06) - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Enables 3 guards near the grotto entrance during the escape timer. - */ -u8 func1028_enable_last_3_guards[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x2e) - reloop(0x04) - - label(0x2e) - if_door_state(0xab, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - unset_chr_chrflag(0x3c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x3d, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x3e, CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(0x3c, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x3d, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(0x3e, CHRCFLAG_INVINCIBLE) -#endif - set_ailist(0x3c, AILIST_RUN_TO_EXIT) - set_ailist(0x3d, AILIST_RUN_TO_EXIT) - set_ailist(0x3e, AILIST_RUN_TO_EXIT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func042b_run_to_exit[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(40) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 10) - add_health_or_armor(70) - set_recovery_speed(0) - set_shield(0) - label(0x04) - run_to_pad(PAD_PAM_0000) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1429_start_lift[] = { - if_coop_mode(/*goto*/ 0x45) - activate_lift(1, 0x07) - label(0x45) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102a_kill_pelagic_guard[] = { - yield - damage_chr(0x3f, WEAPON_SUPERDRAGON) - yield - damage_chr(0x3f, WEAPON_SUPERDRAGON) - yield - damage_chr(0x3f, WEAPON_SUPERDRAGON) - yield - damage_chr(0x3f, WEAPON_SUPERDRAGON) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102b_proxymines[] = { - beginloop(0x04) - if_chr_deadish(0x08, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_PURPLE_GUARD_SHOT_JO_OR_ELVIS, TRUE, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_object_flag(OBJ_PROXYMINES, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_PROXYMINES, OBJFLAG2_INVISIBLE) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102c_lock_doors[] = { - label(0x04) - yield - if_difficulty_lt(DIFF_PA, /*goto*/ 0x2e) - - // PA - lock_door(0xb1, 0x80) - lock_door(0xb2, 0x80) - set_object_flag2(0xb1, OBJFLAG2_AICANNOTUSE) - set_object_flag2(0xb2, OBJFLAG2_AICANNOTUSE) - - // A and SA - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040f_miniskedar_unalerted[] = { - set_shotlist(AILIST_MINISKEDAR) - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_accuracy(0) - set_reaction_speed(65) - set_chr_maxdamage(CHR_SELF, 20) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - set_ailist(CHR_SELF, AILIST_MINISKEDAR) - endlist -}; - -u8 func0432_dead_skedar[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - - label(0x08) - yield - chr_do_animation(ANIM_SKEDAR_COLLAPSE, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x21, 2) - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function2[] = { - set_lights_state(0x0009, LIGHTOP_4, 0x00, 0xff, 0xfa) - - beginloop(0x08) - endloop(0x08) - - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102e_open_powernode_doors_on_agent[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x08) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Agent - label(0x08) - open_door(0x03) - set_object_flag(0x03, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x04) - set_object_flag(0x04, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x05) - set_object_flag(0x05, OBJFLAG_DOOR_KEEPOPEN) - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Stop whatever Elvis is doing in preparation for teleporting. - */ -u8 func042c_elvis_stop[] = { - label(0x08) - stop_chr - - // @bug: This needs to set the onshot function to GAILIST_IDLE too, otherwise - // his function will be reassigned if he takes damage between here and the - // teleport. This causes him to not teleport. - label(0x2e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102f_unlock_drcaroll_door[] = { - // Wait until player in Dr Caroll room - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2e) - endloop(0x08) - - // Unlock exit door - label(0x2e) - unlock_door(0x75, 0x02) - unlock_door(0x76, 0x02) - unset_object_flag2(0x75, OBJFLAG2_AICANNOTUSE) - unset_object_flag2(0x76, OBJFLAG2_AICANNOTUSE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1030_unlock_agent_teleport_door[] = { - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_MEGAWEAPON_DISABLED, TRUE, /*goto*/ 0x2e) - endloop(0x08) - - // Agent area, near megaweapon. Door that leads to exit teleport. - label(0x2e) - unlock_door(0xb7, 0x02) - unlock_door(0xb8, 0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Wait until Jo has the trigger buddy warp flag set, then unset it 30 seconds - * later. - */ -u8 func1031_unset_trigger_buddy_warp[] = { - beginloop(0x08) - if_chr_has_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP, /*goto*/ 0x2e) - reloop(0x08) - - label(0x2e) - restart_timer - - beginloop(0x09) - if_timer_gt(1800, /*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - endloop(0x08) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Toggle a stage flag every 5 seconds. - * - * There's a good chance that this flag had a different meaning back when this - * was working. - */ -u8 unregistered_function3[] = { - label(0x1f) - restart_timer - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x2e) - endloop(0x08) - - label(0x2e) - unset_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - restart_timer - - beginloop(0x09) - if_timer_gt(300, /*goto*/ 0x2e) - endloop(0x09) - - label(0x2e) - set_stage_flag(STAGEFLAG_SA_EXIT_TELEPORT_DISABLED) - goto_first(0x1f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1032_setup_rtracker[] = { - yield - set_object_flag3(OBJ_PROXYMINES, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1433_setup_environment[] = { - yield -#if VERSION >= VERSION_NTSC_1_0 - configure_environment(0x0000, AIENVCMD_SETAMBIENT, TRUE) - configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, FALSE) - configure_environment(0x000d, AIENVCMD_ROOM_SETAMBIENT, FALSE) -#else - configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0051, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0052, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0053, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0054, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0055, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0060, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0061, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0065, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0069, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x006c, AIENVCMD_ROOM_SETAMBIENT, TRUE) -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1034_enable_blondes[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - yield - disable_chr(CHR_BLONDE1) - disable_chr(CHR_BLONDE2) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x004c, /*goto*/ 0x2e) - endloop(0x04) - - label(0x2e) - enable_chr(CHR_BLONDE1) - enable_chr(CHR_BLONDE2) - set_ailist(CHR_BLONDE1, AILIST_BLONDE) - set_ailist(CHR_BLONDE2, AILIST_BLONDE) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102d_check_farsight_ammo_wasted[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - - // Probable @bug: Looks like the objective will fail if one buddy uses all - // their ammo but the other is still stocked. - beginloop(0x1f) - if_chr_weapon_equipped(CHR_BOND, WEAPON_FARSIGHT, /*goto*/ 0x2e) - if_chr_weapon_equipped(CHR_COOP, WEAPON_FARSIGHT, /*goto*/ 0x2f) - endloop(0x1f) - - label(0x2e) - set_target_chr(CHR_BOND) - goto_next(0x63) - - label(0x2f) - set_target_chr(CHR_COOP) - - beginloop(0x63) - if_objective_complete(1, /*goto*/ 0x0d) - if_ammo_quantity_lt(CHR_TARGET, AMMOTYPE_FARSIGHT, 1, /*goto*/ 0x2e) - endloop(0x63) - - label(0x2e) - show_hudmsg(CHR_BOND, L_PAM_044) // "Ammo wasted - unable to disable megaweapon." - set_stage_flag(STAGEFLAG_FARSIGHT_AMMO_WASTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function4[] = { - mp_init_simulants - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_unused, 0x0401 }, - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_powernode1, 0x1003 }, - { func1004_powernode2, 0x1004 }, - { func1005_powernode3, 0x1005 }, - { func1006_msg_thiswillhelpus, 0x1006 }, - { func1007_msg_antibodymasking, 0x1007 }, - { func1008_msg_theresdrcaroll, 0x1008 }, - { func1009_msg_getoutofhere, 0x1009 }, - { func100a_bond_teleports, 0x100a }, - { func100b_coop_teleports, 0x100b }, - { func100c_countdown_timer, 0x100c }, - { func100e_check_elvis_dead, 0x100e }, - { func100f_check_drcaroll_dead, 0x100f }, - { func1010_agent_hallway_spawner, 0x1010 }, - { func1012_sa_megaweapon_spawner, 0x1012 }, - { func1013_pa_doorcylinder1, 0x1013 }, - { func1014_pa_doorcylinder2, 0x1014 }, - { func1015_pa_doorcylinder3, 0x1015 }, - { func1016_pa_doorcylinder4, 0x1016 }, - { func1017_pa_doorcylinder5, 0x1017 }, - { func1018_pa_door1, 0x1018 }, - { func1019_pa_door2, 0x1019 }, - { func101a_pa_door3, 0x101a }, - { func101b_pa_door4, 0x101b }, - { func101c_pa_door5, 0x101c }, - { func101d_pa_canister1, 0x101d }, - { func101e_pa_canister2, 0x101e }, - { func101f_pa_circleroom_spawner, 0x101f }, - { func1020_pa_deadendroom_spawner, 0x1020 }, - { func1021_c6c4, 0x1021 }, - { func1022_control_room, 0x1022 }, - { func1023_check_drcaroll_restored, 0x1023 }, - { func1024_update_elvis_target_chr, 0x1024 }, - { func1026_setup_autoguns, 0x1026 }, - { func1027_powernode_illumination, 0x1027 }, - { func1028_enable_last_3_guards, 0x1028 }, - { func1429_start_lift, 0x1429 }, - { func102a_kill_pelagic_guard, 0x102a }, - { func102b_proxymines, 0x102b }, - { func102c_lock_doors, 0x102c }, - { func102d_check_farsight_ammo_wasted, 0x102d }, - { func102e_open_powernode_doors_on_agent, 0x102e }, - { func102f_unlock_drcaroll_door, 0x102f }, - { func1030_unlock_agent_teleport_door, 0x1030 }, - { func1031_unset_trigger_buddy_warp, 0x1031 }, - { func1032_setup_rtracker, 0x1032 }, - { func1433_setup_environment, 0x1433 }, - { func1034_enable_blondes, 0x1034 }, - { func1002_intro, 0x0c00 }, - { func0c01_midcutscene, 0x0c01 }, - { func0c02_outro, 0x0c02 }, - { func0411_hide, 0x0411 }, - { func0412_unused, 0x0412 }, - { func040e_init_miniskedar, 0x040e }, - { func040f_miniskedar, 0x040f }, - { func0c02_outro, 0x0410 }, - { func040f_miniskedar_send_clones, 0x040d }, - { func040c_blonde, 0x040c }, - { func040b_init_elvis, 0x040b }, - { func0402_elvis_follow_and_reactive_teleportals, 0x0402 }, - { func0403_elvis_give_farsight, 0x0403 }, - { func0404_elvis_follow_and_do_agent_megaweapon, 0x0404 }, - { func0405_elvis_follow_nocombat, 0x0405 }, - { func0406_elvis_follow_and_do_sa_megaweapon, 0x0406 }, - { func0407_elvis_go_to_sa_teleport, 0x0407 }, - { func0408_check_pa_earlydoorcylinders_destroyed, 0x0408 }, - { func0409_check_pa_latedoorcylinders_destroyed, 0x0409 }, - { func040a_check_pa_canisters_destroyed, 0x040a }, - { func0414_teleport_bond_to_sapa, 0x0414 }, - { func0415_teleport_bond_to_drcaroll, 0x0415 }, - { func0416_teleport_bond_to_a_pa_drcaroll, 0x0416 }, - { func0417_teleport_coop_to_sapa, 0x0417 }, - { func0418_teleport_coop_to_drcaroll, 0x0418 }, - { func0419_teleport_coop_to_a_pa_drcaroll, 0x0419 }, - { func041a_init_sniper, 0x041a }, - { func041b_sniper_wait_for_detection, 0x041b }, - { func041c_teleport_activation_responder, 0x041c }, - { func041d_sniper, 0x041d }, - { func041e_init_sa_megaweapon_miniskedar, 0x041e }, - { func041f_init_pa_circleroom_miniskedar, 0x041f }, - { func0420_init_pa_deadendroom_miniskedar, 0x0420 }, - { func0421_start_path02, 0x0421 }, - { func0422_start_path03, 0x0422 }, - { func0423_start_path04, 0x0423 }, - { func0424_start_path05, 0x0424 }, - { func0425_start_path06, 0x0425 }, - { func0426_start_path07, 0x0426 }, - { func0427_start_path08, 0x0427 }, - { func0428_start_path09, 0x0428 }, - { func0429_start_path10, 0x0429 }, - { func042b_run_to_exit, 0x042b }, - { func042d_elvis_warp_to_outside_drcaroll, 0x042d }, - { func042e_elvis_run_to_exit, 0x042e }, - { func0c01_midcutscene, 0x042a }, - { func0413_cloak_and_hide, 0x0413 }, - { func042f_init_pelagic_guard, 0x042f }, - { func0430_unused, 0x0430 }, - { func040f_miniskedar_unalerted, 0x0431 }, - { func0432_dead_skedar, 0x0432 }, - { func0433_unused, 0x0433 }, - { func042c_elvis_stop, 0x042c }, - { NULL, 0 }, -}; - struct path paths[] = { { path02, 2, 0 }, { path03, 3, 0 }, diff --git a/src/setups/setuppete.c b/src/setups/setuppete.c index b9d1387d5..1bbeb53f9 100644 --- a/src/setups/setuppete.c +++ b/src/setups/setuppete.c @@ -105,7 +105,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -482,2810 +482,6 @@ s32 path13[] = { -1, }; -#define chicago_car_do_animation(object, animation) \ - enable_object(object) \ - set_object_flag2(object, OBJFLAG2_04000000) \ - set_object_flag3(object, OBJFLAG3_00000010) \ - object_do_animation(animation, object, 0x04, 0xffff) - -#define chicago_wait_for_camera \ - beginloop(0x05) \ - if_camera_animating(/*goto*/ 0x03) \ - goto_next(0x04) \ - label(0x03) \ - if_controller_button_pressed(/*goto*/ 0x04) \ - goto_first(0x05) \ - label(0x04) - -u8 func0401_3ae8[] = { - set_stage_flag(STAGEFLAG_TRIGGER_INTRO) - if_controller_button_pressed(/*goto*/ 0x00) - camera_movement(ANIM_CUT_PETE_INTRO_CAM_01) - play_cutscene_track(MUSIC_CHICAGO_INTRO) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - - chicago_car_do_animation(OBJ_CAR1, ANIM_CUT_PETE_INTRO_VEHICLE_01) - chicago_car_do_animation(OBJ_CAR2, ANIM_CUT_PETE_INTRO_VEHICLE_02) - chicago_car_do_animation(OBJ_CAR3, ANIM_CUT_PETE_INTRO_VEHICLE_03) - chicago_car_do_animation(OBJ_CAR4, ANIM_CUT_PETE_INTRO_VEHICLE_04) - - set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - - chicago_wait_for_camera - - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - disable_object(OBJ_CAR1) - disable_object(OBJ_CAR2) - disable_object(OBJ_CAR3) - disable_object(OBJ_CAR4) - unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - label(0x00) - return - endlist -}; - -u8 func0402_3bb4[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - if_controller_button_pressed(/*goto*/ 0x00) - camera_movement(ANIM_CUT_PETE_INTRO_CAM_02) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - - chicago_car_do_animation(OBJ_CAR1, ANIM_CUT_PETE_INTRO_VEHICLE_05) - chicago_car_do_animation(OBJ_CAR2, ANIM_CUT_PETE_INTRO_VEHICLE_06) - chicago_car_do_animation(OBJ_CAR4, ANIM_CUT_PETE_INTRO_VEHICLE_07) - chicago_car_do_animation(OBJ_CAR5, ANIM_CUT_PETE_INTRO_VEHICLE_08) - - set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - - chicago_wait_for_camera - - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - disable_object(OBJ_CAR1) - disable_object(OBJ_CAR2) - disable_object(OBJ_CAR4) - disable_object(OBJ_CAR5) - unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - label(0x00) - return - endlist -}; - -u8 func0403_3c74[] = { - if_controller_button_pressed(/*goto*/ 0x00) - camera_movement(ANIM_CUT_PETE_INTRO_CAM_03) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - enable_object(OBJ_CAR4) - set_object_flag2(OBJ_CAR4, OBJFLAG2_04000000) - set_object_flag3(OBJ_CAR4, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_PETE_INTRO_VEHICLE_09, OBJ_CAR4, 0x04, 0xffff) - set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - - chicago_wait_for_camera - - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - disable_object(OBJ_CAR4) - unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - label(0x00) - return - endlist -}; - -u8 func0404_3ce0[] = { - enable_object(OBJ_WIREFENCE) - set_object_flag2(OBJ_WIREFENCE, OBJFLAG2_04000000) - set_object_flag3(OBJ_WIREFENCE, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_PETE_INTRO_FENCE, OBJ_WIREFENCE, 0x01, 0xffff) - - if_controller_button_pressed(/*goto*/ 0x00) - camera_movement(ANIM_CUT_PETE_INTRO_CAM_04) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PETE_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - - chicago_wait_for_camera - - unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - label(0x00) - return - endlist -}; - -u8 func0405_3d50[] = { - camera_movement(ANIM_CUT_PETE_INTRO_CAM_05) - cmd0175(60) - if_controller_button_pressed(/*goto*/ 0x00) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PETE_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - - restart_timer - - beginloop(0x2d) - if_controller_button_pressed(/*goto*/ 0x2f) - if_timer_gt(480, /*goto*/ 0x04) - endloop(0x2d) - - label(0x04) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - beginloop(0x2f) - if_controller_button_pressed(/*goto*/ 0x04) - if_timer_gt(910, /*goto*/ 0x04) - endloop(0x2f) - - label(0x04) - chicago_wait_for_camera - - label(0x00) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - mute_channel(CHANNEL_7) - unset_chr_chrflag(CHR_CIA1, CHRCFLAG_HIDDEN) - - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PETE_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - stop_cutscene_track - stop_ambient_track - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function1[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, 0x0401) - endlist -}; - -u8 unregistered_function2[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, 0x0402) - endlist -}; - -u8 unregistered_function3[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, 0x0403) - endlist -}; - -u8 unregistered_function4[] = { - set_returnlist(CHR_SELF, GAILIST_END_CINEMA) - set_ailist(CHR_SELF, 0x0404) - endlist -}; - -u8 unregistered_function5[] = { - set_ailist(CHR_SELF, 0x0405) - endlist -}; - -u8 func040a_intro[] = { - set_returnlist(CHR_SELF, 0x0406) - set_ailist(CHR_SELF, 0x0401) - endlist -}; - -u8 func0406_3e54[] = { - set_returnlist(CHR_SELF, 0x0407) - set_ailist(CHR_SELF, 0x0402) - endlist -}; - -u8 func0407_3e60[] = { - set_returnlist(CHR_SELF, 0x0408) - set_ailist(CHR_SELF, 0x0403) - endlist -}; - -u8 func0408_3e6c[] = { - set_returnlist(CHR_SELF, 0x0409) - set_ailist(CHR_SELF, 0x0404) - endlist -}; - -u8 func0409_3e78[] = { - set_ailist(CHR_SELF, 0x0405) - endlist -}; - -u8 func100f_check_mine[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) - - // SA and PA - yield - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_BRIEFCASE1, /*goto*/ 0x03) - reloop(0x08) - - label(0x03) - set_target_chr(CHR_P1P2) - - beginloop(0x11) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x29) - if_ammo_quantity_lt(CHR_TARGET, AMMOTYPE_REMOTE_MINE, 1, /*goto*/ 0x03) - endloop(0x11) - - label(0x29) - label(0x54) - yield - if_chr_deadish(CHR_TARGET, /*goto*/ 0x28) - yield - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_REMOTE_MINE, 1, /*goto*/ 0x29) - reloop(0x08) - - label(0x29) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_REMOTE_MINE, 1, /*goto*/ 0x29) - endloop(0x08) - - label(0x29) - label(0x28) - goto_first(0x54) - - label(0x03) - yield - yield - yield - yield - yield - if_weapon_thrown(WEAPON_REMOTEMINE, /*goto*/ 0x04) - goto_first(0x11) - - label(0x04) - restart_timer - - beginloop(0x05) - if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORTOP, /*goto*/ 0x06) - if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORBOTTOM, /*goto*/ 0x08) - if_timer_gt(120, /*goto*/ 0x07) - endloop(0x05) - - label(0x08) - unset_savefile_flag(GAMEFILEFLAG_G5_MINE) - goto_next(0x03) - label(0x06) - set_savefile_flag(GAMEFILEFLAG_G5_MINE) - - label(0x03) - set_stage_flag(STAGEFLAG_MINE_PLACED) - show_hudmsg(CHR_P1P2, L_PETE_015) // "Mine placed correctly." - - // Check that the player hasn't detonated the mine - beginloop(0x2d) - if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORTOP, /*goto*/ 0x03) - if_weapon_thrown_on_object(WEAPON_REMOTEMINE, OBJ_FIREDOORBOTTOM, /*goto*/ 0x03) - goto_next(0x04) - label(0x03) - endloop(0x2d) - - label(0x04) - set_stage_flag(STAGEFLAG_MINE_WASTED) - show_hudmsg(CHR_P1P2, L_PETE_072) // "Remote Mine has been wasted." - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x07) - set_stage_flag(STAGEFLAG_MINE_WASTED) - show_hudmsg(CHR_P1P2, L_PETE_016) // "Mine placed incorrectly." - - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1026_uplink[] = { - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_TAXI, /*goto*/ 0x03) - reloop(0x10) - - label(0x03) - if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, FALSE, /*goto*/ 0x04) - show_hudmsg(CHR_P1P2, L_PETE_017) // "Virus already downloaded into NavComp." - reloop(0x10) - - label(0x04) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DATAUPLINK, /*goto*/ 0x03) - show_hudmsg(CHR_P1P2, L_PETE_018) // "Hovcab is unresponsive - need Reprogrammer." - reloop(0x10) - - // Uplinking - label(0x03) - show_hudmsg(CHR_P1P2, L_PETE_019) // "Accessing hovercab navigation systems." - assign_sound(SFX_0456, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_TAXI, TRUE) - restart_timer - - beginloop(0x05) - if_timer_gt(300, /*goto*/ 0x04) - if_chr_distance_to_pad_gt(CHR_P1P2, 350, PAD_PETE_00A3, /*goto*/ 0x06) - endloop(0x05) - - label(0x04) - show_hudmsg(CHR_P1P2, L_PETE_020) // "Virus downloaded successfully." - yield - show_hudmsg(CHR_P1P2, L_PETE_021) // "Hovercab navigation systems reprogrammed." - mute_channel(CHANNEL_7) - assign_sound(SFX_01C1, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_TAXI, TRUE) - yield - set_stage_flag(STAGEFLAG_TAXI_REPROGRAMMED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Moved away while uplinking - label(0x06) - show_hudmsg(CHR_P1P2, L_PETE_022) // "Connection to hovercab broken." - mute_channel(CHANNEL_7) - yield - yield - yield - assign_sound(SFX_0457, CHANNEL_4) - play_sound_from_object(CHANNEL_4, OBJ_TAXI, 1, 300, 400) - restart_timer - - beginloop(0x1d) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x1d) - - label(0x04) - mute_channel(CHANNEL_4) - endloop(0x10) - - endlist -}; - -u8 func040d_limo[] = { - begin_hovercar_path(0x02) - set_vehicle_speed(GOPOSFLAG_WALK, 0) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) - - // SA and PA - set_chr_maxdamage(CHR_SELF, 34464) - goto_next(0x04) - - // A - label(0x03) - set_chr_maxdamage(CHR_SELF, 65456) - - // All difficulties - label(0x04) - - // Wait for flag set, provided limo not destroyed - beginloop(0x05) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ 0x04) - endloop(0x05) - - label(0x04) - - // Wait until not in room - beginloop(0x2d) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0002, /*goto*/ 0x03) - if_chr_in_room(CHR_P1P2, 0x00, 0x0010, /*goto*/ 0x03) - if_chr_in_room(CHR_P1P2, 0x00, 0x0012, /*goto*/ 0x03) - goto_next(0x04) - label(0x03) - endloop(0x2d) - - label(0x04) - set_object_flag2(OBJ_LIMO, OBJFLAG2_04000000) - set_object_flag3(OBJ_LIMO, OBJFLAG3_00000010) - object_do_animation(ANIM_02D6, OBJ_LIMO, 0x04, 0xffff) - - assign_sound(SFX_BIKE_ENGINE, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_LIMO, 1, 2400, 3200) - if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ 0x03) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x03) - set_stage_flag(STAGEFLAG_LIMO_ESCAPED) - show_hudmsg(CHR_BOND, L_PETE_028) // "DataDyne limo has escaped." - label(0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_taxi[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) - - // SA and PA - set_chr_maxdamage(CHR_SELF, 34464) - goto_next(0x04) - - // A - label(0x03) - set_chr_maxdamage(CHR_SELF, 65456) - begin_hovercar_path(0x04) - set_vehicle_speed(GOPOSFLAG_WALK, 0) - - // All difficulties - label(0x04) - - beginloop(0x05) - if_stage_flag_eq(STAGEFLAG_TRIGGER_TAXI_LEAVE, TRUE, /*goto*/ 0x04) - label(0x03) - endloop(0x05) - - // Check taxi healthy - label(0x04) - if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Take off - label(0x03) - assign_sound(SFX_8000, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_TAXI, 1, 2400, 3200) - object_do_animation(ANIM_0168, OBJ_TAXI, 0x04, 0xffff) - set_object_flag2(OBJ_TAXI, OBJFLAG2_04000000) - - // Wait for flag - beginloop(0x06) - if_stage_flag_eq(STAGEFLAG_TAXI_ALMOST_READY_TO_CRASH, TRUE, /*goto*/ 0x04) - endloop(0x06) - - // Check taxi healthy - label(0x04) - if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - set_stage_flag(STAGEFLAG_TAXI_READY_TO_CRASH) - - // Wait for another flag - beginloop(0x07) - if_stage_flag_eq(STAGEFLAG_ROBOT_NEAR_CORNER, TRUE, /*goto*/ 0x04) - endloop(0x07) - - label(0x04) - label(0x38) - set_stage_flag(STAGEFLAG_TRIGGER_CRASH) - yield - mute_channel(CHANNEL_0) - object_do_animation(ANIM_0169, OBJ_TAXI, 0x04, 0xffff) - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define tracerbug_logic(chr, chr2) \ - set_chrpreset(chr) \ - if_difficulty_lt(DIFF_PA, /*goto*/ 0x54) \ - goto_next(0x04) \ - \ - /* A or SA */ \ - label(0x54) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - /* PA */ \ - label(0x04) \ - yield \ - \ - beginloop(0x11) \ - set_target_chr(chr2) \ - if_chr_deadish(chr, /*goto*/ 0x2f) \ - if_ammo_quantity_lt(chr, AMMOTYPE_BUG, 1, /*goto*/ 0x03) \ - label(0x04) \ - endloop(0x11) \ - \ - /* Dead - not sure why it checks this a second time */ \ - beginloop(0x2f) \ - set_target_chr(chr2) \ - if_chr_deadish(chr, /*goto*/ 0x30) \ - label(0x31) \ - yield \ - yield \ - yield \ - yield \ - yield \ - goto_first(0x11) \ - \ - label(0x30) \ - endloop(0x2f) \ - \ - /* Alive but has no bug */ \ - label(0x03) \ - yield \ - if_weapon_thrown(WEAPON_TRACERBUG, /*goto*/ 0x04) \ - goto_first(0x03) \ - \ - /* Check limo healthy */ \ - label(0x04) \ - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x04) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - label(0x04) \ - restart_timer \ - \ - beginloop(0x05) \ - if_weapon_thrown_on_object(WEAPON_TRACERBUG, OBJ_LIMO, /*goto*/ 0x06) \ - if_timer_gt(120, /*goto*/ 0x07) \ - endloop(0x05) \ - \ - label(0x06) \ - set_stage_flag(STAGEFLAG_TRACERBUG_PLACED) \ - unset_stage_flag(STAGEFLAG_TRACERBUG_WASTED) \ - show_hudmsg(chr, 0x3217) /* "Tracer Bug placed correctly." */ \ - restart_timer \ - \ - beginloop(0x08) \ - if_timer_gt(300, /*goto*/ 0x04) \ - goto_first(0x08) \ - \ - label(0x04) \ - set_stage_flag(STAGEFLAG_TRACERBUG_SAFE) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - /* Bug wasted */ \ - label(0x07) \ - if_stage_flag_eq(STAGEFLAG_ONE_BUG_REMAINING, TRUE, /*goto*/ 0x03) \ - set_stage_flag(STAGEFLAG_ONE_BUG_REMAINING) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - label(0x03) \ - set_stage_flag(STAGEFLAG_TRACERBUG_WASTED) \ - show_hudmsg(chr, 0x3218) /* "Tracer Bug placed incorrectly." */ \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 func1004_tracerbug_bond[] = { - tracerbug_logic(CHR_BOND, CHR_BOND) - endlist -}; - -u8 func1011_trackerbug_coop[] = { - yield - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x03) - goto_next(0x04) - - label(0x03) - set_stage_flag(STAGEFLAG_ONE_BUG_REMAINING) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x04) - tracerbug_logic(CHR_COOP, CHR_PRESET) - endlist -}; - -u8 func1005_check_things_destroyed[] = { - beginloop(0x10) - // Check limo - if_stage_flag_eq(STAGEFLAG_LIMO_DESTROYED, TRUE, /*goto*/ 0x03) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - set_stage_flag(STAGEFLAG_LIMO_DESTROYED) - mute_channel(CHANNEL_1) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) - show_hudmsg(CHR_BOND, L_PETE_025) // "Mission critical vehicle destroyed." - - // Check taxi - label(0x03) - if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) - if_stage_flag_eq(STAGEFLAG_TAXI_DESTROYED, TRUE, /*goto*/ 0x03) - if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) - mute_channel(CHANNEL_0) - set_stage_flag(STAGEFLAG_TAXI_DESTROYED) - show_hudmsg(CHR_BOND, L_PETE_025) // "Mission critical vehicle destroyed." - - // Check robot - label(0x03) - if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) - if_stage_flag_eq(STAGEFLAG_ROBOT_DESTROYED, TRUE, /*goto*/ 0x03) - if_chr_dead(CHR_ROBOT, /*goto*/ 0x04) - goto_next(0x03) - - label(0x04) - restart_timer - - beginloop(0x05) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x05) - - label(0x04) - set_stage_flag(STAGEFLAG_ROBOT_DESTROYED) - show_hudmsg(CHR_BOND, L_PETE_025) // "Mission critical vehicle destroyed." - label(0x03) - endloop(0x10) - - endlist -}; - -u8 func1006_check_for_end[] = { - beginloop(0x05) - chr_toggle_p1p2(CHR_SELF) - if_objective_complete(0, /*goto*/ 0x03) - reloop(0x05) - - label(0x03) - if_objective_complete(3, /*goto*/ 0x03) - reloop(0x05) - - label(0x03) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) - if_objective_complete(2, /*goto*/ 0x03) - reloop(0x05) - - label(0x03) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0a) - if_objective_complete(1, /*goto*/ 0x0a) - reloop(0x05) - - label(0x0a) - if_chr_distance_to_pad_lt(CHR_P1P2, 350, PAD_PETE_00A7, /*goto*/ 0x04) - endloop(0x05) - - label(0x04) - set_stage_flag(STAGEFLAG_IN_ELEVATOR) - yield - yield - set_invincible(CHR_BOND) - revoke_control(CHR_BOND, 4) - - // But there is no countdown timer... - hide_countdown_timer - stop_countdown_timer - - if_all_objectives_complete(/*goto*/ 0x05) - - // Objectives failed - show_hudmsg(CHR_P1P2, L_PETE_026) // "MISSION FAILED" - label(0x03) - restart_timer - - beginloop(0x13) - if_timer_gt(280, /*goto*/ 0x12) - endloop(0x13) - - label(0x12) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Objectives complete - label(0x05) - if_chr_deadish(CHR_BOND, /*goto*/ 0x03) - goto_next(0x04) - - label(0x03) - if_chr_deadish(CHR_COOP, /*goto*/ 0x03) - goto_next(0x04) - - label(0x03) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x04) - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_limo_timing[] = { - // Wait for any of the following: - // - Taxi reprogrammed - // - Tracer bug placed and robot on drain street - // - 2 minutes elapsed and robot on drain street (3 mins on Agent) - restart_timer - - beginloop(0x05) - if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, TRUE, /*goto*/ 0x04) - if_stage_flag_eq(STAGEFLAG_ROBOT_ON_DRAIN_STREET, TRUE, /*goto*/ 0x03) - reloop(0x05) - - label(0x03) - if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ 0x04) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x07) - if_difficulty_gt(DIFF_A, /*goto*/ 0x06) - - // A - 3 minute timer - if_timer_gt(10800, /*goto*/ 0x04) - reloop(0x05) - - // SA - 2 minute timer - label(0x06) - if_timer_gt(7200, /*goto*/ 0x04) - reloop(0x05) - - // PA - 2 minute timer - label(0x07) - if_timer_gt(7200, /*goto*/ 0x04) - endloop(0x05) - - // Ready to leave - label(0x04) - set_stage_flag(STAGEFLAG_LIMO_READY_TO_LEAVE) - restart_timer - - // Wait 15 seconds - beginloop(0x0a) - if_timer_gt(900, /*goto*/ 0x04) - endloop(0x0a) - - label(0x04) - set_stage_flag(STAGEFLAG_LIMO_READY_15SEC_AGO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_taxi_timing[] = { - // Wait for both conditions - beginloop(0x07) - if_stage_flag_eq(STAGEFLAG_ROBOT_ON_DRAIN_STREET, TRUE, /*goto*/ 0x03) - reloop(0x07) - - label(0x03) - if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, TRUE, /*goto*/ 0x03) - endloop(0x07) - - // Wait 3.3 seconds - label(0x03) - restart_timer - - beginloop(0x05) - if_timer_gt(200, /*goto*/ 0x04) - endloop(0x05) - - label(0x04) - set_stage_flag(STAGEFLAG_TRIGGER_TAXI_LEAVE) - restart_timer - - // Wait 10 seconds - beginloop(0x06) - if_timer_gt(600, /*goto*/ 0x04) - endloop(0x06) - - label(0x04) - set_stage_flag(STAGEFLAG_TAXI_ALMOST_READY_TO_CRASH) - unset_object_flag2(OBJ_TAXI, OBJFLAG2_04000000) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_cia[] = { - set_returnlist(CHR_SELF, AILIST_CIA) - set_shotlist(AILIST_CIA) - if_chr_deadish(CHR_SELF, /*goto*/ 0x04) - goto_next(0x03) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - if_chr_idle(/*goto*/ 0x43) - if_num_times_shot_lt(1, /*goto*/ 0x10) - - // Has been shot - beginloop(0x0d) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x0d) - - label(0x04) - goto_next(0x0c) - - // Unreachable - restart_timer - - // Chr is idle - beginloop(0x43) - if_saw_death(0x00, /*goto*/ 0x1d) - if_saw_injury(0x00, /*goto*/ 0x1e) - if_timer_gt(180, /*goto*/ 0x04) - endloop(0x43) - - // Idle + 3 seconds - label(0x04) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x54) - stop_chr - goto_next(0x10) - - // Patroller - label(0x54) - start_patrol - - // Not shot, not a patroller, or patroller who has started his path - label(0x10) - yield - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x37) - call_rng - if_rand_gt(128, /*goto*/ 0x37) - label(0x2d) - restart_timer - label(0x08) - stop_chr - if_self_flag_bankx_eq(CHRFLAG1_DONE_SEARCH_ANIM, TRUE, BANK_1, /*goto*/ 0x03) - call_rng - if_rand_gt(128, /*goto*/ 0x03) - call_rng - if_rand_lt(64, /*goto*/ 0x50) - if_rand_lt(128, /*goto*/ 0x51) - if_rand_lt(196, /*goto*/ 0x52) - set_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - chr_do_animation(ANIM_SMOKE_CIGARETTE, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x36) - - label(0x50) - chr_do_animation(ANIM_SCRATCH_HEAD, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x36) - - label(0x51) - chr_do_animation(ANIM_YAWN, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x36) - - label(0x52) - chr_do_animation(ANIM_GRAB_CROTCH, 0, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x36) - - label(0x53) - chr_do_animation(ANIM_TWO_GUN_HOLD, 0, 100, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x36) - - label(0x03) - unset_self_flag_bankx(CHRFLAG1_DONE_SEARCH_ANIM, BANK_1) - if_room_onscreen(0x003e, /*goto*/ 0x04) - set_padpreset(PAD_PETE_00BA) - goto_next(0x03) - - label(0x04) - call_rng - if_rand_lt(64, /*goto*/ 0x50) - if_rand_lt(128, /*goto*/ 0x51) - if_rand_lt(196, /*goto*/ 0x52) - try_set_target_pad_to_something(0x08, /*goto*/ 0x03) - label(0x50) - try_set_target_pad_to_something(0x02, /*goto*/ 0x03) - label(0x51) - try_set_target_pad_to_something(0x04, /*goto*/ 0x03) - label(0x52) - try_set_target_pad_to_something(0x08, /*goto*/ 0x03) - goto_next(0x36) - - label(0x03) - go_to_target_pad(GOPOSFLAG_WALK) - - beginloop(0x36) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_saw_death(0x00, /*goto*/ 0x1d) - if_saw_injury(0x00, /*goto*/ 0x1e) - if_target_in_sight(/*goto*/ 0x04) - if_chr_stopped(/*goto*/ 0x35) - endloop(0x36) - - label(0x35) - goto_first(0x10) - - label(0x37) - if_saw_death(0x00, /*goto*/ 0x1d) - if_saw_injury(0x00, /*goto*/ 0x1e) - if_target_in_sight(/*goto*/ 0x04) - goto_first(0x10) - - label(0x04) - restart_timer - label(0x05) - yield - if_saw_death(0x00, /*goto*/ 0x1d) - if_saw_injury(0x00, /*goto*/ 0x1e) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_UNARMED, /*goto*/ 0x03) - goto_next(0x04) - - label(0x03) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x03) - if_distance_to_target_gt(450, /*goto*/ 0x03) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_returnlist(CHR_SELF, AILIST_CIA) - set_ailist(CHR_SELF, GAILIST_CIVILIAN_SAY_COMMENT) - - label(0x03) - if_timer_lt(600, /*goto*/ 0x03) - unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - label(0x03) - goto_first(0x10) - - label(0x1e) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x04) - if_timer_gt(40, /*goto*/ 0x04) - endloop(0x09) - - // Saw a death - label(0x1d) - restart_timer - chr_do_animation(ANIM_LOOK_AROUND_FRANTIC, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - // Shot near chr, or follow through from above - beginloop(0x1e) - if_timer_gt(90, /*goto*/ 0x0c) - endloop(0x1e) - - label(0x04) - increase_squadron_alertness(100) - - beginloop(0x38) - if_chr_in_squadron_doing_action(MA_TALKING, /*goto*/ 0x04) - goto_next(0x03) - - // A civilian is cowering - label(0x04) - restart_timer - - beginloop(0x3a) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x3a) - - label(0x04) - set_self_flag_bankx(CHRFLAG0_CHUCKNORRIS, BANK_0) - set_squadron(SQUADRON_03) - endloop(0x38) - - label(0x03) - rebuild_teams - rebuild_squadrons - set_action(MA_TALKING, FALSE) - say_quip(CHR_BOND, 0x18, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) - chr_do_animation(ANIM_SURRENDER_002E, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x0c) - endloop(0x0a) - - // Alerted - label(0x0c) - set_action(MA_NORMAL, FALSE) - if_self_flag_bankx_eq(CHRFLAG0_CHUCKNORRIS, FALSE, BANK_0, /*goto*/ 0x03) - set_squadron(SQUADRON_04) - rebuild_teams - rebuild_squadrons - label(0x03) - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x04) - goto_next(0x0b) - - label(0x03) - goto_first(0x05) - - label(0x04) - set_chr_team(CHR_SELF, TEAM_NONCOMBAT) - rebuild_teams - rebuild_squadrons - try_run_to_chr(CHR_PRESET, /*goto*/ 0x06) - - beginloop(0x06) - if_distance_to_chr_lt(2520, CHR_HIDDENGUY, /*goto*/ 0x03) - reloop(0x06) - - label(0x03) - if_detected_chr(CHR_PRESET, /*goto*/ 0x04) - endloop(0x06) - - label(0x04) - increase_squadron_alertness(100) - say_quip(CHR_BOND, 0x19, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) - label(0x0b) - set_chr_team(CHR_SELF, TEAM_NONCOMBAT) - rebuild_teams - rebuild_squadrons - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2d) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2f) - run_to_pad(PAD_PETE_00C8) - goto_next(0x07) - - label(0x2d) - run_to_pad(PAD_PETE_005A) - goto_next(0x07) - - label(0x2f) - run_to_pad(PAD_PETE_0026) - label(0x07) - yield - if_chr_stopped(/*goto*/ 0x04) - label(0x03) - goto_first(0x07) - - label(0x04) - - label(0x0e) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x03) - endloop(0x0f) - - label(0x03) - goto_first(0x0e) - - endlist -}; - -u8 func0413_bugspotter[] = { -#define LABEL_RUN_AWAY 0x0d - - set_alertness(255) - set_shotlist(AILIST_BUGSPOTTER) - if_chr_deadish(CHR_SELF, /*goto*/ 0x04) - goto_next(0x03) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - - // Wait until player in sight (mainly) - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x04) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - goto_next(LABEL_RUN_AWAY) - label(0x03) - endloop(0x10) - - // Player in sight - face them - label(0x04) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x04) - if_timer_gt(40, /*goto*/ 0x04) - endloop(0x09) - - // Make a comment - label(0x04) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_UNARMED, /*goto*/ 0x03) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_NONE, /*goto*/ 0x03) - say_quip(CHR_BOND, 0x1a, 0xff, 0x0a, 0xff, 0x81, 0x00, 0x00) - goto_next(0x04) - label(0x03) - say_quip(CHR_BOND, 0x17, 0xff, 0x0a, 0xff, 0x81, 0x00, 0x00) - label(0x04) - chr_do_animation(ANIM_TALKING_00A3, 0, -1, 0, 16, CHR_SELF, 2) - - // Looks like he spots if the tracer bug if he sees Jo within 8.3 seconds of - // the bug landing on the limo. - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - goto_next(LABEL_RUN_AWAY) - - label(0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x03) - goto_next(0x0a) - label(0x03) - if_stage_flag_eq(STAGEFLAG_TRACERBUG_SAFE, TRUE, /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ 0x04) - label(0x0a) - if_timer_gt(500, /*goto*/ 0x03) - endloop(0x08) - - label(0x03) - if_stage_flag_eq(STAGEFLAG_TRACERBUG_PLACED, TRUE, /*goto*/ LABEL_RUN_AWAY) - goto_first(0x10) - - // Bug was thrown recently - label(0x04) - chr_do_animation(ANIM_TALKING_00A3, 0, -1, 0, 16, CHR_SELF, 2) - assign_sound(SFX_044A, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - set_stage_flag(STAGEFLAG_TRACERBUG_SPOTTED) - show_hudmsg(CHR_BOND, L_PETE_067) // "Tracer Bug has been spotted." - - // Wait for talking animation to finish - beginloop(0x05) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - goto_next(LABEL_RUN_AWAY) - label(0x03) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x05) - - // Find another guard and run to them - label(0x04) - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x04) - goto_next(0x0b) - - label(0x04) - try_run_to_chr(CHR_PRESET, /*goto*/ 0x06) - - // Wait until detected target guard - beginloop(0x06) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - goto_next(LABEL_RUN_AWAY) - label(0x03) - if_detected_chr(CHR_PRESET, /*goto*/ 0x04) - endloop(0x06) - - // Alert everyone in group - label(0x04) - increase_squadron_alertness(100) - assign_sound(SFX_0467, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - - // No other guard to run to - label(0x0b) - retreat(GOPOSFLAG_RUN, 2) - - beginloop(0x07) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_stage_flag_eq(STAGEFLAG_TAXI_READY_TO_CRASH, TRUE, /*goto*/ LABEL_RUN_AWAY) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - goto_next(LABEL_RUN_AWAY) - label(0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_nearly_in_targets_sight(30, /*goto*/ 0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_nearly_in_targets_sight(30, /*goto*/ 0x03) - goto_next(0x04) - label(0x03) - goto_first(0x07) - - label(0x04) - restart_timer - - beginloop(0x0e) - if_timer_gt(10, /*goto*/ 0x03) - endloop(0x0e) - - label(0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_nearly_in_targets_sight(30, /*goto*/ 0x03) - goto_next(0x04) - label(0x03) - goto_first(0x07) - - label(0x04) - unset_self_chrflag(CHRCFLAG_KILLCOUNTABLE) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - yield - drop_gun_and_fade_out - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(LABEL_RUN_AWAY) - jog_to_pad(PAD_PETE_004F) - - beginloop(0x0e) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x0e) - - label(0x04) - stop_chr - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define init_patroller(pathid) \ - set_chr_dodge_rating(2, 10) \ - set_accuracy(4) \ - set_reaction_speed(30) \ - set_chr_maxdamage(CHR_SELF, 40) \ - add_health_or_armor(0) \ - set_recovery_speed(0) \ - set_shield(0) \ - assign_path(pathid) \ - start_patrol \ - set_ailist(CHR_SELF, GAILIST_UNALERTED) \ - \ - beginloop(0x04) \ - endloop(0x04) - -u8 func0414_start_path07[] = { - init_patroller(0x07) - endlist -}; - -u8 func0415_start_path08[] = { - init_patroller(0x08) - endlist -}; - -u8 func0416_start_path09[] = { - init_patroller(0x09) - endlist -}; - -u8 func0417_start_path10[] = { - init_patroller(0x0a) - endlist -}; - -u8 func0418_start_path11[] = { - init_patroller(0x0b) - endlist -}; - -/** - * This chr waits 2 seconds before starting his path. - */ -u8 func0419_init_cia1[] = { - restart_timer - - beginloop(0x05) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x05) - - label(0x04) - assign_path(12) - start_patrol - set_ailist(CHR_SELF, AILIST_CIA) - - beginloop(0x04) - endloop(0x04) - - endlist -}; - -u8 func041d_fbi[] = { - set_shotlist(AILIST_FBI) - if_chr_deadish(CHR_SELF, /*goto*/ 0x04) - goto_next(0x03) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - if_num_times_shot_lt(1, /*goto*/ 0x19) - - // Shot - wait for animation to finish - beginloop(0x05) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x05) - - label(0x04) - goto_next(0x17) - - // Unreachable - label(0x04) - say_quip(CHR_BOND, 0x1b, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) - increase_squadron_alertness(100) - goto_next(0x16) - - // Not shot - label(0x19) - set_action(MA_NORMAL, TRUE) - yield - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0x04) - goto_next(0x16) - - label(0x04) - if_target_in_sight(/*goto*/ 0x18) - if_near_miss(/*goto*/ 0x18) - if_num_times_shot_gt(0, /*goto*/ 0x18) - if_hears_target(/*goto*/ 0x16) - if_saw_injury(0x00, /*goto*/ 0x16) - if_saw_death(0x00, /*goto*/ 0x16) - if_sees_suspicious_item(/*goto*/ 0x16) - endloop(0x19) - - label(0x16) - if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, FALSE, /*goto*/ 0x04) - - // Draw magnum and go after player - label(0x17) - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x03) - label(0x03) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(0x04) - try_jog_to_target(/*goto*/ 0x06) - - beginloop(0x06) - if_distance_to_target_lt(500, /*goto*/ 0x18) - if_target_in_sight(/*goto*/ 0x18) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x18) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - endloop(0x06) - - label(0x18) - if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, FALSE, /*goto*/ 0x04) - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x03) - label(0x03) - set_ailist(CHR_SELF, GAILIST_ALERTED) - - label(0x04) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0d) - - beginloop(0x0d) - if_target_in_fov_left(10, /*goto*/ 0x04) - if_timer_gt(40, /*goto*/ 0x04) - endloop(0x0d) - - label(0x04) - say_quip(CHR_BOND, 0x1b, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00) - chr_do_animation(ANIM_0266, 0, 193, 0, 16, CHR_SELF, 2) - - beginloop(0x0e) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) - if_chr_not_talking(CHR_SELF, /*goto*/ 0x04) - label(0x03) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x0e) - - label(0x04) - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x10000000, /*goto*/ 0x04) - label(0x04) - yield - set_stage_flag(STAGEFLAG_ALARM_SOUNDED) - activate_alarm - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -#define check_cia_dead(chr) \ - beginloop(0x10) \ - if_chr_dead(chr, /*goto*/ 0x05) \ - endloop(0x10) \ - \ - /* Unreachable */ \ - label(0x03) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - label(0x05) \ - set_stage_flag(STAGEFLAG_CIVILIAN_DEAD) \ - show_hudmsg(CHR_BOND, 0x321d) /* "Mission failed - unacceptable civilian casualties." */ \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 func1009_check_cia1_dead[] = { - check_cia_dead(CHR_CIA1) - endlist -}; - -/** - * This guy is allowed to be killed once he has a certain flag. - */ -u8 func100a_check_cia2_dead[] = { - beginloop(0x10) - if_chr_has_flag_bankx(CHR_CIA2, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0, /*goto*/ 0x03) - if_chr_dead(CHR_CIA2, /*goto*/ 0x05) - endloop(0x10) - - // Stop checking this chr - label(0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x05) - set_stage_flag(STAGEFLAG_CIVILIAN_DEAD) - show_hudmsg(CHR_BOND, L_PETE_029) // "Mission failed - unacceptable civilian casualties." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_cia3_dead[] = { - check_cia_dead(CHR_CIA3) - endlist -}; - -u8 func100c_check_cia4_dead[] = { - check_cia_dead(CHR_CIA4) - endlist -}; - -u8 func041b_init_robot[] = { - set_accuracy(40) - set_shield(100) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) - set_ailist(CHR_SELF, AILIST_ROBOT) - endlist -}; - -u8 func041a_robot[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_chr_maxdamage(CHR_SELF, VERSION >= VERSION_NTSC_1_0 ? 1 : 40) - if_chr_dead(CHR_SELF, /*goto*/ 0x0c) - assign_path(0) - start_patrol - - beginloop(0x02) - set_target_chr(CHR_HIDDENGUY) - if_target_moving_closer(/*goto*/ 0x03) - unset_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) - goto_next(0x04) - - label(0x03) - set_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) - - label(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x01) - if_target_in_sight(/*goto*/ 0x08) - call_rng - if_rand_gt(5, /*goto*/ 0x03) - if_sound_finished(CHANNEL_5, /*goto*/ 0x04) - goto_next(0x03) - - label(0x04) - call_rng - if_rand_lt(86, /*goto*/ 0x06) - if_rand_lt(172, /*goto*/ 0x07) - assign_sound(SFX_046A, CHANNEL_5) - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) - goto_next(0x03) - - label(0x06) - assign_sound(SFX_046B, CHANNEL_5) - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) - goto_next(0x03) - - label(0x07) - assign_sound(SFX_046C, CHANNEL_5) - play_sound_from_entity(CHANNEL_5, CHR_SELF, 0x0bb8, 0x1770, 0x01) - label(0x03) - - if_patrolling(/*goto*/ 0x03) - start_patrol - label(0x03) - reloop(0x02) - - label(0x08) - restart_timer - stop_chr - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x05) - play_sound(MP3_ROBOT_STOP_WHERE_YOU_ARE, -1) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - label(0x05) - if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x03) - goto_next(0x05) - - label(0x03) - if_self_flag_bankx_eq(CHRFLAG0_FORCESAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x05) - play_sound(MP3_ROBOT_ALERT_UNDER_ATTACK, -1) - set_self_flag_bankx(CHRFLAG0_FORCESAFETYCHECKS, BANK_0) - - beginloop(0x05) - set_target_chr(CHR_HIDDENGUY) - if_target_moving_closer(/*goto*/ 0x03) - unset_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) - goto_next(0x04) - label(0x03) - set_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) - label(0x04) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x01) - if_timer_gt(120, /*goto*/ 0x04) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ 0x2a) - if_target_in_sight(/*goto*/ 0x03) - label(0x2a) - endloop(0x05) - - label(0x03) - set_target_chr(CHR_P1P2) - restart_timer - try_attack_stand(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - reloop(0x02) - - beginloop(0x09) - unset_stage_flag(STAGEFLAG_ROBOT_NEAR_HOME) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x01) - if_timer_gt(60, /*goto*/ 0x04) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x09) - - label(0x04) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - start_patrol - endloop(0x02) - - label(0x0c) - assign_sound(MP3_ROBOT_ALERT_UNDER_ATTACK, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x01) - label(0x04) - label(0x38) - set_chr_chrflag(CHR_ROBOT, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ROBOT, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ROBOT, CHRHFLAG_00020000) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) -#if VERSION >= VERSION_NTSC_1_0 - set_ailist(CHR_ROBOT, GAILIST_IDLE) -#endif - set_shield(0) - chr_do_animation(ANIM_016A, 0, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_SELF, 4) - - beginloop(0x2d) - if_chr_stopped(/*goto*/ 0x04) - goto_first(0x2d) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041e_sealer1[] = { -#define LABEL_ALERTED 0x18 - - set_chr_dodge_rating(2, 10) - set_accuracy(4) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_shotlist(GAILIST_IDLE) - - beginloop(0x19) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_stage_flag_eq(STAGEFLAG_CRASH_FINISHED, TRUE, /*goto*/ 0x03) - if_alertness(100, OPERATOR_LESS_THAN, /*goto*/ 0x04) - goto_next(LABEL_ALERTED) - - label(0x04) - if_target_in_sight(/*goto*/ LABEL_ALERTED) - if_near_miss(/*goto*/ LABEL_ALERTED) - if_num_times_shot_gt(0, /*goto*/ LABEL_ALERTED) - if_hears_target(/*goto*/ LABEL_ALERTED) - if_saw_injury(0x00, /*goto*/ LABEL_ALERTED) - if_saw_death(0x00, /*goto*/ LABEL_ALERTED) - if_sees_suspicious_item(/*goto*/ LABEL_ALERTED) - endloop(0x19) - - // Crash happened - label(0x03) - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE) - jog_to_pad(PAD_PETE_00C4) - set_ailist(CHR_SEALER2, AILIST_JOG_TO_ACCIDENT) - set_ailist(CHR_SEALER3, AILIST_JOG_TO_ACCIDENT) - set_ailist(CHR_SEALER4, AILIST_JOG_TO_ACCIDENT) - - beginloop(0x0d) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) - if_chr_stopped(/*goto*/ 0x04) - endloop(0x0d) - - // At crash site - label(0x04) - restart_timer - - beginloop(0x0c) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x03) - if_timer_gt(120, /*goto*/ 0x04) - endloop(0x0c) - - label(0x03) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - // Conversation - label(0x04) - assign_sound(SFX_814B, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - chr_do_animation(ANIM_TALKING_0098, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SELF, 2) - restart_timer - - beginloop(0x07) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - if_timer_gt(120, /*goto*/ 0x03) - endloop(0x07) - - label(0x03) - assign_sound(SFX_044F, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - chr_do_animation(ANIM_TALKING_0231, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SELF, 2) - - beginloop(0x08) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - if_sound_finished(CHANNEL_6, /*goto*/ 0x03) - goto_first(0x08) - - label(0x03) - assign_sound(SFX_0450, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - chr_do_animation(ANIM_TALKING_0233, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER3, 2) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) - restart_timer - - beginloop(0x09) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - if_timer_gt(180, /*goto*/ 0x03) - goto_first(0x09) - - label(0x03) - assign_sound(SFX_0451, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - chr_do_animation(ANIM_TALKING_0232, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER3, 2) - restart_timer - - beginloop(0x0a) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - if_timer_gt(120, /*goto*/ 0x03) - goto_first(0x0a) - - label(0x03) - assign_sound(SFX_0452, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - chr_do_animation(ANIM_TALKING_0234, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER3, 2) - chr_do_animation(ANIM_TWO_GUN_HOLD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_SEALER1, 2) - - beginloop(0x0b) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x04) - if_saw_injury(0x00, /*goto*/ 0x04) - if_sound_finished(CHANNEL_6, /*goto*/ 0x04) - endloop(0x0b) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - // Alerted - seal elevator - label(LABEL_ALERTED) - label(0x04) - close_door(0x10) - close_door(0x11) - lock_door(0x10, 0x02) - lock_door(0x11, 0x02) - set_stage_flag(STAGEFLAG_ELEVATOR_SEALED) - assign_sound(SFX_0469, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - show_hudmsg(CHR_BOND, L_PETE_033) // "Elevator access sealed." - chr_do_animation(ANIM_STANDING_TYPE_ONE_HAND, 0, 193, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x06) - if_chr_stopped(/*goto*/ 0x04) - goto_first(0x06) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func100d_spawn_alarm_responders[] = { - restart_timer - beginloop(0x05) - if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, TRUE, /*goto*/ 0x03) - endloop(0x05) - - label(0x03) - restart_timer - play_sound(MP3_02F0, -1) // "Attention all personnel" - - beginloop(0x1d) - if_timer_gt(200, /*goto*/ 0x03) - endloop(0x1d) - - label(0x03) - restart_timer - play_sound(MP3_02F1, -1) // "Locate and apprehend fugitive" - - beginloop(0x1e) - if_timer_gt(120, /*goto*/ 0x03) - endloop(0x1e) - - label(0x03) - play_x_track(XREASON_DEFAULT, 10, 60) - goto_next(0x04) - - // When the alarm sounds, there are 4 groups of people who respond. - // Each group has 4 guards, and the entire group must be dead before the - // next group is spawned. There is a 15 second delay between groups. - // Each group spawns at a different location. - - #define spawn_group(pad) \ - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ - label(0x04) \ - yield \ - yield \ - yield \ - yield \ - yield \ - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ - label(0x04) \ - yield \ - yield \ - yield \ - yield \ - yield \ - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ - label(0x04) \ - yield \ - yield \ - yield \ - yield \ - yield \ - try_spawn_chr_at_pad(BODY_G5_SWAT_GUARD, HEAD_RANDOM, pad, AILIST_ALARM_RESPONDER, SPAWNFLAG_00000200, /*goto*/ 0x04) \ - label(0x04) - - label(0x07) - unlock_door(0x14, 0x04) - restart_timer - if_stage_flag_eq(STAGEFLAG_ALARM_GROUP1_DEAD, TRUE, /*goto*/ 0x08) - - // Spawn group 1 - spawn_group(0x0067) - goto_next(0x06) - - // Group 1 is already done - label(0x08) - unlock_door(0x15, 0x04) - unlock_door(0x16, 0x04) - if_stage_flag_eq(STAGEFLAG_ALARM_GROUP2_DEAD, TRUE, /*goto*/ 0x09) - - // Spawn group 2 - spawn_group(0x00c2) - goto_next(0x06) - - // Groups 1 and 2 are done - label(0x09) - unlock_door(0x17, 0x04) - unlock_door(0x18, 0x04) - if_stage_flag_eq(STAGEFLAG_ALARM_GROUP3_DEAD, TRUE, /*goto*/ 0x0a) - - // Spawn group 3 - spawn_group(0x00c3) - goto_next(0x06) - - // Groups 1, 2 and 3 are done - // Spawn group 3 - label(0x0a) - unlock_door(0x19, 0x04) - spawn_group(0x00c1) - goto_next(0x06) - - // Wait until group is dead - beginloop(0x06) - if_all_chrs_in_squadron_are_dead(GROUP_ALARM_RESPONDER, /*goto*/ 0x04) - endloop(0x06) - - // Set this group as dead - label(0x04) - if_stage_flag_eq(STAGEFLAG_ALARM_GROUP1_DEAD, TRUE, /*goto*/ 0x04) - set_stage_flag(STAGEFLAG_ALARM_GROUP1_DEAD) - goto_next(0x03) - - label(0x04) - if_stage_flag_eq(STAGEFLAG_ALARM_GROUP2_DEAD, TRUE, /*goto*/ 0x04) - set_stage_flag(STAGEFLAG_ALARM_GROUP2_DEAD) - goto_next(0x03) - - label(0x04) - if_stage_flag_eq(STAGEFLAG_ALARM_GROUP3_DEAD, TRUE, /*goto*/ 0x04) - set_stage_flag(STAGEFLAG_ALARM_GROUP3_DEAD) - goto_next(0x03) - - label(0x04) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Wait 15 seconds - label(0x03) - restart_timer - - beginloop(0x2d) - if_timer_gt(900, /*goto*/ 0x04) - endloop(0x2d) - - // Loop again to trigger next group - label(0x04) - goto_first(0x07) - - endlist -}; - -u8 func041f_alarm_responder[] = { - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_self_flag_bankx(CHRFLAG0_CANLOSEGUN, BANK_0) - set_chr_dodge_rating(2, 10) - set_accuracy(14) - set_reaction_speed(20) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - try_equip_weapon(MODEL_CHRDY357, WEAPON_DY357MAGNUM, 0x00000000, /*goto*/ 0x04) - label(0x04) - set_chr_team(CHR_SELF, TEAM_20) - set_squadron(GROUP_ALARM_RESPONDER) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_00008000, BANK_0) - set_alertness(90) - set_self_chrflag(CHRCFLAG_00000200) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -u8 func0420_jog_to_accident[] = { - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_PASSIVE) - label(0x03) - go_to_target_pad(GOPOSFLAG_JOG) - - // This is a bit weird. I'm pretty sure the set_ailist causes this - // function to stop. But because the guard has been issued the - // go_to_target_pad command, he'll continue to do so while running the - // unalerted function. - label(0x0d) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - yield - if_chr_stopped(/*goto*/ 0x04) - goto_first(0x0d) - - label(0x04) - endlist -}; - -u8 func040a_intro_from_gameplay[] = { - set_ailist(CHR_SELF, 0x040a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_setup_robot_noise[] = { -#if VERSION >= VERSION_NTSC_1_0 - play_sound_from_object2(CHANNEL_2, CHR_ROBOT, SFX_80B9, 0x00, 0x02) -#else - play_sound(SFX_80B9, CHANNEL_2) - play_sound_from_object(CHANNEL_2, CHR_ROBOT, 0, 900, 1500) -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Not sure why it would give briefcases to the players. - * Note this is a coop/counterop only function. - */ -u8 func1400_give_briefcases[] = { - yield - set_chr_team(CHR_ANTI, TEAM_20) - set_chr_chrflag(CHR_TOPSTAIRS, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - set_chr_chrflag(CHR_TOPSTAIRS, CHRCFLAG_LOSEXTRAHEIGHT) - set_chr_chrflag(0x0a, CHRCFLAG_LOSEXTRAHEIGHT) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x03) - - // PA - give_object_to_chr(OBJ_BRIEFCASE3, CHR_BOND) - - // All difficulties - label(0x03) - give_object_to_chr(OBJ_BRIEFCASE4, CHR_BOND) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x03) - - if_difficulty_lt(DIFF_PA, /*goto*/ 0x04) - - // PA - give_object_to_chr(OBJ_BRIEFCASE5, CHR_COOP) - - // All difficulties - label(0x04) - give_object_to_chr(OBJ_BRIEFCASE6, CHR_COOP) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - - // Velvet doesn't exist - label(0x03) - disable_object(OBJ_BRIEFCASE3) - disable_object(OBJ_BRIEFCASE5) - disable_object(OBJ_BRIEFCASE6) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1002_rebuild_groups[] = { - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1010_elevator_switch[] = { - yield - open_door(0x10) - open_door(0x11) - yield - - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_SWITCH, /*goto*/ 0x03) - if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x04) - label(0x04) - endloop(0x10) - - label(0x03) - close_door(0x10) - close_door(0x11) - lock_door(0x10, 0x02) - lock_door(0x11, 0x02) - if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x04) - show_hudmsg(CHR_P1P2, L_PETE_033) // "Elevator access sealed." - set_stage_flag(STAGEFLAG_ELEVATOR_SEALED) - goto_first(0x10) - - label(0x04) - show_hudmsg(CHR_P1P2, L_PETE_048) // "Elevator door cannot be reopened." - goto_first(0x10) - - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_CIA1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_CIA2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_CIA3, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_CIA4, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1014_crash[] = { - beginloop(0x02) - if_stage_flag_eq(STAGEFLAG_TRIGGER_CRASH, TRUE, /*goto*/ 0x04) - endloop(0x02) - - label(0x04) - restart_timer - - beginloop(0x09) - if_timer_gt(230, /*goto*/ 0x04) - endloop(0x09) - - label(0x04) - move_object_to_pad(OBJ_MINE1, PAD_PETE_0029) - destroy_object(OBJ_MINE1) - set_stage_flag(STAGEFLAG_DIVERSION_CREATED) - show_hudmsg(CHR_BOND, L_PETE_054) // "Diversion has been created." - destroy_object(OBJ_TAXI) - restart_timer - - beginloop(0x0a) - if_timer_gt(180, /*goto*/ 0x04) - endloop(0x0a) - - label(0x04) - move_object_to_pad(OBJ_MINE2, PAD_PETE_001C) - destroy_object(OBJ_MINE2) - set_stage_flag(STAGEFLAG_CRASH_FINISHED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040a_intro_sfx[] = { - // This flag is used to trigger the intro. Note that the entire function - // loops, so Rare could have tested the intro by setting the flag again. - label(0x2b) - if_stage_flag_eq(STAGEFLAG_TRIGGER_INTRO, TRUE, /*goto*/ 0x2c) - yield - goto_first(0x2b) - - label(0x2c) - unset_stage_flag(STAGEFLAG_TRIGGER_INTRO) - label(0x10) - yield - label(0x03) - restart_timer - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) \ - if_timer_gt(time, /*goto*/ 0x04) \ - endloop(loopid) \ - label(0x04) - - wait_until(30, 0x55) - speak(CHR_BOND, L_PETE_068, MP3_0408, CHANNEL_7, COLOR_05_GREEN) // "We suspect the G5 Corporation is just a front for ..." - - wait_until(1060, 0x56) - speak(CHR_BOND, L_PETE_069, MP3_0409, CHANNEL_7, COLOR_09_BLUE) // "Just who is this help you keep referring to?" - - wait_until(1260, 0x57) - speak(CHR_BOND, L_PETE_070, MP3_040A, CHANNEL_7, COLOR_05_GREEN) // "Not now, Joanna. Time for radio silence. Good luck..." - - wait_until(1488, 0x58) - speak(CHR_BOND, L_PETE_071, MP3_040B, CHANNEL_7, COLOR_09_BLUE) // "Thanks a lot." - - label(0x2d) - yield - label(0x03) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2e) - if_timer_gt(1468, /*goto*/ 0x04) - goto_first(0x2d) - - label(0x04) - play_sound(SFX_0161, CHANNEL_3) - - wait_until(1519, 0x2f) - play_sound(SFX_0162, CHANNEL_3) - - wait_until(1566, 0x30) - play_sound(SFX_046D, CHANNEL_4) - - wait_until(1649, 0x31) - play_sound(SFX_046D, CHANNEL_3) - - label(0x33) - wait_until(1758, 0x34) - play_sound(SFX_0164, CHANNEL_4) - - wait_until(1784, 0x35) - play_sound(SFX_0163, CHANNEL_3) - - wait_until(1814, 0x36) - play_sound(SFX_0162, CHANNEL_3) - - wait_until(1855, 0x37) - play_sound(SFX_0161, CHANNEL_3) - - wait_until(1897, 0x38) - play_sound(SFX_0470, CHANNEL_3) - - wait_until(2017, 0x3a) - play_sound(SFX_0165, CHANNEL_3) - - wait_until(2028, 0x3b) - play_sound(SFX_046E, CHANNEL_4) - - wait_until(2050, 0x3c) - play_sound(SFX_0472, CHANNEL_3) - - wait_until(2175, 0x3d) - play_sound(SFX_0473, CHANNEL_4) - - wait_until(2239, 0x3e) - play_sound(SFX_0474, CHANNEL_3) - - wait_until(2269, 0x3f) - play_sound(SFX_0475, CHANNEL_4) - - wait_until(2278, 0x41) - play_sound(SFX_0166, CHANNEL_3) - - wait_until(2280, 0x40) - play_sound(SFX_JO_LANDING_046F, CHANNEL_4) - - wait_until(2323, 0x42) - play_sound(SFX_0165, CHANNEL_3) - - wait_until(2339, 0x43) - play_sound(SFX_0166, CHANNEL_3) - - wait_until(2356, 0x44) - play_sound(SFX_0167, CHANNEL_3) - - wait_until(2373, 0x45) - play_sound(SFX_0168, CHANNEL_3) - - wait_until(2386, 0x46) - play_sound(SFX_0165, CHANNEL_3) - - wait_until(2388, 0x47) - - wait_until(2402, 0x48) - mute_channel(CHANNEL_4) - play_sound(SFX_0166, CHANNEL_3) - - wait_until(2404, 0x4a) - play_sound(SFX_0080, CHANNEL_4) - - wait_until(2424, 0x49) - play_sound(SFX_0167, CHANNEL_3) - - wait_until(2434, 0x4c) - play_sound(SFX_0476, CHANNEL_3) - - wait_until(2584, 0x4b) - play_sound(SFX_0161, CHANNEL_5) - - wait_until(2622, 0x4d) - mute_channel(CHANNEL_5) - - play_sound(SFX_0162, CHANNEL_4) - wait_until(2660, 0x4e) - mute_channel(CHANNEL_5) - - play_sound(SFX_0163, CHANNEL_6) - - label(0x2e) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_7) - goto_first(0x2b) - - endlist -}; - -u8 func040b_outro[] = { - camera_movement(ANIM_CUT_PETE_OUTRO_CAM) - play_cutscene_track(MUSIC_CHICAGO_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - set_door_open(0x10) - set_door_open(0x11) - disable_object(OBJ_TAXI) - disable_object(OBJ_LIMO) -#if VERSION >= VERSION_NTSC_1_0 - disable_chr(CHR_SEALER1) - disable_chr(CHR_SEALER2) - disable_chr(CHR_SEALER3) - disable_chr(CHR_SEALER4) -#endif - - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) -#if VERSION >= VERSION_NTSC_1_0 - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) -#endif - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_PETE_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - restart_timer - set_cutscene_weapon(CHR_P1P2, -1, -1) - yield - set_cutscene_weapon(CHR_P1P2, -1, 0x02) - show_nonessential_chrs(FALSE) - - #define func0c01_wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x2e) \ - if_timer_gt(time, /*goto*/ 0x04) \ - endloop(loopid) \ - label(0x04) - - func0c01_wait_until(30, 0x2d) - play_sound(SFX_0161, CHANNEL_7) - - func0c01_wait_until(70, 0x2f) - play_sound(SFX_0162, CHANNEL_7) - - func0c01_wait_until(120, 0x30) - play_sound(SFX_0163, CHANNEL_7) - - func0c01_wait_until(174, 0x31) - play_sound(SFX_0164, CHANNEL_7) - - func0c01_wait_until(208, 0x32) - play_sound(SFX_046D, CHANNEL_6) - - func0c01_wait_until(210, 0x33) - play_sound(SFX_0161, CHANNEL_7) - - func0c01_wait_until(238, 0x34) - play_sound(SFX_0162, CHANNEL_7) - - func0c01_wait_until(280, 0x35) - play_sound(SFX_0171, CHANNEL_7) - - func0c01_wait_until(350, 0x36) - play_sound(SFX_0173, CHANNEL_7) - - func0c01_wait_until(458, 0x37) - play_sound(SFX_0172, CHANNEL_7) - - func0c01_wait_until(506, 0x38) - play_sound(SFX_0171, CHANNEL_7) - - func0c01_wait_until(540, 0x39) - close_door(0x10) - close_door(0x11) - - func0c01_wait_until(545, 0x3a) - play_sound(SFX_0171, CHANNEL_7) - - func0c01_wait_until(588, 0x3b) - play_sound(SFX_0172, CHANNEL_7) - - beginloop(0x05) - if_camera_animating(/*goto*/ 0x03) - goto_next(0x2e) - label(0x03) - if_controller_button_pressed(/*goto*/ 0x2e) - label(0x03) - endloop(0x05) - - label(0x2e) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_10) - label(0x04) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_update_robot_prop_flags[] = { - // pad 0x00d4 = corner - // pad 0x00d9 = next to limo - - beginloop(0x02) - // Update ROBOT_NEAR_CORNER flag - if_stage_flag_eq(STAGEFLAG_ROBOT_NEAR_HOME, FALSE, /*goto*/ 0x03) - if_chr_distance_to_pad_lt(CHR_ROBOT, 200, PAD_PETE_00D4, /*goto*/ 0x04) - label(0x03) - unset_stage_flag(STAGEFLAG_ROBOT_NEAR_CORNER) - goto_next(0x03) - - label(0x04) - set_stage_flag(STAGEFLAG_ROBOT_NEAR_CORNER) - - // Update ROBOT_ON_DRAIN_STREET flag - label(0x03) - if_chr_distance_to_pad_gt(CHR_ROBOT, 1800, PAD_PETE_00D9, /*goto*/ 0x04) - unset_stage_flag(STAGEFLAG_ROBOT_ON_DRAIN_STREET) - goto_next(0x03) - - label(0x04) - set_stage_flag(STAGEFLAG_ROBOT_ON_DRAIN_STREET) - label(0x03) - endloop(0x02) - - endlist -}; - -u8 func1416_setup_rain[] = { - yield - yield - yield - enable_rain(2) - - label(0x05) - // Wait 1 second - restart_timer - - beginloop(0x06) - if_timer_gt(60, /*goto*/ 0x03) - endloop(0x06) - - // 12 in 256 chance of changing rain effect - label(0x03) - call_rng - if_rand_lt(12, /*goto*/ 0x03) - goto_first(0x05) - - label(0x03) - call_rng - if_rand_gt(192, /*goto*/ 0x0a) - if_rand_gt(128, /*goto*/ 0x09) - if_rand_gt(64, /*goto*/ 0x08) - enable_rain(2) - goto_first(0x05) - - label(0x08) - enable_rain(1) - goto_first(0x05) - - label(0x09) - enable_rain(2) - goto_first(0x05) - - label(0x0a) - enable_rain(3) - goto_first(0x05) - - endlist -}; - -u8 func041c_hiddenguy[] = { - set_chr_chrflag(CHR_HIDDENGUY, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_HIDDENGUY, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This function makes two guards unhide and persue Jo after she picks up the - * drain briefcase. - */ -u8 func1017_drain_guards[] = { - set_chr_chrflag(0x11, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x12, CHRCFLAG_HIDDEN) - - // Wait until drain briefcase collected - beginloop(0x05) - if_objective_complete(0, /*goto*/ 0x03) - endloop(0x05) - - label(0x03) - unset_chr_chrflag(0x11, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x12, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x11, CHRHFLAG_00400000) - set_chr_hiddenflag(0x12, CHRHFLAG_00400000) - set_ailist(0x11, GAILIST_ALERTED) - set_ailist(0x12, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_keep_door_open[] = { - beginloop(0x10) - if_door_state(0x1a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x03) - reloop(0x10) - - label(0x03) - open_door(0x1a) - endloop(0x10) - - endlist -}; - -u8 func1019_setup_topstairs_death_animation[] = { - set_chr_special_death_animation(CHR_TOPSTAIRS, SPECIALDIE_OVERRAILING) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040e_6064[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(4) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040f_6088[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x03) - set_chr_dodge_rating(2, 10) - set_accuracy(20) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - label(0x03) - set_chr_dodge_rating(2, 10) - set_accuracy(4) - set_reaction_speed(30) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0410_60d0[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(14) - set_reaction_speed(20) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0411_60f4[] = { - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_chr_dodge_rating(2, 10) - set_accuracy(14) - set_reaction_speed(20) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(40) - set_shield(0) - set_ailist(CHR_SELF, AILIST_FBI) - endlist -}; - -u8 func101a_msg_onlyplace[] = { - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0014, /*goto*/ 0x03) - if_chr_in_room(CHR_P1P2, 0x00, 0x0026, /*goto*/ 0x03) - endloop(0x10) - - label(0x03) - speak(CHR_P1P2, L_PETE_060, SFX_8179, CHANNEL_6, COLOR_09_BLUE) // "The only place we could secure the equipment was a..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101b_msg_blockedupdoors[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0a) - restart_timer - - // Wait for drain briefcase collected - beginloop(0x10) - if_objective_complete(0, /*goto*/ 0x05) - endloop(0x10) - - beginloop(0x05) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x003a, /*goto*/ 0x03) - endloop(0x05) - - label(0x03) - speak(CHR_P1P2, L_PETE_061, MP3_03B1, CHANNEL_6, COLOR_09_BLUE) // "Either of those blocked-up doors will do as an esc..." - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_msg_reprogramthattaxi[] = { - // Wait for drain briefcase collected - beginloop(0x10) - if_objective_complete(0, /*goto*/ 0x05) - endloop(0x10) - - beginloop(0x05) -#if VERSION >= VERSION_NTSC_1_0 - if_object_in_good_condition(OBJ_TAXI, /*goto*/ 0x03) - reloop(0x05) - - label(0x03) -#endif - if_stage_flag_eq(STAGEFLAG_TAXI_REPROGRAMMED, TRUE, /*goto*/ 0x0a) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x004a, /*goto*/ 0x03) - endloop(0x05) - - label(0x03) - speak(CHR_P1P2, L_PETE_062, SFX_817A, CHANNEL_6, COLOR_09_BLUE) // "Reprogram that taxi - it's a Mark 2 and should be ..." - label(0x0a) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_msg_pointofingress[] = { - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0059, /*goto*/ 0x03) - endloop(0x10) - - label(0x03) - speak(CHR_P1P2, L_PETE_063, SFX_817B, CHANNEL_6, COLOR_09_BLUE) // "That car park lift is your only point of ingress." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_check_sealer_guards_dead[] = { - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x06) - if_chr_dead(CHR_SEALER1, /*goto*/ 0x03) - if_chr_death_animation_finished(CHR_SEALER1, /*goto*/ 0x03) - endloop(0x10) - - label(0x03) - if_chr_dead(CHR_SEALER2, /*goto*/ 0x03) - if_chr_death_animation_finished(CHR_SEALER2, /*goto*/ 0x03) - goto_first(0x10) - - label(0x03) - if_chr_dead(CHR_SEALER3, /*goto*/ 0x03) - if_chr_death_animation_finished(CHR_SEALER3, /*goto*/ 0x03) - goto_first(0x10) - - label(0x03) - if_chr_dead(CHR_SEALER4, /*goto*/ 0x03) - if_chr_death_animation_finished(CHR_SEALER4, /*goto*/ 0x03) - goto_first(0x10) - - label(0x03) - if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) - show_hudmsg(CHR_BOND, L_PETE_066) // "An alternative diversion has been created!" -#if VERSION >= VERSION_NTSC_1_0 - unset_stage_flag(STAGEFLAG_TAXI_DESTROYED) - unset_stage_flag(STAGEFLAG_ROBOT_DESTROYED) -#endif - set_stage_flag(STAGEFLAG_DIVERSION_CREATED) - label(0x03) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_elevator_doors[] = { - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_ELEVATOR_SEALED, TRUE, /*goto*/ 0x03) - if_door_state(0x10, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x04) - reloop(0x10) - - label(0x04) - open_door(0x10) - open_door(0x11) - endloop(0x10) - - label(0x03) - close_door(0x10) - close_door(0x11) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Guard at top stairs: Turn off special death animation if he's moved away from - * his pad or if Jo has climbed the staircase. - */ -u8 func1021_check_topstairs_guy[] = { - beginloop(0x10) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 500, OPERATOR_LESS_THAN, /*goto*/ 0x03) - goto_next(0x04) - label(0x03) - if_chr_distance_to_pad_gt(CHR_TOPSTAIRS, 250, PAD_PETE_00B5, /*goto*/ 0x04) - endloop(0x10) - - label(0x04) - set_chr_special_death_animation(CHR_TOPSTAIRS, SPECIALDIE_NONE) - unset_chr_chrflag(CHR_TOPSTAIRS, CHRCFLAG_HAS_SPECIAL_DEATH_ANIMATION) - unset_chr_flag_bankx(CHR_TOPSTAIRS, CHRFLAG1_NOHANDCOMBAT, BANK_1) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_limo_flags[] = { - // Wait until limo ready - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_LIMO_READY_TO_LEAVE, TRUE, /*goto*/ 0x2f) - endloop(0x10) - - // Wait until player not in certain rooms - beginloop(0x2f) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0002, /*goto*/ 0x03) - if_chr_in_room(CHR_P1P2, 0x00, 0x0010, /*goto*/ 0x03) - if_chr_in_room(CHR_P1P2, 0x00, 0x0012, /*goto*/ 0x03) - goto_next(0x04) - label(0x03) - endloop(0x2f) - - // Wait almost 10 seconds - provided limo not destroyed - label(0x04) - restart_timer - - beginloop(0x2d) - if_object_in_good_condition(OBJ_LIMO, /*goto*/ 0x03) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x03) - if_timer_gt(596, /*goto*/ 0x03) - endloop(0x2d) - - label(0x03) - disable_object(OBJ_LIMO) - set_object_flag(OBJ_LIMO, OBJFLAG_INVINCIBLE) - set_object_flag2(OBJ_LIMO, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1423_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0050, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0051, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0052, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0060, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0061, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0062, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0064, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0066, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0067, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0068, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_cia_invincibility[] = { - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_TRIGGER_TAXI_LEAVE, TRUE, /*goto*/ 0x03) - endloop(0x10) - - label(0x03) - set_chr_chrflag(CHR_CIA1, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CIA2, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CIA3, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_CIA4, CHRCFLAG_INVINCIBLE) - - beginloop(0x2d) - if_stage_flag_eq(STAGEFLAG_DIVERSION_CREATED, TRUE, /*goto*/ 0x03) - endloop(0x2d) - - label(0x03) - restart_timer - - beginloop(0x2f) - if_timer_gt(300, /*goto*/ 0x03) - endloop(0x2f) - - label(0x03) - unset_chr_chrflag(CHR_CIA1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_CIA2, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_CIA3, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_CIA4, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1025_rtracker[] = { - yield - set_object_flag3(OBJ_FALCON2, OBJFLAG3_RTRACKED_BLUE) -#if VERSION < VERSION_NTSC_1_0 - set_object_flag3(0x23, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(0x24, OBJFLAG3_RTRACKED_BLUE) -#endif - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#if VERSION >= VERSION_NTSC_1_0 -u8 func1027_untrack_dumpster[] = { - yield - - beginloop(0x10) - if_object_in_good_condition(OBJ_DUMPSTER, /*goto*/ 0x04) - goto_next(0x03) - label(0x04) - endloop(0x10) - - label(0x03) - unset_object_flag3(OBJ_DUMPSTER, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; -#endif - -struct ailist ailists[] = { - { func0401_3ae8, 0x0401 }, - { func0402_3bb4, 0x0402 }, - { func0403_3c74, 0x0403 }, - { func0404_3ce0, 0x0404 }, - { func0405_3d50, 0x0405 }, - { func0406_3e54, 0x0406 }, - { func0407_3e60, 0x0407 }, - { func0408_3e6c, 0x0408 }, - { func0409_3e78, 0x0409 }, - { func040a_intro, 0x040a }, - { func040b_outro, 0x040b }, - { func040c_taxi, 0x040c }, - { func040d_limo, 0x040d }, - { func040e_6064, 0x040e }, - { func040f_6088, 0x040f }, - { func0410_60d0, 0x0410 }, - { func0411_60f4, 0x0411 }, - { func0412_cia, 0x0412 }, - { func0413_bugspotter, 0x0413 }, - { func0414_start_path07, 0x0414 }, - { func0415_start_path08, 0x0415 }, - { func0416_start_path09, 0x0416 }, - { func0417_start_path10, 0x0417 }, - { func0418_start_path11, 0x0418 }, - { func0419_init_cia1, 0x0419 }, - { func041d_fbi, 0x041d }, - { func041c_hiddenguy, 0x041c }, - { func041e_sealer1, 0x041e }, - { func041f_alarm_responder, 0x041f }, - { func0420_jog_to_accident, 0x0420 }, - { func041a_robot, 0x041a }, - { func041b_init_robot, 0x041b }, - { func040a_intro, 0x0c00 }, - { func040b_outro, 0x0c01 }, - { func1400_give_briefcases, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_rebuild_groups, 0x1002 }, - { func040a_intro_from_gameplay, 0x1003 }, - { func1004_tracerbug_bond, 0x1004 }, - { func1005_check_things_destroyed, 0x1005 }, - { func1006_check_for_end, 0x1006 }, - { func040d_limo_timing, 0x1007 }, - { func040c_taxi_timing, 0x1008 }, - { func1009_check_cia1_dead, 0x1009 }, - { func100a_check_cia2_dead, 0x100a }, - { func100b_check_cia3_dead, 0x100b }, - { func100c_check_cia4_dead, 0x100c }, - { func100d_spawn_alarm_responders, 0x100d }, - { func100f_check_mine, 0x100f }, - { func1010_elevator_switch, 0x1010 }, - { func1011_trackerbug_coop, 0x1011 }, - { func1012_update_robot_prop_flags, 0x1012 }, - { func1014_crash, 0x1014 }, - { func040a_intro_sfx, 0x1415 }, - { func1416_setup_rain, 0x1416 }, - { func1017_drain_guards, 0x1017 }, - { func1018_keep_door_open, 0x1018 }, - { func1019_setup_topstairs_death_animation, 0x1019 }, - { func101a_msg_onlyplace, 0x101a }, - { func101b_msg_blockedupdoors, 0x101b }, - { func101c_msg_reprogramthattaxi, 0x101c }, - { func101d_msg_pointofingress, 0x101d }, - { func101e_check_sealer_guards_dead, 0x101e }, - { func101f_setup_robot_noise, 0x101f }, - { func1020_elevator_doors, 0x1020 }, - { func1021_check_topstairs_guy, 0x1021 }, - { func040d_limo_flags, 0x1022 }, - { func1423_setup_environment, 0x1423 }, - { func0412_cia_invincibility, 0x1024 }, - { func1025_rtracker, 0x1025 }, - { func1026_uplink, 0x1026 }, -#if VERSION >= VERSION_NTSC_1_0 - { func1027_untrack_dumpster, 0x1027 }, -#endif - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, 0 }, diff --git a/src/setups/setupref.c b/src/setups/setupref.c index 9b81b8e73..5dac45f46 100644 --- a/src/setups/setupref.c +++ b/src/setups/setupref.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setuprit.c b/src/setups/setuprit.c index 78f1d3c45..dd644251a 100644 --- a/src/setups/setuprit.c +++ b/src/setups/setuprit.c @@ -125,7 +125,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -536,3605 +536,6 @@ s32 path02[] = { -1, }; -u8 func1001_objectives_failed_msg[] = { - yield - set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_STEWARD, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PILOT1, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(CHR_PILOT2, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x01, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x02, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x03, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x04, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x05, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x06, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x07, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x08, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x09, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0a, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0b, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0c, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0d, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0e, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x0f, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x10, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x11, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x12, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x13, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x14, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x15, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x16, CHRCFLAG_KEEPCORPSEKO) - set_chr_chrflag(0x17, CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - yield - yield - set_chr_team(CHR_ANTI, TEAM_04) - chr_draw_weapon(CHR_BOND, WEAPON_UNARMED) - chr_draw_weapon(CHR_COOP, WEAPON_UNARMED) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1003_rebuild_groups[] = { - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1024_give_objects[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x2d) - give_object_to_chr(OBJ_EQUIPMENT, CHR_BOND) - give_object_to_chr(OBJ_EQUIPMENT_COOP, CHR_COOP) - - label(0x2d) - set_object_flag2(OBJ_DATAUPLINK_BOND, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_DATAUPLINK_BOND, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_REMOTEMINE_BOND, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_REMOTEMINE_BOND, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_DATAUPLINK_COOP, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_DATAUPLINK_COOP, OBJFLAG_UNCOLLECTABLE) - set_object_flag2(OBJ_REMOTEMINE_COOP, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_REMOTEMINE_COOP, OBJFLAG_UNCOLLECTABLE) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_has_object(CHR_P1P2, OBJ_EQUIPMENT, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - give_object_to_chr(OBJ_DATAUPLINK_BOND, CHR_BOND) - give_object_to_chr(OBJ_REMOTEMINE_BOND, CHR_BOND) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - give_object_to_chr(OBJ_DATAUPLINK_COOP, CHR_COOP) - give_object_to_chr(OBJ_REMOTEMINE_COOP, CHR_COOP) - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_reassign_ailists_during_conversation[] = { - // Wait until player in president's room - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0055, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0056, /*goto*/ 0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x0057, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_00100000) - set_chr_target_chr(CHR_PRESIDENT, CHR_P1P2) - set_ailist(0x01, AILIST_BE_UNALERT) - set_ailist(CHR_STEWARDESS, AILIST_BE_UNALERT) - set_ailist(CHR_STEWARD, AILIST_BE_UNALERT) - set_ailist(0x04, AILIST_BE_UNALERT) - set_ailist(0x05, AILIST_BE_UNALERT) - set_ailist(0x06, AILIST_BE_UNALERT) - set_ailist(0x07, AILIST_BE_UNALERT) - set_ailist(0x08, AILIST_BE_UNALERT) - set_ailist(0x09, AILIST_BE_UNALERT) - set_ailist(0x0a, AILIST_BE_UNALERT) - set_ailist(0x0b, AILIST_BE_UNALERT) - set_ailist(0x0c, AILIST_BE_UNALERT) - set_ailist(0x0d, AILIST_BE_UNALERT) - set_ailist(0x0e, AILIST_BE_UNALERT) - set_ailist(0x0f, AILIST_BE_UNALERT) - set_ailist(0x10, AILIST_BE_UNALERT) - set_ailist(0x11, AILIST_BE_UNALERT) - set_ailist(0x12, AILIST_BE_UNALERT) - set_ailist(0x13, AILIST_BE_UNALERT) - set_ailist(0x14, AILIST_BE_UNALERT) - set_ailist(0x15, AILIST_BE_UNALERT) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_check_neutrals_killed[] = { - set_chr_chrflag(0x01, CHRCFLAG_KILLCOUNTABLE) -#if VERSION >= VERSION_JPN_FINAL - set_chr_chrflag(CHR_STEWARDESS, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(CHR_STEWARD, CHRCFLAG_KILLCOUNTABLE) -#endif - set_chr_chrflag(0x04, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x05, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x06, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x07, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x08, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x09, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0a, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0b, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0c, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0d, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0e, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x0f, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x10, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x11, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x12, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x13, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x14, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x15, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x16, CHRCFLAG_KILLCOUNTABLE) - set_chr_chrflag(0x17, CHRCFLAG_KILLCOUNTABLE) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) - if_kill_count_gt(0, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - show_hudmsg(CHR_BOND, L_RIT_020) // "Too many neutral casualties inflicted." - set_stage_flag(STAGEFLAG_KILLED_NEUTRALS) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0401_init_stripes[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0402_init_elvis[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_hijack[] = { - yield - disable_chr(0x1d) - disable_chr(0x1e) - disable_chr(0x1f) - disable_chr(0x20) - disable_chr(0x21) - disable_chr(0x22) - disable_chr(0x23) - disable_chr(0x24) - disable_chr(0x25) - disable_chr(0x26) - disable_chr(0x27) - disable_chr(0x28) - disable_chr(0x29) - disable_chr(CHR_TAKER1) - disable_chr(CHR_TAKER2) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - play_music_continuously(MUSIC_AIRFORCEONE_X) - set_chr_maxdamage(0x01, 10) - set_chr_maxdamage(0x04, 10) - set_chr_maxdamage(0x05, 10) - set_chr_maxdamage(0x06, 10) - set_chr_maxdamage(0x07, 10) - set_chr_maxdamage(0x08, 10) - set_chr_maxdamage(0x09, 10) - set_chr_maxdamage(0x0a, 10) - set_chr_maxdamage(0x0b, 10) - set_chr_maxdamage(0x0c, 10) - set_chr_maxdamage(0x0d, 10) - set_chr_maxdamage(0x0e, 10) - set_chr_maxdamage(0x0f, 10) - set_chr_maxdamage(0x10, 10) - set_chr_maxdamage(0x16, 10) - set_chr_maxdamage(0x17, 10) - set_chr_maxdamage(CHR_PILOT1, 10) - set_chr_maxdamage(CHR_PILOT2, 10) - set_ailist(0x01, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(CHR_STEWARDESS, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(CHR_STEWARD, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x04, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x05, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x06, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x07, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x08, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x09, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x0a, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x0b, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x0c, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x0d, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x10, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x12, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x13, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x15, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x16, AILIST_REMOVE_IF_OFFSCREEN) - yield - set_ailist(0x17, AILIST_REMOVE_IF_OFFSCREEN) - set_ailist(0x0e, AILIST_INIT_DEFEND_PAD) - set_ailist(0x0f, AILIST_INIT_DEFEND_PAD) - set_ailist(0x11, AILIST_INIT_DEFEND_PAD) - set_ailist(0x14, AILIST_INIT_DEFEND_PAD) - yield - - #define enable_stripes_chr(chr, function) \ - enable_chr(chr) \ - set_ailist(chr, function) \ - unset_chr_chrflag(chr, CHRCFLAG_HIDDEN) \ - set_chr_hiddenflag(chr, CHRHFLAG_00400000) \ - yield - - enable_stripes_chr(0x1d, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x1e, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x1f, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x20, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x21, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x22, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x23, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x24, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x25, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x26, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x27, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x28, AILIST_REINIT_STRIPES) - enable_stripes_chr(0x29, AILIST_COCKPIT_STRIPES) - enable_stripes_chr(CHR_TAKER1, AILIST_TAKER2) - enable_stripes_chr(CHR_TAKER2, AILIST_TAKER1) - - set_chr_flag_bankx(0x01, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(CHR_STEWARDESS, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(CHR_STEWARD, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x04, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x05, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x06, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x07, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x08, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x09, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0a, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0b, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0c, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0d, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0e, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x0f, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x10, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x11, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x12, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x13, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x14, CHRFLAG0_AIVSAI, BANK_0) - set_chr_flag_bankx(0x15, CHRFLAG0_AIVSAI, BANK_0) - set_chr_team(CHR_TRENT, TEAM_04) - set_chr_team(CHR_BLONDE1, TEAM_04) - set_chr_team(CHR_BLONDE2, TEAM_04) - unset_chr_hiddenflag(CHR_TRENT, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_hiddenflag(CHR_BLONDE1, CHRHFLAG_ANTINONINTERACTABLE) - unset_chr_hiddenflag(CHR_BLONDE2, CHRHFLAG_ANTINONINTERACTABLE) -#if VERSION >= VERSION_NTSC_1_0 - unlock_door(OBJ_COCKPITDOOR, 0x40) -#endif - rebuild_teams - rebuild_squadrons - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - unset_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_stripes[] = { - set_returnlist(CHR_SELF, AILIST_STRIPES) - set_self_chrflag(CHRCFLAG_00000040) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) - - // No target nearby - yield - unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) - stop_chr - set_ailist(CHR_SELF, GAILIST_UNALERTED) - - // Got target - label(0x06) - if_target_is_player(/*goto*/ 0x06) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) - set_returnlist(CHR_SELF, AILIST_STRIPES) - set_shotlist(AILIST_STRIPES) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - label(0x06) - unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - - label(0x2d) - set_target_chr(-1) - stop_chr - endloop(0x04) - - endlist -}; - -u8 unregistered_function1[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#define check_mine_wasted(chr1, chr2, myflag, buddyflag) \ - set_object_flag(OBJ_COMMSHUB1, OBJFLAG_AIUNDROPPABLE) \ - set_object_flag(OBJ_COMMSHUB2, OBJFLAG_AIUNDROPPABLE) \ - set_object_flag(OBJ_COMMSHUB3, OBJFLAG_AIUNDROPPABLE) \ - set_object_flag(OBJ_COMMSHUB4, OBJFLAG_AIUNDROPPABLE) \ - set_object_flag(OBJ_COMMSHUB5, OBJFLAG_AIUNDROPPABLE) \ - yield \ - yield \ - if_difficulty_lt(DIFF_SA, /*goto*/ 0x06) \ - \ - /* Wait until equipment collected */ \ - beginloop(0x93) \ - if_objective_complete(0, /*goto*/ 0x06) \ - endloop(0x93) \ - \ - label(0x06) \ - yield \ - yield \ - yield \ - yield \ - yield \ - label(0x08) \ - set_target_chr(chr1) \ - \ - /* Wait until mine thrown */ \ - beginloop(0x09) \ - if_ammo_quantity_lt(chr2, AMMOTYPE_TIMED_MINE, 1, /*goto*/ 0x2d) \ - endloop(0x09) \ - \ - label(0x2d) \ - if_stage_flag_eq(VERSION >= VERSION_NTSC_1_0 ? STAGEFLAG_MIDCUTSCENE_FINISHED : STAGEFLAG_PRESIDENT_STARTED_RUNNING, FALSE, /*goto*/ 0x0a) \ - label(0x2d) \ - unset_object_flag(OBJ_COMMSHUB1, OBJFLAG_INVINCIBLE) \ - unset_object_flag(OBJ_COMMSHUB2, OBJFLAG_INVINCIBLE) \ - unset_object_flag(OBJ_COMMSHUB3, OBJFLAG_INVINCIBLE) \ - unset_object_flag(OBJ_COMMSHUB4, OBJFLAG_INVINCIBLE) \ - unset_object_flag(OBJ_COMMSHUB5, OBJFLAG_INVINCIBLE) \ - restart_timer \ - \ - /* Wait 8.3 seconds or until commshub destroyed */ \ - beginloop(0x04) \ - if_timer_gt(500, /*goto*/ 0x0a) \ - if_object_in_good_condition(OBJ_COMMSHUB1, /*goto*/ 0x2d) \ - goto_next(0x06) \ - \ - label(0x2d) \ - if_object_in_good_condition(OBJ_COMMSHUB2, /*goto*/ 0x2d) \ - goto_next(0x06) \ - \ - label(0x2d) \ - if_object_in_good_condition(OBJ_COMMSHUB3, /*goto*/ 0x2d) \ - goto_next(0x06) \ - \ - label(0x2d) \ - if_object_in_good_condition(OBJ_COMMSHUB4, /*goto*/ 0x2d) \ - goto_next(0x06) \ - \ - label(0x2d) \ - if_object_in_good_condition(OBJ_COMMSHUB5, /*goto*/ 0x2d) \ - goto_next(0x06) \ - \ - label(0x2d) \ - endloop(0x04) \ - \ - /* Commshub damaged */ \ - label(0x06) \ - show_hudmsg(CHR_BOND, 0x3615) /* "UFO attachment damaged." */ \ - set_stage_flag(STAGEFLAG_UFO_ATTACHMENT_DAMAGED) \ - unset_stage_flag(STAGEFLAG_BOTH_MINES_WASTED) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - /* Mine wasted */ \ - label(0x0a) \ - set_stage_flag(myflag) \ - if_stage_flag_eq(buddyflag, TRUE, /*goto*/ 0x2d) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - \ - label(0x2d) \ - show_hudmsg(CHR_BOND, 0x3645) /* "Timed mine has been wasted." */ \ - set_stage_flag(STAGEFLAG_BOTH_MINES_WASTED) \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 func1008_check_mine_wasted_bond[] = { - check_mine_wasted(CHR_BOND, CHR_TARGET, STAGEFLAG_BOND_MINE_WASTED, STAGEFLAG_COOP_MINE_WASTED) - endlist -}; - -u8 func1021_check_mine_wasted_coop[] = { - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x06) - label(0x2d) - set_stage_flag(STAGEFLAG_COOP_MINE_WASTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - check_mine_wasted(CHR_COOP, CHR_COOP, STAGEFLAG_COOP_MINE_WASTED, STAGEFLAG_BOND_MINE_WASTED) - endlist -}; - -u8 func101e_blow_mines[] = { - // Wait for any commshub destroyed - beginloop(0x04) - if_object_in_good_condition(OBJ_COMMSHUB1, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_object_in_good_condition(OBJ_COMMSHUB2, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_object_in_good_condition(OBJ_COMMSHUB3, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_object_in_good_condition(OBJ_COMMSHUB4, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_object_in_good_condition(OBJ_COMMSHUB5, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - endloop(0x04) - - label(0x06) - - // 1 - unset_object_flag(0x2f, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x33, OBJFLAG2_INVISIBLE) - unset_object_flag(0x33, OBJFLAG_INVINCIBLE) - destroy_object(0x33) - restart_timer - - beginloop(0x60) - if_timer_gt(60, /*goto*/ 0x2d) - endloop(0x60) - - label(0x2d) - unset_object_flag2(0x2f, OBJFLAG2_INVISIBLE) - destroy_object(0x2f) - - // 2 - unset_object_flag(0x30, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x34, OBJFLAG2_INVISIBLE) - unset_object_flag(0x34, OBJFLAG_INVINCIBLE) - destroy_object(0x34) - restart_timer - - beginloop(0x77) - if_timer_gt(60, /*goto*/ 0x2d) - endloop(0x77) - - label(0x2d) - unset_object_flag2(0x30, OBJFLAG2_INVISIBLE) - destroy_object(0x30) - - // 3 - unset_object_flag(0x31, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x35, OBJFLAG2_INVISIBLE) - unset_object_flag(0x35, OBJFLAG_INVINCIBLE) - destroy_object(0x35) - restart_timer - - beginloop(0x78) - if_timer_gt(60, /*goto*/ 0x2d) - endloop(0x78) - - label(0x2d) - unset_object_flag2(0x31, OBJFLAG2_INVISIBLE) - destroy_object(0x31) - - // 4 - unset_object_flag(0x32, OBJFLAG_INVINCIBLE) - unset_object_flag2(0x36, OBJFLAG2_INVISIBLE) - unset_object_flag(0x36, OBJFLAG_INVINCIBLE) - destroy_object(0x36) - restart_timer - - beginloop(0x79) - if_timer_gt(60, /*goto*/ 0x2d) - endloop(0x79) - - label(0x2d) - unset_object_flag2(0x32, OBJFLAG2_INVISIBLE) - destroy_object(0x32) - - yield - disable_object(0x2f) - disable_object(0x30) - disable_object(0x31) - disable_object(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_check_end_level[] = { - beginloop(0x04) - if_all_objectives_complete(/*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_ALL_OBJECTIVES_COMPLETE) - restart_timer - label(0x08) - yield - label(0x06) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x06) - - // Both players dead - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Redundant check - label(0x06) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x06) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func100a_autopilot_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_AUTOPILOT_SWITCH, /*goto*/ 0x2d) - goto_next(0x08) - - label(0x2d) - if_chr_activated_object(CHR_P1P2, OBJ_AUTOPILOT_SWITCH, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - label(0x06) - if_stage_flag_eq(STAGEFLAG_PLANE_NOSEDIVING, TRUE, /*goto*/ 0x06) - endloop(0x04) - - // Switch pressed - label(0x06) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_AUTOPILOT_SWITCH, TRUE) - set_object_image(OBJ_AUTOPILOT_SWITCH, 0, TVCMDLIST_13) - set_stage_flag(STAGEFLAG_PLANE_STABILIZED) - yield - show_hudmsg(CHR_P1P2, L_RIT_024) // "Air Force One has been stabilized." - show_hudmsg(CHR_P1P2, L_RIT_023) // "Autopilot has been activated." - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Switch destroyed - label(0x08) - show_hudmsg(CHR_P1P2, L_RIT_025) // "Autopilot systems have been destroyed." - set_stage_flag(STAGEFLAG_AUTOPILOT_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0406_init_president[] = { - set_chr_maxdamage(CHR_SELF, 0) - set_ailist(CHR_SELF, AILIST_PRESIDENT_IN_ROOM) - endlist -}; - -u8 func0405_president_in_room[] = { - set_shotlist(AILIST_PRESIDENT_IN_ROOM) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - // Dying - label(0x2d) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - stop_chr - yield - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_00100000, TRUE, /*goto*/ 0x03) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) - endloop(0x04) - - // Dying - label(0x2d) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x03) - set_target_chr(CHR_PRESET) - restart_timer - label(0x08) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - // Wait for Carrington's "on this level" message to finish - if_sound_finished(CHANNEL_6, /*goto*/ 0x2d) - reloop(0x09) - - label(0x2d) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - do_preset_animation(PRESETANIM_TALK0) - speak(CHR_TARGET, L_RIT_035, MP3_02C5, CHANNEL_6, COLOR_08_RED) // "Who are you, young lady?" - restart_timer - - beginloop(0x60) - if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) - if_can_see_target(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_saw_injury(0x00, /*goto*/ 0x86) - if_hears_target(/*goto*/ 0x86) - if_timer_lt(120, /*goto*/ 0x2d) - if_chr_in_view(/*goto*/ 0x06) - label(0x2d) - endloop(0x60) - - label(0x06) - speak(CHR_TARGET, L_RIT_037, MP3_02BC, CHANNEL_7, COLOR_09_BLUE) // "Mr. President, you're in danger. Trent is trying t..." - restart_timer - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x78) - - // In this loop the president will continue to turn to face the player - // because it lacks an if_target_in_fov_left check. - beginloop(0x78) - if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) - if_can_see_target(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_saw_injury(0x00, /*goto*/ 0x86) - if_hears_target(/*goto*/ 0x86) - if_timer_lt(240, /*goto*/ 0x2d) - if_chr_in_view(/*goto*/ 0x06) - label(0x2d) - endloop(0x78) - - label(0x06) - do_preset_animation(PRESETANIM_TALK1) - speak(CHR_TARGET, L_RIT_040, MP3_02C6, CHANNEL_6, COLOR_08_RED) // "You can't make accusations like that without evide..." - restart_timer - - beginloop(0x79) - if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) - if_can_see_target(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_saw_injury(0x00, /*goto*/ 0x86) - if_hears_target(/*goto*/ 0x86) - if_timer_lt(400, /*goto*/ 0x2d) - goto_next(0x84) - - label(0x2d) - endloop(0x79) - - label(0x84) - if_chr_has_object(CHR_TARGET, OBJ_EQUIPMENT, /*goto*/ 0x10) - if_chr_has_object(CHR_TARGET, OBJ_EQUIPMENT_COOP, /*goto*/ 0x10) - - // No equipment - label(0x85) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) - set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISE_UNCOVERED) - speak(CHR_TARGET, L_RIT_036, MP3_02C4, CHANNEL_6, COLOR_08_RED) // "Security, SECURITY!!" - restart_timer - chr_do_animation(ANIM_TALKING_0231, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x77) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x77) - - label(0x06) - set_ailist(0x01, GAILIST_UNALERTED) - set_ailist(CHR_STEWARDESS, GAILIST_UNALERTED) - set_ailist(CHR_STEWARD, GAILIST_UNALERTED) - set_ailist(0x04, GAILIST_UNALERTED) - set_ailist(0x05, GAILIST_UNALERTED) - set_ailist(0x06, GAILIST_UNALERTED) - set_ailist(0x07, GAILIST_UNALERTED) - set_ailist(0x08, GAILIST_UNALERTED) - set_ailist(0x09, GAILIST_UNALERTED) - set_ailist(0x0a, GAILIST_UNALERTED) - set_ailist(0x0b, GAILIST_UNALERTED) - set_ailist(0x0c, GAILIST_UNALERTED) - set_ailist(0x0d, GAILIST_UNALERTED) - set_ailist(0x0e, GAILIST_UNALERTED) - set_ailist(0x0f, GAILIST_UNALERTED) - set_ailist(0x10, GAILIST_UNALERTED) - set_ailist(0x11, GAILIST_UNALERTED) - set_ailist(0x12, GAILIST_UNALERTED) - set_ailist(0x13, GAILIST_UNALERTED) - set_ailist(0x14, GAILIST_UNALERTED) - set_ailist(0x15, GAILIST_UNALERTED) - set_stage_flag(STAGEFLAG_PRESIDENT_CALLED_SECURITY) - yield - increase_squadron_alertness(100) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) - - beginloop(0x0a) - endloop(0x0a) - - label(0x06) - - // Has equipment - label(0x10) - stop_chr - speak(CHR_TARGET, L_RIT_041, MP3_02BD, CHANNEL_6, COLOR_09_BLUE) // "This is a recording of a meeting between Trent and..." - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0b) - - // This loop uses an if_sound_finished check rather than a timer check, - // which allows the speech to be skipped. - beginloop(0x0b) - if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) - if_can_see_target(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_saw_injury(0x00, /*goto*/ 0x86) - if_hears_target(/*goto*/ 0x86) - if_sound_finished(CHANNEL_6, /*goto*/ 0x06) - goto_first(0x0b) - - label(0x06) - do_preset_animation(PRESETANIM_TALK2) - speak(CHR_TARGET, L_RIT_042, MP3_02C7, CHANNEL_6, COLOR_08_RED) // "Seems overwhelming... I'm in your hands. What do w..." - restart_timer - - beginloop(0x7a) - if_chr_in_room(CHR_TARGET, 0x00, 0x0055, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0056, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0057, /*goto*/ 0x2d) - if_can_see_target(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_saw_injury(0x00, /*goto*/ 0x86) - if_hears_target(/*goto*/ 0x86) - if_timer_gt(400, /*goto*/ 0x06) - endloop(0x7a) - - label(0x33) - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_MIDCUTSCENE) - - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - disable_object(OBJ_EXTERIOR_DOOR) - disable_object(OBJ_FLOORHATCH) - set_object_flag(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG_00000100) - unset_object_flag2(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG2_INVISIBLE) - unset_object_flag2(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG_00000100) - play_sound(SFX_EXPLOSION_8098, -1) - restart_timer - - beginloop(0x7b) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x7b) - - label(0x06) - do_preset_animation(PRESETANIM_TALKRANDOM) - speak(CHR_TARGET, L_RIT_038, SFX_816E, CHANNEL_6, COLOR_08_RED) // "What the hell was that!" - restart_timer - - beginloop(0x0c) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - stop_chr - set_stage_flag(STAGEFLAG_PRESIDENT_STARTED_RUNNING) -#if VERSION < VERSION_NTSC_1_0 - unlock_door(OBJ_COCKPITDOOR, 0x40) -#endif - speak(CHR_TARGET, L_RIT_039, MP3_02BE, CHANNEL_6, COLOR_09_BLUE) // "We have to get you to the escape pod. Follow me." - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0e) - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - set_chrpreset(CHR_TARGET) - set_chr_maxdamage(CHR_SELF, 500) - set_shotlist(AILIST_PRESIDENT_RUNNING) - set_ailist(CHR_SELF, AILIST_PRESIDENT_RUNNING) - - label(0x86) - goto_first(0x85) - - endlist -}; - -u8 func0404_president_running[] = { - set_self_chrflag(CHRCFLAG_PUSHABLE) - set_shotlist(AILIST_PRESIDENT_RUNNING) - set_target_chr(CHR_PRESET) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x2d) - - // Dying - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(0x54) - - label(0x06) - assign_sound(MP3_02BF, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x2d) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x55) - - // Injured - label(0x06) - restart_timer - assign_sound(MP3_02C2, CHANNEL_6) - play_sound_from_entity(CHANNEL_6, CHR_SELF, 0x0bb8, 0x1770, 0x01) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_INJURED, TRUE, /*goto*/ 0x56) - set_stage_flag(STAGEFLAG_PRESIDENT_INJURED) - show_hudmsg(CHR_BOND, L_RIT_072) // "The President is under attack." - - beginloop(0x56) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - - label(0x06) - if_chr_stopped(/*goto*/ 0x55) - endloop(0x56) - - // Not injured, or injury animation finished - label(0x55) - stop_chr - restart_timer - - beginloop(0x57) - // @bug: This FALSE should be TRUE instead. This causes the president - // to behave weirdly when you've killed both blondes and stand in the - // entrance to Trent's room. - if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, FALSE, /*goto*/ 0x2d) - - // Both blondes dead - // This room is the entrance to Trent's room - if_chr_in_room(CHR_TARGET, 0x00, 0x000d, /*goto*/ 0x10) - - // At least one Blonde is alive, or follow through - // These rooms are the escape pod area - label(0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0030, /*goto*/ 0x11) - if_chr_in_room(CHR_TARGET, 0x00, 0x0031, /*goto*/ 0x11) - if_chr_in_room(CHR_TARGET, 0x00, 0x0032, /*goto*/ 0x11) - if_can_see_target(/*goto*/ 0x06) - goto_next(0x58) - - label(0x06) - if_timer_gt(1250, /*goto*/ 0x2d) - if_distance_to_target_gt(200, /*goto*/ 0x58) - endloop(0x57) - - // Been in sight for almost 21 seconds - say quip - label(0x2d) - call_rng - if_rand_lt(64, /*goto*/ 0x2d) - say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x55) - - label(0x2d) - say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x55) - - // Unreachable - label(0x06) - say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x55) - - // Distance to player > 200 or line of sight broken, so start following - label(0x58) - restart_timer - label(0x2d) - try_jog_to_target(/*goto*/ 0x59) - - beginloop(0x59) - // @bug: This FALSE should be TRUE instead. This causes the president - // to behave weirdly when you've killed both blondes and stand in the - // entrance to Trent's room. - if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, FALSE, /*goto*/ 0x2d) - - // Both blondes dead - // This room is the entrance to Trent's room - if_chr_in_room(CHR_TARGET, 0x00, 0x000d, /*goto*/ 0x10) - - // At least one Blonde is alive, or follow through - // These rooms are the escape pod area - label(0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0030, /*goto*/ 0x11) - if_chr_in_room(CHR_TARGET, 0x00, 0x0031, /*goto*/ 0x11) - if_chr_in_room(CHR_TARGET, 0x00, 0x0032, /*goto*/ 0x11) - if_distance_to_target_lt(100, /*goto*/ 0x5b) - if_chr_stopped(/*goto*/ 0x5b) - if_timer_gt(360, /*goto*/ 0x2d) - endloop(0x59) - - label(0x2d) - say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x58) - - label(0x06) - say_quip(CHR_BOND, 0x21, 0xff, 0x02, 0xff, BANK_1, 0x00, 0x00) - goto_first(0x58) - - // Stopped because president is close to player's sampled prop - label(0x5b) - goto_first(0x55) - - // Unreachable - label(0x5c) - try_run_to_target(/*goto*/ 0x5d) - - beginloop(0x5d) - if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, FALSE, /*goto*/ 0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x000d, /*goto*/ 0x10) - label(0x2d) - if_chr_in_room(CHR_TARGET, 0x00, 0x0030, /*goto*/ 0x11) - if_chr_in_room(CHR_TARGET, 0x00, 0x0031, /*goto*/ 0x11) - if_chr_in_room(CHR_TARGET, 0x00, 0x0032, /*goto*/ 0x11) - endloop(0x5d) - - label(0x5e) - goto_first(0x55) - - // Player in pod room while a Blonde is alive - // This pad is at the escape pod - label(0x11) - jog_to_pad(PAD_RIT_0083) - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x09) - - label(0x06) - stop_chr - set_stage_flag(STAGEFLAG_PRESIDENT_AT_POD) - set_chr_team(CHR_SELF, TEAM_NONCOMBAT) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Player is in the entrance to Trent's room and both blondes are dead. - // The intention behind this code is to make the president cower until the - // Blondes are dead, then resume following. However, due to a logic bug - // described earlier this code is jumped to only after the blondes are dead. - label(0x10) - run_to_pad(PAD_RIT_0019) - - // This loop will never iterate because the blondes are already dead - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x0b) - if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, TRUE, /*goto*/ 0x06) - endloop(0x0a) - - // Unreachable under real conditions - label(0x0b) - chr_do_animation(ANIM_COWER_0229, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x83) - if_stage_flag_eq(STAGEFLAG_BOTH_BLONDES_DEAD, TRUE, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x83) - - label(0x2d) - goto_first(0x0b) - - // Both blondes dead - resume running - label(0x06) - goto_first(0x55) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_president_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_PRESIDENT_DEAD) - show_hudmsg(CHR_BOND, L_RIT_026) // "The President has been incapacitated." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0409_unused[] = { - set_self_chrflag(CHRCFLAG_00000040) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_target_is_player(/*goto*/ 0x06) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) - set_returnlist(CHR_SELF, 0x0409) - set_shotlist(0x0409) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - label(0x2d) - endloop(0x04) - - label(0x06) - unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * This stripes guard is in one of the cockpit rooms. - */ -u8 func100c_cockpit_stripes[] = { - set_shotlist(GAILIST_ALERTED) - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_self_chrflag(CHRCFLAG_00000040) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x06) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_target_is_player(/*goto*/ 0x06) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) - set_returnlist(CHR_SELF, AILIST_COCKPIT_STRIPES) - set_shotlist(GAILIST_COMBAT_WITH_TARGET) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - label(0x2d) - endloop(0x04) - - label(0x06) - unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040f_taker1[] = { - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) - set_chr_dodge_rating(2, 0) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_target_chr(CHR_PILOT1) - set_ailist(CHR_SELF, AILIST_TAKER) - endlist -}; - -u8 func0410_taker2[] = { - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) - set_chr_dodge_rating(2, 0) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_target_chr(CHR_PILOT2) - set_ailist(CHR_SELF, AILIST_TAKER) - endlist -}; - -u8 func0413_taker[] = { - set_shotlist(GAILIST_ALERTED) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_accuracy(50) - set_self_chrflag(CHRCFLAG_00000040) - restart_timer - - // Wait for condition - beginloop(0x04) - if_door_state(0x0c, (DOORSTATE_OPEN | DOORSTATE_CLOSING | DOORSTATE_OPENING), /*goto*/ 0x0a) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, FALSE, /*goto*/ 0x2d) - if_timer_gt(7200, /*goto*/ 0x0a) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x0a) - label(0x2d) - endloop(0x04) - - // Wait another 1.5 seconds - label(0x0a) - restart_timer - - beginloop(0x0c) - if_timer_gt(90, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x11) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x06) - label(0x06) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - label(0x08) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x00, BANK_0, 0x00, 0x00) - say_quip(CHR_BOND, QUIP_ATTACK2, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - restart_timer - - beginloop(0x09) - if_chr_stopped(/*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - if_target_is_player(/*goto*/ 0x11) - if_chrpresets_target_is_different(/*goto*/ 0x2d) - goto_next(0x11) - - label(0x2d) - damage_chr(CHR_TARGET, WEAPON_SUPERDRAGON) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - if_chr_dead(CHR_TARGET, /*goto*/ 0x06) - goto_first(0x0a) - - label(0x11) - label(0x06) - unset_self_flag_bankx(CHRFLAG1_NOHANDCOMBAT, BANK_1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func100c_cockpit[] = { - label(0x2d) - label(0x2e) - set_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) - - beginloop(0x60) - if_all_objectives_complete(/*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x2e) - endloop(0x60) - - // All objectives complete - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // UFO attachment damaged - label(0x2e) - yield - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_TAKER1, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_TAKER2, CHRCFLAG_INVINCIBLE) - label(0x06) - - // This loop will surely never iterate because - // the UFO attachment is already damaged - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - if_chr_deadish(CHR_TAKER1, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_chr_deadish(CHR_TAKER2, /*goto*/ 0x2d) - goto_next(0x06) - - // Both takers dead - label(0x2d) - goto_next(0x2e) - - // At least one taker alive - label(0x06) - damage_chr(CHR_PILOT1, WEAPON_SUPERDRAGON) - damage_chr(CHR_PILOT2, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_PILOT1, WEAPON_SUPERDRAGON) - damage_chr(CHR_PILOT2, WEAPON_SUPERDRAGON) - yield - damage_chr(CHR_PILOT1, WEAPON_SUPERDRAGON) - damage_chr(CHR_PILOT2, WEAPON_SUPERDRAGON) - yield - set_stage_flag(STAGEFLAG_PILOTS_DEAD) - show_hudmsg(CHR_BOND, L_RIT_027) // "Pilots have been killed." - goto_next(0x06) - - // Both takers dead - label(0x2e) - - // Pilots killed - label(0x06) - label(0x10) - set_stage_flag(STAGEFLAG_PLANE_NOSEDIVING) - set_object_image(OBJ_AUTOPILOT_SWITCH, 0, TVCMDLIST_0F) - - // Wait 10 seconds - label(0x09) - restart_timer - - beginloop(0x0f) - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) - if_timer_gt(600, /*goto*/ 0x2d) - endloop(0x0f) - - label(0x2d) - configure_environment(0x0000, AIENVCMD_PLAYNOSEDIVE, 60) - - // Wait 40 seconds or for autopilot - restart_timer - - beginloop(0x0a) - if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x11) - if_timer_gt(2400, /*goto*/ 0x0b) - endloop(0x0a) - - label(0x0b) - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x11) - show_hudmsg(CHR_BOND, L_RIT_029) // "Air Force One is about to crash." - - // Wait until the 50 second mark - beginloop(0x0c) - if_all_objectives_complete(/*goto*/ 0x11) - if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x11) - if_timer_gt(3000, /*goto*/ 0x0e) - endloop(0x0c) - - // Crash - label(0x0e) - set_stage_flag(STAGEFLAG_PLANE_CRASHED) - explosions_around_chr(CHR_BOND) - restart_timer - - beginloop(0x65) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x65) - - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - label(0x7c) - label(0x2d) - set_object_image(0x03, 0, TVCMDLIST_13) - set_stage_flag(STAGEFLAG_PLANE_STABILIZED) - show_hudmsg(CHR_BOND, L_RIT_028) // "Pilots have been saved." - stop_ambient_track - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - label(0x08) - goto_first(0x04) - - // Plane stabilized or all objectives complete - label(0x11) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to a pilot and a cyclone guard. - */ -u8 func0411_typing_guy[] = { - set_shotlist(AILIST_TYPING_GUY) - label(0x04) - chr_do_animation(ANIM_SITTING_TYPING, 0, -1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) - - beginloop(0x03) - if_chr_idle(/*goto*/ 0x06) - goto_first(0x04) - - label(0x06) - endloop(0x03) - - endlist -}; - -/** - * Assigned to a pilot and a cyclone guard. - */ -u8 func0412_sitting_guy[] = { - set_shotlist(AILIST_SITTING_GUY) - label(0x04) - chr_do_animation(ANIM_SITTING_DORMANT, 0, -1, CHRANIMFLAG_PAUSEATEND, 16, CHR_SELF, 2) - - beginloop(0x03) - if_chr_idle(/*goto*/ 0x06) - goto_first(0x04) - - label(0x06) - endloop(0x03) - - endlist -}; - -u8 func0426_start_path00[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(0) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0427_start_path01[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(1) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0428_start_path02[] = { - assign_path(2) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_AIRFORCEONE_INTRO) - camera_movement(ANIM_CUT_RIT_INTRO_CAM_01) - set_chr_chrflag(0x30, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x30, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x30, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_INTRO_STR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x30, 4) - set_chr_chrflag(0x31, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x31, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x31, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_INTRO_TRENT, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x31, 4) - set_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_PRESIDENT, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_INTRO_PRES, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_PRESIDENT, 4) - set_chr_chrflag(0x13, CHRCFLAG_HIDDEN) - set_chr_chrflag(0x14, CHRCFLAG_HIDDEN) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x7d) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(140, 0x94) - - wait_until(180, 0x60) - speak(CHR_BOND, L_RIT_073, MP3_044C, CHANNEL_7, COLOR_05_GREEN) // "Have you thought any more about that proposal I ga..." - - wait_until(330, 0x95) - - wait_until(360, 0x96) - - wait_until(438, 0x77) - speak(CHR_BOND, L_RIT_074, MP3_044D, CHANNEL_7, COLOR_08_RED) // "My answer remains the same... I'm sorry Trent, but..." - - wait_until(486, 0x97) - - wait_until(532, 0x98) - - wait_until(850, 0x99) - - wait_until(1020, 0x78) - speak(CHR_BOND, L_RIT_075, MP3_044E, CHANNEL_7, COLOR_05_GREEN) // "But this is a golden opportunity to show that Amer..." - - wait_until(1402, 0x79) - speak(CHR_BOND, L_RIT_076, SFX_81BB, CHANNEL_7, COLOR_08_RED) // "Damn it, man! I say no and I mean no! I'm not gonn..." - - wait_until(2348, 0x7a) - speak(CHR_BOND, L_RIT_077, MP3_0450, CHANNEL_7, COLOR_05_GREEN) // "As you wish, sir." - - wait_until(2406, 0x9a) - - wait_until(2410, 0x62) - open_door(0x15) - - wait_until(2465, 0x9b) - - wait_until(2498, 0x9c) - - wait_until(2560, 0x9d) - - wait_until(2616, 0x9e) - - wait_until(2654, 0x7b) - speak(CHR_BOND, L_RIT_078, MP3_0451, CHANNEL_7, COLOR_05_GREEN) // "My last chance? Ha! You fool. That was yours." - close_door(0x15) - play_sound(SFX_DOOR_8008, CHANNEL_10) - - wait_until(2680, 0x9f) - - wait_until(2710, 0xa0) - - wait_until(2790, 0xa5) - - wait_until(3140, 0xa1) - - wait_until(3180, 0xa2) - - wait_until(3190, 0xa3) - - wait_until(3210, 0xa4) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x7d) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x7d) - label(0x2d) - endloop(0x08) - - label(0x7d) - mute_channel(CHANNEL_10) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) - label(0x2d) - if_savefile_flag_is_set(GAMEFILEFLAG_AF1_ENTRY, /*goto*/ 0x06) - goto_next(0x7e) - label(0x06) - camera_movement(ANIM_CUT_RIT_INTRO_CAM_02) - cmd0175(60) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - chr_move_to_pad(CHR_COOP, PAD_RIT_008A, 0x01, /*goto*/ 0x2d) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x5f) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x5f) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x5f) - label(0x2d) - endloop(0x09) - - label(0x7e) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISED) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - set_chr_hiddenflag(CHR_COOP, CHRHFLAG_DISGUISED) - label(0x2d) - camera_movement(ANIM_CUT_RIT_INTRO_CAM_03) - cmd0175(60) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - chr_move_to_pad(CHR_COOP, PAD_RIT_00B2, 0x01, /*goto*/ 0x2d) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x5f) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - beginloop(0x0a) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x5f) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x5f) - label(0x2d) - endloop(0x0a) - - label(0x5f) - mute_channel(CHANNEL_7) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - if_savefile_flag_is_set(GAMEFILEFLAG_AF1_ENTRY, /*goto*/ 0x06) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - chr_do_animation(ANIM_CUT_RIT_INTRO_JO_02, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - goto_next(0x2d) - label(0x06) - chr_do_animation(ANIM_CUT_RIT_INTRO_JO_01, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - label(0x2d) - stop_cutscene_track - stop_ambient_track - unset_chr_chrflag(0x13, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x14, CHRCFLAG_HIDDEN) - set_ailist(CHR_PRESIDENT, AILIST_INIT_PRESIDENT) - set_ailist(0x09, AILIST_INIT_NEUTRAL) - set_ailist(0x0a, AILIST_INIT_NEUTRAL) - set_ailist(0x0c, AILIST_INIT_NEUTRAL) - set_ailist(0x0d, AILIST_INIT_NEUTRAL) - remove_chr(0x30) - remove_chr(0x31) - unset_chr_chrflag(0x30, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x31, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_PRESIDENT, CHRCFLAG_UNPLAYABLE) - set_stage_flag(STAGEFLAG_INTRO_FINISHED) - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * The dumbwaiter near the middle of the plane. - */ -u8 func1010_dumbwaiter1[] = { - label(0x03) - set_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) - set_object_image(OBJ_DUMBWAITER1_SWITCH, 0, TVCMDLIST_12) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER1_SWITCH, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - play_sound(SFX_043A, CHANNEL_7) - set_object_image(OBJ_DUMBWAITER1_SWITCH, 0, TVCMDLIST_13) - unset_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) - yield - yield - yield - - beginloop(0x08) - if_lift_stationary(OBJ_DUMBWAITER1, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - unset_object_flag(OBJ_DUMBWAITER1, OBJFLAG_DEACTIVATED) - yield - yield - yield - - beginloop(0x0a) - if_lift_stationary(OBJ_DUMBWAITER1, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x06) - endloop(0x0a) - - label(0x2d) - yield - yield - yield - - beginloop(0x0b) - if_lift_stationary(OBJ_DUMBWAITER1, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - open_door(0x2b) -#endif - if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER1_SWITCH, /*goto*/ 0x2d) - label(0x2d) - goto_first(0x03) - - endlist -}; - -u8 func1011_dumbwaiter2[] = { - label(0x03) - set_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) - set_object_image(OBJ_DUMBWAITER2_SWITCH, 0, TVCMDLIST_12) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER2_SWITCH, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - play_sound(SFX_043A, CHANNEL_7) - set_object_image(OBJ_DUMBWAITER2_SWITCH, 0, TVCMDLIST_13) - unset_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) - yield - yield - yield - - beginloop(0x08) - if_lift_stationary(OBJ_DUMBWAITER2, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - unset_object_flag(OBJ_DUMBWAITER2, OBJFLAG_DEACTIVATED) - yield - yield - yield - - beginloop(0x0a) - if_lift_stationary(OBJ_DUMBWAITER2, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - // @bug: Wrong object, but this is a no-op anyway. - if_chr_activated_object(CHR_P1P2, OBJ_DUMBWAITER1_SWITCH, /*goto*/ 0x2d) - label(0x2d) - goto_first(0x03) - - endlist -}; - -u8 func040a_defend_pad[] = { - set_shotlist(AILIST_DEFEND_PAD) - set_returnlist(CHR_SELF, AILIST_DEFEND_PAD) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - // Dying - label(0x2d) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - // Injured - label(0x2d) - - beginloop(0x0a) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0a) - - // Not injured - label(0x06) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) - - label(0x03) - jog_to_pad(PAD_PRESET) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - stop_chr - - beginloop(0x09) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - // Detected enemy - label(0x08) - set_returnlist(CHR_SELF, AILIST_DEFEND_PAD) - set_shotlist(AILIST_DEFEND_PAD) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -/** - * Unused, but would have been assigned to a cyclone guard. - */ -u8 func040b_defend_president[] = { - set_shotlist(AILIST_DEFEND_PRESIDENT) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_distance_to_chr_lt(200, CHR_PRESIDENT, /*goto*/ 0x06) - - label(0x03) - try_jog_to_chr(CHR_PRESIDENT, /*goto*/ 0x04) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_detected_chr(CHR_PRESIDENT, /*goto*/ 0x60) - endloop(0x04) - - // Near president - label(0x60) - if_distance_to_chr_lt(200, CHR_PRESIDENT, /*goto*/ 0x06) - goto_first(0x04) - - label(0x06) - stop_chr - - beginloop(0x09) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_detected_chr(CHR_PRESIDENT, /*goto*/ 0x60) - goto_first(0x04) - - label(0x60) - if_distance_to_chr_gt(300, CHR_PRESIDENT, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - goto_first(0x03) - - // Detected enemy - label(0x08) - set_returnlist(CHR_SELF, AILIST_DEFEND_PRESIDENT) - set_shotlist(AILIST_DEFEND_PRESIDENT) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func0415_cloner1[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) - reloop(0x03) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_AT_POD, TRUE, /*goto*/ 0x06) - endloop(0x03) - - label(0x06) - - set_chr_team(CHR_SELF, TEAM_04) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) - // These rooms are the attachment area - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0019, /*goto*/ 0x2d) - if_never_been_onscreen(/*goto*/ 0x4f) - if_can_see_target(/*goto*/ 0x08) - label(0x2d) - reloop(0x04) - - // Line of sight to player - label(0x08) - set_ailist(CHR_SELF, AILIST_CLONE1) - - // Chr flag is unset - label(0x4f) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - // @bug? This may have intended to be a bank 1 check because the bank 1 - // flag is unset further below, and cloner3 uses bank 1. - label(0x4f) - if_self_flag_bankx_eq(CHRFLAG0_SQUADALERTANYDIST, TRUE, BANK_0, /*goto*/ 0x2d) - restart_timer - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) - if_timer_gt(2400, /*goto*/ 0x2d) - endloop(0x0b) - - // Player is in UFO area, or interval has passed - label(0x2d) - unset_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE1, 0, /*goto*/ 0x2d) - label(0x2d) - yield - endloop(0x04) - - // UFO attachment damaged - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0416_init_clone1[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x35, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_CLONE1) - endlist -}; - -u8 func0417_clone1[] = { - // Pad is at the cockpit door - run_to_pad(PAD_RIT_0042) - set_returnlist(CHR_SELF, AILIST_CLONE1) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0418_cloner2[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) - reloop(0x03) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_AT_POD, TRUE, /*goto*/ 0x06) - endloop(0x03) - - label(0x06) - - set_chr_team(CHR_SELF, TEAM_04) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) - yield - yield - yield - yield - yield - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) - // These rooms are the attachment area - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0019, /*goto*/ 0x2d) - if_never_been_onscreen(/*goto*/ 0x4f) - if_can_see_target(/*goto*/ 0x08) - label(0x2d) - reloop(0x04) - - // Line of sight to player - label(0x08) - set_ailist(CHR_SELF, AILIST_CLONE2) - - // Chr flag is unset - label(0x4f) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - // @bug? This may have intended to be a bank 1 check because the bank 1 - // flag is unset further below, and cloner3 uses bank 1. - label(0x4f) - if_self_flag_bankx_eq(CHRFLAG0_SQUADALERTANYDIST, TRUE, BANK_0, /*goto*/ 0x2d) - restart_timer - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) - if_timer_gt(3600, /*goto*/ 0x2d) - endloop(0x0b) - - // Player is in UFO area, or interval has passed - label(0x2d) - unset_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE2, 0, /*goto*/ 0x2d) - label(0x2d) - yield - endloop(0x04) - - // UFO attachment damaged - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0419_init_clone2[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x36, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_CLONE2) - endlist -}; - -u8 func041a_clone2[] = { - // Pad is at back of the plane, top floor - run_to_pad(PAD_RIT_005C) - set_returnlist(CHR_SELF, AILIST_CLONE2) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Unlike the other two cloners, this one does not stop once the president has - * reached the escape pod. - */ -u8 func041b_cloner3[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x06) - endloop(0x03) - - label(0x06) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - set_chr_team(CHR_SELF, TEAM_04) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0017, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0019, /*goto*/ 0x2d) - if_never_been_onscreen(/*goto*/ 0x4f) - if_can_see_target(/*goto*/ 0x08) - label(0x2d) - reloop(0x04) - - label(0x08) - set_ailist(CHR_SELF, AILIST_CLONE3) - label(0x4f) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - label(0x4f) - if_self_flag_bankx_eq(CHRFLAG1_NOIDLEANIMS, TRUE, BANK_1, /*goto*/ 0x2d) - restart_timer - - beginloop(0x0b) - if_stage_flag_eq(STAGEFLAG_UFO_ATTACHMENT_DAMAGED, TRUE, /*goto*/ 0x0e) - if_timer_gt(3600, /*goto*/ 0x2d) - endloop(0x0b) - - label(0x2d) - unset_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE3, 0, /*goto*/ 0x2d) - label(0x2d) - yield - endloop(0x04) - - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041c_init_clone3[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - try_equip_weapon(MODEL_CHRAVENGER, WEAPON_K7AVENGER, 0x10000000, /*goto*/ 0x04) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x37, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_CLONE3) - endlist -}; - -u8 func041d_clone3[] = { - set_target_chr(CHR_BOND) - try_run_to_target(/*goto*/ 0x04) - label(0x04) - yield - set_returnlist(CHR_SELF, AILIST_CLONE3) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func041f_init_blonde[] = { - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_chr_dodge_rating(2, 0) - set_accuracy(24) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(100) - set_recovery_speed(100) - set_shield(0) - set_ailist(CHR_SELF, AILIST_BLONDE) - endlist -}; - -u8 func041e_blonde[] = { - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_accuracy(30) - set_shotlist(AILIST_BLONDE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x2d) - - // Dying - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x54) - if_timer_gt(15, /*goto*/ 0x06) - endloop(0x54) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - // This injured check is pointless - label(0x2d) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x08) - - label(0x06) - label(0x08) - set_self_chrflag(CHRCFLAG_00000040) - label(0x68) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x75) - label(0x06) - kneel - - beginloop(0x75) - label(0x2d) - chr_toggle_p1p2(CHR_P1P2) - set_target_chr(CHR_BOND) - if_target_in_sight(/*goto*/ 0x6a) - if_near_miss(/*goto*/ 0x6b) - label(0x2d) - reloop(0x75) - - label(0x06) - if_target_in_sight(/*goto*/ 0x6a) - label(0x2d) - endloop(0x75) - - label(0x6a) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2d) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - label(0x2d) - goto_next(0x6c) - - // Unreachable - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x6d) - goto_next(0x6e) - - // Reachable from below - beginloop(0x6d) - if_chr_stopped(/*goto*/ 0x6e) - endloop(0x6d) - - label(0x6e) - restart_timer - chr_do_animation(ANIM_RELOAD_0209, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x66) - if_self_flag_bankx_eq(CHRFLAG1_CAN_RELOAD, FALSE, BANK_1, /*goto*/ 0x06) - if_timer_lt(120, /*goto*/ 0x06) - assign_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_7) - play_sound_from_entity(CHANNEL_7, CHR_SELF, 0x0bb8, 0x1770, 0x01) - unset_self_flag_bankx(CHRFLAG1_CAN_RELOAD, BANK_1) - label(0x06) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x66) - - label(0x2d) - label(0x06) - goto_first(0x68) - - label(0x6b) - restart_timer - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x6f) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - - label(0x6f) - call_rng - if_target_in_sight(/*goto*/ 0x70) - if_timer_gt(60, /*goto*/ 0x71) - if_rand_lt(4, /*goto*/ 0x71) - goto_first(0x6f) - - label(0x71) - if_can_see_target(/*goto*/ 0x70) - goto_first(0x68) - - label(0x70) - goto_first(0x6a) - - label(0x72) - restart_timer - - beginloop(0x73) - if_can_see_target(/*goto*/ 0x70) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x73) - - label(0x06) - goto_first(0x68) - - label(0x70) - goto_first(0x6a) - - label(0x6c) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) - label(0x06) - goto_first(0x6d) - - label(0x2d) - goto_first(0x6e) - - label(0x76) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x74) - label(0x74) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) - goto_next(0x2d) - label(0x06) - goto_first(0x6d) - - label(0x2d) - goto_first(0x6e) - - endlist -}; - -u8 func0421_trent_waiting[] = { - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_self_chrflag(CHRCFLAG_00000040) - set_shield(500) - set_chr_chrflag(CHR_TRENT, CHRCFLAG_INVINCIBLE) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x06) - endloop(0x04) - - label(0x06) - restart_timer - speak(CHR_TARGET, L_RIT_045, SFX_816F, CHANNEL_6, COLOR_05_GREEN) // "How the hell did you get on board?" - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_ailist(CHR_SELF, AILIST_TRENT_ATTACKING) - endlist -}; - -u8 func0420_trent_attacking[] = { - label(0x03) - stop_chr - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_shield_damaged(CHR_SELF, /*goto*/ 0x2d) - set_target_chr(CHR_PRESIDENT) - if_target_in_sight(/*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_ONE_BLONDE_DEAD, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - // One Blonde dead or player in sight - label(0x2d) - set_shield(500) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) - speak(CHR_P1P2, L_RIT_070, MP3_02CB, CHANNEL_6, COLOR_05_GREEN) // "Ha, Ha, Ha, Ha, Ha." - set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) - - // President in sight - label(0x06) - label(0x76) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x74) - label(0x74) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x08) - goto_next(0x2d) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x09) - goto_first(0x03) - - label(0x2d) - goto_first(0x03) - - label(0x09) - restart_timer - chr_do_animation(ANIM_TALKING_0231, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - speak(CHR_P1P2, L_RIT_071, MP3_02CA, CHANNEL_6, COLOR_05_GREEN) // "You'll never save him now." - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_ailist(CHR_SELF, AILIST_TRENT_RUNNING) - endlist -}; - -u8 func0422_trent_running[] = { - run_to_pad(PAD_RIT_0034) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x06) - set_self_chrflag(CHRCFLAG_HIDDEN) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_alertness(100) - set_returnlist(CHR_SELF, GAILIST_UNALERTED) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func1012_check_blondes_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_BLONDE1, /*goto*/ 0x2d) - if_chr_deadish(CHR_BLONDE2, /*goto*/ 0x06) - reloop(0x04) - - // Blonde 2 dead - label(0x06) - set_stage_flag(STAGEFLAG_ONE_BLONDE_DEAD) - reloop(0x04) - - // Blonde 1 dead - label(0x2d) - set_stage_flag(STAGEFLAG_ONE_BLONDE_DEAD) - if_chr_deadish(CHR_BLONDE2, /*goto*/ 0x2d) - endloop(0x04) - - // Both blondes dead - label(0x2d) - set_stage_flag(STAGEFLAG_BOTH_BLONDES_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_unhide_trent_and_blondes[] = { - yield - disable_chr(CHR_TRENT) - disable_chr(CHR_BLONDE1) - disable_chr(CHR_BLONDE2) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_PRESIDENT_STARTED_RUNNING, TRUE, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_y(CHR_P1P2, 190, OPERATOR_LESS_THAN, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - enable_chr(CHR_TRENT) - set_ailist(CHR_TRENT, AILIST_TRENT_WAITING) - enable_chr(CHR_BLONDE1) - set_ailist(CHR_BLONDE1, AILIST_INIT_BLONDE) - enable_chr(CHR_BLONDE2) - set_ailist(CHR_BLONDE2, AILIST_INIT_BLONDE) - yield - unset_chr_chrflag(CHR_TRENT, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE1, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BLONDE2, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to basically everyone during president conversation. - */ -u8 func0429_be_unalert[] = { - set_shotlist(GAILIST_ALERTED) - set_target_chr(CHR_BOND) - set_alertness(0) - - label(0x03) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x04) - - beginloop(0x04) - if_chr_stopped(/*goto*/ 0x06) - if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x2d) - endloop(0x04) - - label(0x06) - goto_first(0x03) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Would have given the player one minute before the diguise was uncovered. - * The set_ailist at the start has effectively disabled this function. - */ -u8 func1014_uncover_disguise[] = { - set_ailist(CHR_SELF, GAILIST_IDLE) - restart_timer - - beginloop(0x04) - if_timer_gt(3600, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Assigned to presidential security as well as the two mechanics. - */ -u8 func042a_init_neutral[] = { - yield - - beginloop(0x60) - if_camera_animating(/*goto*/ 0x77) - goto_next(0x06) - - label(0x77) - endloop(0x60) - - label(0x06) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(70) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func042b_reinit_stripes[] = { - set_chr_dodge_rating(2, 0) - set_accuracy(14) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(0) - set_recovery_speed(30) - set_shield(0) - set_chr_team(CHR_SELF, TEAM_04) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_STRIPES) - endlist -}; - -u8 func0407_steward[] = { - set_shotlist(AILIST_STEWARD_SHOT) - - beginloop(0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_chr_idle(/*goto*/ 0x2d) - call_rng - if_rand_lt(32, /*goto*/ 0x0f) - call_rng - if_rand_lt(32, /*goto*/ 0x8a) - if_rand_lt(64, /*goto*/ 0x8b) - if_rand_lt(96, /*goto*/ 0x8c) - if_rand_lt(128, /*goto*/ 0x8d) - if_rand_lt(160, /*goto*/ 0x8e) - if_rand_lt(192, /*goto*/ 0x8f) - if_rand_lt(224, /*goto*/ 0x90) - - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x8a) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x8b) - chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x8c) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x8d) - chr_do_animation(ANIM_OPERATE_0221, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x8e) - chr_do_animation(ANIM_OPERATE_0223, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x8f) - chr_do_animation(ANIM_023A, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x90) - chr_do_animation(ANIM_HEAD_ROLL, -1, -1, CHRANIMFLAG_FLIP | CHRANIMFLAG_SLOWUPDATE, 1, CHR_SELF, 2) - goto_next(0x2d) - - label(0x0f) - call_rng - if_rand_lt(86, /*goto*/ 0x60) - if_rand_lt(172, /*goto*/ 0x77) - - if_chr_distance_to_pad_lt(CHR_SELF, 50, PAD_RIT_00C1, /*goto*/ 0x60) - label(0x79) - walk_to_pad(PAD_RIT_00C1) - set_morale(1) - set_padpreset(PAD_RIT_00C2) - goto_next(0x87) - - label(0x60) - if_chr_distance_to_pad_lt(CHR_SELF, 50, PAD_RIT_00C3, /*goto*/ 0x77) - walk_to_pad(PAD_RIT_00C3) - set_morale(2) - set_padpreset(PAD_RIT_00C4) - goto_next(0x87) - - label(0x77) - if_chr_distance_to_pad_lt(CHR_SELF, 50, PAD_RIT_00C1, /*goto*/ 0x78) - set_morale(3) - set_padpreset(PAD_RIT_00C6) - walk_to_pad(PAD_RIT_00C5) - goto_next(0x87) - - label(0x78) - goto_first(0x79) - - beginloop(0x87) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_in_sight(/*goto*/ 0x89) - if_saw_injury(0x00, /*goto*/ 0x89) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x87) - - label(0x06) - try_face_entity(ATTACKFLAG_AIMATPAD, PAD_PRESET, /*goto*/ 0x88) - - beginloop(0x88) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x88) - - label(0x06) - reloop(0x03) - - chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - label(0x2d) - if_target_in_sight(/*goto*/ 0x89) - if_saw_injury(0x00, /*goto*/ 0x89) - endloop(0x03) - - // Detected player - label(0x89) - set_alertness(100) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - increase_squadron_alertness(100) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) - do_preset_animation(PRESETANIM_TALKRANDOM) - restart_timer - speak(CHR_P1P2, L_RIT_043, MP3_02BB, CHANNEL_4, COLOR_04_ORANGE) // "Hey, that's not..." - - beginloop(0x08) - if_timer_gt(35, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - mute_channel(CHANNEL_4) - set_ailist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0425_steward_shot[] = { - mute_channel(CHANNEL_4) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func0408_stewardess[] = { - set_chr_maxdamage(CHR_SELF, 0) - set_shotlist(AILIST_STEWARDESS) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x03) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Wait until alerted - beginloop(0x03) - if_chr_idle(/*goto*/ 0x2d) - chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - label(0x2d) - if_alertness(99, OPERATOR_GREATER_THAN, /*goto*/ 0x2d) - if_saw_injury(0x00, /*goto*/ 0x2d) - if_chr_deadish(CHR_STEWARD, /*goto*/ 0x2d) - endloop(0x03) - - // Alerted - label(0x2d) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_DISGUISE_UNCOVERED) - chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - try_set_chrpreset_to_unalerted_teammate(0, /*goto*/ 0x2d) - goto_next(0x0a) - - label(0x2d) - try_run_to_chr(CHR_PRESET, /*goto*/ 0x7f) - - beginloop(0x7f) - if_detected_chr(CHR_PRESET, /*goto*/ 0x80) - if_chr_stopped(/*goto*/ 0x80) - endloop(0x7f) - - label(0x80) - play_sound(MP3_02DC, CHANNEL_7) - increase_squadron_alertness(100) - - label(0x0a) - set_self_chrflag(CHRCFLAG_PUSHABLE) - chr_do_animation(ANIM_COWER_0229, -1, 190, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - beginloop(0x83) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x83) - - label(0x2d) - goto_first(0x0a) - - endlist -}; - -u8 func1015_msg_retrievetheevidence[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_INTRO_FINISHED, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - speak(CHR_BOND, L_RIT_046, MP3_03C8, CHANNEL_6, COLOR_09_BLUE) // "Now, let's retrieve the evidence." - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_msg_onthislevel[] = { - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 440, OPERATOR_LESS_THAN, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x06) - endloop(0x04) - - label(0x2d) - set_target_chr(CHR_PRESET) - speak(CHR_TARGET, L_RIT_047, SFX_8185, CHANNEL_6, COLOR_09_BLUE) // "The President's room is on this level, Joanna." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_msg_gettothecockpit[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x0e) - if_stage_flag_eq(STAGEFLAG_PILOTS_DEAD, TRUE, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PLANE_NOSEDIVING, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x0e) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - speak(CHR_BOND, L_RIT_048, SFX_8186, CHANNEL_5, COLOR_09_BLUE) // "Something's wrong... You have to get to the cockpi..." - - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_msg_maybeamine[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ALL_OBJECTIVES_COMPLETE, TRUE, /*goto*/ 0x0e) - chr_toggle_p1p2(CHR_SELF) - if_objective_complete(2, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0018, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - speak(CHR_P1P2, L_RIT_049, MP3_03CB, CHANNEL_6, COLOR_09_BLUE) // "Maybe a mine will detach the UFO." - - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c02_outro_from_menu[] = { - set_ailist(CHR_ELVIS, GAILIST_IDLE) - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func0423_outro[] = { - configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) - set_target_chr(CHR_BOND) - goto_next(0x06) - label(0x2d) - set_target_chr(CHR_COOP) - label(0x06) - camera_movement(ANIM_CUT_RIT_OUTRO_CAM) - play_cutscene_track(MUSIC_AIRFORCEONE_OUTRO) - configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - set_ailist(CHR_TARGET, GAILIST_IDLE) - set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_OUTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) - set_chr_hudpiece_visible(CHR_TARGET, TRUE) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_RIT_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - enable_object(0x19) - set_object_flag2(0x19, OBJFLAG2_04000000) - set_object_flag3(0x19, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_RIT_OUTRO_SKSHUTTLE, 0x19, 0x04, 0xffff) - enable_object(0x1a) - set_object_flag2(0x1a, OBJFLAG2_04000000) - set_object_flag3(0x1a, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_RIT_OUTRO_UFOEXTERIOR, 0x1a, 0x04, 0xffff) - enable_object(0x23) - set_object_flag2(0x23, OBJFLAG2_04000000) - set_object_flag3(0x23, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_RIT_OUTRO_UFOINTERIOR, 0x23, 0x04, 0xffff) - enable_object(0x37) - set_object_flag2(0x37, OBJFLAG2_04000000) - set_object_flag3(0x37, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_RIT_OUTRO_PLANE, 0x37, 0x04, 0xffff) - restart_timer - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - show_nonessential_chrs(FALSE) - label(0x60) - yield - if_controller_button_pressed(/*goto*/ 0x5f) - if_timer_gt(20, /*goto*/ 0x06) - goto_first(0x60) - - label(0x06) - speak(CHR_BOND, L_RIT_079, MP3_0452, CHANNEL_7, COLOR_09_BLUE) // "Elvis! Elvis! I can't detach that tube from the fu..." - - #define outro_wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x5f) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - outro_wait_until(426, 0x77) - speak(CHR_BOND, L_RIT_080, MP3_0453, CHANNEL_7, COLOR_06_WHITE) // "Piece of cake, Joanna. Watch this!" - - outro_wait_until(1045, 0x65) - play_sound(SFX_0063, CHANNEL_10) - - outro_wait_until(1050, 0x78) - speak(CHR_BOND, L_RIT_081, MP3_0454, CHANNEL_7, COLOR_06_WHITE) // "Uh-oh." - emit_sparks(0x23) - - outro_wait_until(1112, 0x79) - speak(CHR_BOND, L_RIT_082, MP3_0455, CHANNEL_7, COLOR_09_BLUE) // "Watch what? Will you stop playing around and shoot..." - - outro_wait_until(1380, 0x7a) - speak(CHR_BOND, L_RIT_083, MP3_0456, CHANNEL_7, COLOR_06_WHITE) // "Out of options... Joanna, brace yourself for impac..." - - outro_wait_until(1950, 0x7b) - - outro_wait_until(1951, 0x62) - destroy_object(0x1a) - - outro_wait_until(1958, 0x63) - destroy_object(0x1a) - - outro_wait_until(1970, 0x64) - destroy_object(0x1a) - destroy_object(0x19) - - outro_wait_until(1985, 0x8e) - destroy_object(0x1a) - - outro_wait_until(2000, 0x8a) - destroy_object(0x1a) - - outro_wait_until(2015, 0x8b) - destroy_object(0x1a) - - outro_wait_until(2030, 0x8c) - destroy_object(0x1a) - - outro_wait_until(2045, 0x8d) - destroy_object(0x1a) - - outro_wait_until(2060, 0x8f) - destroy_object(0x1a) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x5f) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x5f) - label(0x2d) - endloop(0x08) - - label(0x5f) - mute_channel(CHANNEL_10) - label(0x06) - stop_cutscene_track - configure_environment(0x0000, AIENVCMD_STOPNOSEDIVE, 0) - disable_object(0x19) - disable_object(0x1a) - set_chr_hudpiece_visible(CHR_TARGET, FALSE) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1019_midcutscene[] = { - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MIDCUTSCENE, TRUE, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_STARTED, TRUE, /*goto*/ 0x2d) - set_stage_flag(STAGEFLAG_MIDCUTSCENE_STARTED) - play_cutscene_track(MUSIC_AIRFORCEONE_MIDCUTSCENE) - label(0x2d) - camera_movement(ANIM_CUT_RIT_MID_CAM) - - enable_object(0x19) - set_object_flag2(0x19, OBJFLAG2_04000000) - set_object_flag3(0x19, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_RIT_MID_SKSHUTTLE, 0x19, 0x04, 0xffff) - object_set_modelpart_visible(0x19, MODELPART_SKSHUTTLE_GANGWAY, TRUE) - - enable_object(0x37) - set_object_flag2(0x37, OBJFLAG2_04000000) - set_object_flag3(0x37, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_RIT_MID_PLANE, 0x37, 0x04, 0xffff) - - restart_timer - - outro_wait_until(1086, 0x61) - play_sound(SFX_DOOR_042C, -1) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x5f) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x5f) - label(0x2d) - endloop(0x09) - - label(0x5f) - disable_object(0x37) - disable_object(0x19) - label(0x06) - set_stage_flag(STAGEFLAG_MIDCUTSCENE_FINISHED) - stop_cutscene_track - stop_ambient_track - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_END_CINEMA) - endlist -}; - -u8 func1019_midcutscene_from_menu[] = { - set_stage_flag(STAGEFLAG_TRIGGER_MIDCUTSCENE) - set_ailist(CHR_SELF, AILIST_MIDCUTSCENE) - endlist -}; - -u8 func101a_equipment_switch[] = { - set_object_flag(0x1b, OBJFLAG_DEACTIVATED) - set_object_image(OBJ_EQUIPMENT_SWITCH, 0, TVCMDLIST_12) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_EQUIPMENT_SWITCH, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2d) - - restart_timer - show_hudmsg(CHR_P1P2, L_RIT_063) // "Access denied - lift key card required." - - beginloop(0x77) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x77) - - label(0x06) - endloop(0x04) - - // Switch activated with keycard - label(0x2d) - set_object_image(OBJ_EQUIPMENT_SWITCH, 0, TVCMDLIST_13) - set_stage_flag(STAGEFLAG_EQUIPMENT_RAISED) - open_door(0x1c) - show_hudmsg(CHR_P1P2, L_RIT_061) // "Cargo bay has been raised." - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_EQUIPMENT_SWITCH, TRUE) - unset_object_flag(0x1b, OBJFLAG_DEACTIVATED) - yield - yield - yield - yield - yield - yield - restart_timer - - beginloop(0x08) - if_lift_stationary(0x1b, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_object_flag(0x1b, OBJFLAG_DEACTIVATED) - set_object_image(OBJ_EQUIPMENT_SWITCH, 0, TVCMDLIST_12) - - beginloop(0x09) - if_door_state(0x1c, DOORSTATE_CLOSING, /*goto*/ 0x2d) - reloop(0x09) - - label(0x2d) - open_door(0x1c) - endloop(0x09) - - endlist -}; - -u8 func101b_hoverbike_switch[] = { - unset_savefile_flag(GAMEFILEFLAG_CRASHSITE_BIKE) - set_object_flag(0x1f, OBJFLAG_DEACTIVATED) - set_object_image(OBJ_HOVERBIKE_SWITCH, 0, TVCMDLIST_12) - label(0x08) - open_door(0x20) - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - if_door_state(0x20, DOORSTATE_CLOSING, /*goto*/ 0x2d) - if_chr_activated_object(CHR_P1P2, OBJ_HOVERBIKE_SWITCH, /*goto*/ 0x0a) - reloop(0x09) - - label(0x2d) - open_door(0x20) - reloop(0x09) - - label(0x0a) - if_chr_has_object(CHR_P1P2, OBJ_KEYCARD, /*goto*/ 0x2d) - restart_timer - show_hudmsg(CHR_P1P2, L_RIT_063) // "Access denied - lift key card required." - - beginloop(0x77) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x77) - - label(0x06) - endloop(0x09) - - // Activated with keycard - label(0x2d) - set_object_image(OBJ_HOVERBIKE_SWITCH, 0, TVCMDLIST_13) - show_hudmsg(CHR_P1P2, L_RIT_060) // "Cargo bay has been lowered." - set_savefile_flag(GAMEFILEFLAG_CRASHSITE_BIKE) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_HOVERBIKE_SWITCH, TRUE) - unset_object_flag(0x1f, OBJFLAG_DEACTIVATED) - restart_timer - - beginloop(0x0c) - if_timer_gt(2, /*goto*/ 0x2d) - endloop(0x0c) - - label(0x2d) - close_door(0x20) - - beginloop(0x0b) - if_lift_stationary(0x1f, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - set_object_flag(0x1f, OBJFLAG_DEACTIVATED) - set_object_image(OBJ_HOVERBIKE_SWITCH, 0, TVCMDLIST_12) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_check_equipment_switch_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_EQUIPMENT_SWITCH, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - endloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_EQUIPMENT_RAISED, TRUE, /*goto*/ 0x2d) - set_stage_flag(STAGEFLAG_EQUIPMENT_SWITCH_DESTROYED) - show_hudmsg(CHR_BOND, L_RIT_062) // "Mission critical object has been destroyed." - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_init_defend_pad[] = { - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_ANTINONINTERACTABLE) - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - set_target_chr(-1) - label(0x04) - try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0x2d) - label(0x2d) - set_ailist(CHR_SELF, AILIST_DEFEND_PAD) - endlist -}; - -u8 func040e_unused[] = { - label(0x04) - try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0x2d) - label(0x2d) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -/** - * Unused. - */ -u8 func040d_init_defend_president[] = { - label(0x04) - try_equip_weapon(MODEL_CHRCYCLONE, WEAPON_CYCLONE, 0x00000000, /*goto*/ 0x2d) - label(0x2d) - set_ailist(CHR_SELF, AILIST_DEFEND_PRESIDENT) - endlist -}; - -#if VERSION < VERSION_NTSC_1_0 -/** - * This is unused in ntsc-beta, and deleted in newer versions. - */ -u8 unregistered_function2[] = { - beginloop(0x04) - // Wait until player is in the dumbwaiter shaft near the UFO attachment - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x001a, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_lift_stationary(0x05, /*goto*/ 0x06) - reloop(0x04) - - // Disable the lift and wait 2 seconds - label(0x06) - set_object_flag(0x05, OBJFLAG_DEACTIVATED) - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0e) - - // Check that the player is still on the lift - label(0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x001a, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_lift_stationary(0x05, /*goto*/ 0x06) - reloop(0x04) - - // Check that the door is closing - label(0x06) - if_door_state(0x2b, DOORSTATE_CLOSED | DOORSTATE_CLOSING, /*goto*/ 0x2d) - reloop(0x04) - - // Start the lift - label(0x2d) - play_sound(SFX_043A, CHANNEL_7) - unset_object_flag(0x05, OBJFLAG_DEACTIVATED) - yield - yield - yield - - // Wait until lift has stopped, then disable it and wait 3 seconds - beginloop(0x08) - if_lift_stationary(0x05, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_object_flag(0x05, OBJFLAG_DEACTIVATED) - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x09) - - // Enable the lift again and wait for it to start moving - // ...presumably without the player on it - label(0x2d) - unset_object_flag(0x05, OBJFLAG_DEACTIVATED) - yield - yield - yield - - beginloop(0x0a) - if_lift_stationary(0x05, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x06) - endloop(0x0a) - - // Wait for the lift to arrive at its original position - label(0x2d) - yield - yield - yield - - beginloop(0x0b) - if_lift_stationary(0x05, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - endloop(0x04) - - endlist -}; -#endif - -u8 func042c_remove_if_offscreen[] = { - unset_chr_hiddenflag(CHR_SELF, CHRHFLAG_ANTINONINTERACTABLE) - set_chr_team(CHR_SELF, TEAM_ALLY) - rebuild_teams - rebuild_squadrons - set_chr_maxdamage(CHR_SELF, 0) - - label(0x04) - yield - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x06) - label(0x08) - chr_drop_weapon(CHR_SELF) - remove_chr(CHR_SELF) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_ailist(CHR_SELF, AILIST_INIT_DEFEND_PAD) - endlist -}; - -/** - * If president dies between mid cutscene and Jo's "we have to get you to the - * escape pod" line, set the flag that causes things to happen. - * - * This was most likely added after QA, hence why the original function wasn't - * changed instead. - */ -u8 func101d_handle_early_president_death[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MIDCUTSCENE_FINISHED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - disable_object(OBJ_EXTERIOR_DOOR) - unset_object_flag2(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG2_INVISIBLE) - set_object_flag(OBJ_EXTERIOR_DOOR_DETACHED, OBJFLAG_00000100) - - beginloop(0x08) - if_chr_deadish(CHR_PRESIDENT, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - set_stage_flag(STAGEFLAG_PRESIDENT_STARTED_RUNNING) - unlock_door(OBJ_COCKPITDOOR, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_check_pod_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_ESCAPE_POD, /*goto*/ 0x2d) - show_hudmsg(CHR_BOND, L_RIT_062) // "Mission critical object has been destroyed." - set_stage_flag(STAGEFLAG_POD_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func101f_setup_rtracker[] = { - yield - set_object_flag3(0x38, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(0x39, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1420_setup_environment[] = { - yield - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_pilots_stabilizing[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_PLANE_NOSEDIVING, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x93) - if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2e) - if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2e) - if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2e) - goto_next(0x06) - - label(0x2e) - if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x0e) - if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x0e) - if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x0e) - - // Pilots stabilizing - label(0x06) - if_stage_flag_eq(STAGEFLAG_PLANE_STABILIZED, TRUE, /*goto*/ 0x0e) - if_timer_gt(1200, /*goto*/ 0x06) - endloop(0x93) - - label(0x06) - show_hudmsg(CHR_BOND, L_RIT_084) // "The pilots have stabilized Air Force One." - set_stage_flag(STAGEFLAG_PLANE_STABILIZED) - - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1023_check_pilots_dead[] = { - beginloop(0x04) - if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_PILOT1, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x2d) - if_chr_death_animation_finished(CHR_PILOT2, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - set_stage_flag(STAGEFLAG_PILOTS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Wait until intro finished, then wait several frames before unsetting a flag - * on Joanna. - * - * When the flag is set, the co-op buddy will attempt to warp to Jo. This is - * needed because Jo can start in two locations in this level, but the buddy - * only starts in one location. - * - * The flag must be unset so the buddy stops attempting to warp. - */ -u8 func1025_disable_buddy_warp[] = { - yield - - beginloop(0x04) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - endloop(0x04) - - label(0x06) - yield - yield - yield - yield - yield - yield - yield - unset_chr_hiddenflag(CHR_BOND, CHRHFLAG_TRIGGER_BUDDY_WARP) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1026_buddy_floor_hatch[] = { - yield - - beginloop(0x93) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x04) - - label(0x2d) - endloop(0x93) - - // This flag is set by a global function - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_AI_BUDDY_EXISTS, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - // Maybe the AI has difficulty opening the floor hatch so they removed it? - label(0x2d) - disable_object(OBJ_FLOORHATCH) - set_object_flag(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG_00000100) - unset_object_flag2(OBJ_FLOOR_HATCH_DETACHED, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_rebuild_groups, 0x1003 }, - { func1004_reassign_ailists_during_conversation, 0x1004 }, - { func1005_check_neutrals_killed, 0x1005 }, - { func1006_hijack, 0x1006 }, - { func1007_check_pod_destroyed, 0x1007 }, - { func1008_check_mine_wasted_bond, 0x1008 }, - { func1009_check_end_level, 0x1009 }, - { func100a_autopilot_switch, 0x100a }, - { func100b_check_president_dead, 0x100b }, - { func100c_cockpit, 0x100c }, - { func1010_dumbwaiter1, 0x1010 }, - { func1011_dumbwaiter2, 0x1011 }, - { func1012_check_blondes_dead, 0x1012 }, - { func1013_unhide_trent_and_blondes, 0x1013 }, - { func1014_uncover_disguise, 0x1014 }, - { func1015_msg_retrievetheevidence, 0x1015 }, - { func1016_msg_onthislevel, 0x1016 }, - { func1017_msg_gettothecockpit, 0x1017 }, - { func1018_msg_maybeamine, 0x1018 }, - { func1019_midcutscene, 0x1019 }, - { func101a_equipment_switch, 0x101a }, - { func101b_hoverbike_switch, 0x101b }, - { func101c_check_equipment_switch_destroyed, 0x101c }, - { func101d_handle_early_president_death, 0x101d }, - { func101e_blow_mines, 0x101e }, - { func101f_setup_rtracker, 0x101f }, - { func1420_setup_environment, 0x1420 }, - { func1021_check_mine_wasted_coop, 0x1021 }, - { func1022_pilots_stabilizing, 0x1022 }, - { func1023_check_pilots_dead, 0x1023 }, - { func1024_give_objects, 0x1024 }, - { func1025_disable_buddy_warp, 0x1025 }, - { func1026_buddy_floor_hatch, 0x1026 }, - { func1002_intro, 0x0c00 }, - { func1019_midcutscene_from_menu, 0x0c01 }, - { func0c02_outro_from_menu, 0x0c02 }, - { func0401_init_stripes, 0x0401 }, - { func0402_init_elvis, 0x0402 }, - { func0403_stripes, 0x0403 }, - { func0404_president_running, 0x0404 }, - { func0405_president_in_room, 0x0405 }, - { func0406_init_president, 0x0406 }, - { func0407_steward, 0x0407 }, - { func0408_stewardess, 0x0408 }, - { func1019_midcutscene, 0x0424 }, - { func0409_unused, 0x0409 }, - { func040a_defend_pad, 0x040a }, - { func040b_defend_president, 0x040b }, - { func040c_init_defend_pad, 0x040c }, - { func040d_init_defend_president, 0x040d }, - { func040e_unused, 0x040e }, - { func0413_taker, 0x0413 }, - { func100c_cockpit_stripes, 0x0414 }, - { func040f_taker1, 0x040f }, - { func0410_taker2, 0x0410 }, - { func0413_taker, 0x0413 }, - { func0411_typing_guy, 0x0411 }, - { func0412_sitting_guy, 0x0412 }, - { func0426_start_path00, 0x0426 }, - { func0427_start_path01, 0x0427 }, - { func0428_start_path02, 0x0428 }, - { func0429_be_unalert, 0x0429 }, - { func042a_init_neutral, 0x042a }, - { func042b_reinit_stripes, 0x042b }, - { func042c_remove_if_offscreen, 0x042c }, - { func0415_cloner1, 0x0415 }, - { func0416_init_clone1, 0x0416 }, - { func0417_clone1, 0x0417 }, - { func0418_cloner2, 0x0418 }, - { func0419_init_clone2, 0x0419 }, - { func041a_clone2, 0x041a }, - { func041b_cloner3, 0x041b }, - { func041c_init_clone3, 0x041c }, - { func041d_clone3, 0x041d }, - { func041e_blonde, 0x041e }, - { func041f_init_blonde, 0x041f }, - { func0420_trent_attacking, 0x0420 }, - { func0421_trent_waiting, 0x0421 }, - { func0422_trent_running, 0x0422 }, - { func0423_outro, 0x0423 }, - { func0425_steward_shot, 0x0425 }, - { NULL, 0 }, -}; - struct path paths[] = { { path00, 0, 0 }, { path01, 1, 0 }, diff --git a/src/setups/setuprun.c b/src/setups/setuprun.c index 11ceafdf9..3ddc316d2 100644 --- a/src/setups/setuprun.c +++ b/src/setups/setuprun.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupsev.c b/src/setups/setupsev.c index 681e3f296..2fa030a3c 100644 --- a/src/setups/setupsev.c +++ b/src/setups/setupsev.c @@ -52,7 +52,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -886,1082 +886,3 @@ struct path paths[] = { { path14, 14, 0 }, { NULL, 0, 0 }, }; - -u8 func1000_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - - // These objects don't exist...? - give_object_to_chr(0x05, CHR_BOND) - give_object_to_chr(0x3a, CHR_COOP) - - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func0401_start_path00[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - assign_path(0) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0402_start_path01[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - assign_path(1) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0403_start_path02[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - assign_path(2) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0404_start_path03[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - assign_path(3) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0405_start_path04[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - assign_path(4) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0406_start_path05[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - assign_path(5) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0407_start_path06[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(6) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0408_start_path07[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(7) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0409_start_path08[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(8) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040a_start_path09[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(9) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040b_start_path10[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(10) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040c_start_path11[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(11) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040d_start_path12[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(12) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040e_start_path13[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(13) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040f_start_path14[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - assign_path(14) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func0415_init_50hp_guard[] = { - set_accuracy(10) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 50) - add_health_or_armor(0) - set_recovery_speed(35) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0416_init_80hp_guard[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0417_init_lx_guard[] = { - set_accuracy(10) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 280) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -// This function is never assigned -u8 func0418_init_alerted_guard[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func100d_start_lifts[] = { - activate_lift(1, 0x35) - activate_lift(4, 0x38) - activate_lift(5, 0x39) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1003_check_experiment_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_EXPERIMENT, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_SEV_007) // "Medical experiment has been sabotaged." - set_stage_flag(STAGEFLAG_EXPERIMENT_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - endloop(0x04) - - endlist -}; - -u8 func1004_check_saucer_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(0x3e, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_SEV_008) // "Captured Maian saucer has been destroyed." - set_stage_flag(STAGEFLAG_SAUCER_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - endloop(0x04) - - endlist -}; - -u8 func1005_check_experiment_destroyed_pointless[] = { - // This is a pointless function - beginloop(0x04) - if_object_in_good_condition(OBJ_EXPERIMENT, /*goto*/ 0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - endloop(0x04) - - endlist -}; - -u8 func1006_activate_alarm[] = { - // Wait until player is in crate room - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x003f, /*goto*/ 0x2c) - endloop(0x04) - - // Activate alarm - label(0x2c) - activate_alarm - set_stage_flag(STAGEFLAG_ALARM_SOUNDED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * A hidden chr spawns clones every 50 seconds after the alarm is sounded. - */ -u8 func0410_clone_spawner[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - // Wait until alarm activated - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_ALARM_SOUNDED, TRUE, /*goto*/ 0x04) - endloop(0x0d) - - beginloop(0x04) - if_never_been_onscreen(/*goto*/ 0x4d) - if_can_see_target(/*goto*/ 0x08) // <-- pointless - reloop(0x04) - - label(0x08) - reloop(0x04) - - label(0x4d) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4d) - reloop(0x04) - - // Wait 50 seconds - label(0x4d) - restart_timer - - beginloop(0x09) - if_timer_gt(3000, /*goto*/ 0x06) - endloop(0x09) - - // Spawn a clone - label(0x06) - try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE, 0, /*goto*/ 0x2c) - set_ailist(CHR_SELF, AILIST_CLONE) - - label(0x2c) - yield - endloop(0x04) - - endlist -}; - -u8 func0411_init_clone[] = { - set_accuracy(13) - set_reaction_speed(0) - set_chr_maxdamage(CHR_SELF, 80) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - label(0x04) - try_inherit_properties(0x4e, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_CLONE) - endlist -}; - -u8 func0412_clone[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_returnlist(CHR_SELF, GAILIST_ALERTED) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func0410_clone_spawner2[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - - // Wait until player is in room 0x005e - beginloop(0x0d) - if_chr_in_room(CHR_BOND, 0x00, 0x005e, /*goto*/ 0x2c) - endloop(0x0d) - - beginloop(0x04) - if_never_been_onscreen(/*goto*/ 0x4d) - if_can_see_target(/*goto*/ 0x08) // <-- pointless - reloop(0x04) - - label(0x08) - reloop(0x04) - - // Condition triggered. Also wait until clone is dead. - label(0x4d) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4d) - reloop(0x04) - - // Wait a further 50 seconds - label(0x4d) - restart_timer - - beginloop(0x09) - if_timer_gt(3000, /*goto*/ 0x06) - endloop(0x09) - - // Spawn clone - label(0x06) - try_spawn_clone2(CHR_SELF, AILIST_INIT_CLONE, 0, /*goto*/ 0x2c) - set_ailist(CHR_SELF, AILIST_CLONE) - - label(0x2c) - yield - endloop(0x04) - - endlist -}; - -u8 func1007_disable_pods[] = { - // Pods are the things that you xray scan in Rescue - set_object_flag(0x1a, OBJFLAG_DEACTIVATED) - set_object_flag(0x1b, OBJFLAG_DEACTIVATED) - set_object_flag(0x1c, OBJFLAG_DEACTIVATED) - set_object_flag(0x1d, OBJFLAG_DEACTIVATED) - set_object_flag(0x1e, OBJFLAG_DEACTIVATED) - set_object_flag(0x1f, OBJFLAG_DEACTIVATED) - set_object_flag(0x20, OBJFLAG_DEACTIVATED) - set_object_flag(0x21, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_check_console[] = { - // Wait for console activated or destroyed - beginloop(0x04) - if_chr_activated_object(CHR_ANY, OBJ_CONSOLE, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_CONSOLE, /*goto*/ 0x06) - goto_next(0x08) - label(0x06) - endloop(0x04) - - // Console activated - play sound and wait 3 seconds - label(0x2c) - play_sound(SFX_8116, -1) - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x2c) - endloop(0x09) - - label(0x2c) - assign_sound(SFX_8111, CHANNEL_0) - play_sound_from_object(CHANNEL_0, OBJ_CONSOLE, 1, 300, 400) - show_hudmsg(CHR_BOND, L_SEV_009) // "Distress signal has been sent." - set_stage_flag(STAGEFLAG_CONSOLE_ACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Console destroyed - label(0x08) - show_hudmsg(CHR_BOND, L_SEV_010) // "Critical mission object has been destroyed." - set_stage_flag(STAGEFLAG_CONSOLE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_check_for_exit[] = { - // Wait for all objectives complete - beginloop(0x04) - if_all_objectives_complete(/*goto*/ 0x2c) - endloop(0x04) - - // Wait 2 seconds - label(0x2c) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - set_chr_chrflag(CHR_BOND, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_COOP, CHRCFLAG_INVINCIBLE) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) - goto_next(0x06) - - // Both players dead - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // At least one player survived - label(0x06) - set_ailist(CHR_SELF, AILIST_OUTRO) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_vertical_door_sounds[] = { - // Wait for player to activate vertical doors - beginloop(0x5d) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x46, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x47, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x48, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x49, /*goto*/ 0x2c) - reloop(0x5d) - - label(0x2c) - play_sound(SFX_DOOR_81B0, -1) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - endloop(0x5d) - - endlist -}; - -u8 func100b_check_medlab_escapable[] = { - // While player is in the starting area - beginloop(0x04) - if_chr_in_room(CHR_BOND, 0x00, 0x0095, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0096, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0097, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0098, /*goto*/ 0x2c) - reloop(0x04) - - // If any glass is broken, jump to 0x0d where we'll return - label(0x2c) - if_object_in_good_condition(OBJ_GLASS1, /*goto*/ 0x2c) - goto_next(0x0d) - label(0x2c) - if_object_in_good_condition(OBJ_GLASS2, /*goto*/ 0x2c) - goto_next(0x0d) - label(0x2c) - if_object_in_good_condition(OBJ_GLASS3, /*goto*/ 0x2c) - goto_next(0x0d) - - // Check if trolley is destroyed - label(0x2c) - if_object_in_good_condition(OBJ_TROLLEY, /*goto*/ 0x06) - goto_next(0x2c) - - // Trolley is not destroyed - // Wait until we have pistol ammo (ie. Falcon 2), then wait until we don't. - label(0x06) - if_stage_flag_eq(STAGEFLAG_GOT_FALCON2, TRUE, /*goto*/ 0x66) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_PISTOL, 1, /*goto*/ 0x67) - set_stage_flag(STAGEFLAG_GOT_FALCON2) - reloop(0x04) - - label(0x67) - reloop(0x04) - - label(0x66) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_PISTOL, 1, /*goto*/ 0x2c) - reloop(0x04) - - // Trolley is destroyed. Wait 3 seconds for explosion to break any glass. - label(0x2c) - restart_timer - - beginloop(0x61) - if_timer_gt(180, /*goto*/ 0x2c) - if_object_in_good_condition(OBJ_GLASS1, /*goto*/ 0x2d) - goto_next(0x0d) - label(0x2d) - if_object_in_good_condition(OBJ_GLASS2, /*goto*/ 0x2d) - goto_next(0x0d) - label(0x2d) - if_object_in_good_condition(OBJ_GLASS3, /*goto*/ 0x2d) - goto_next(0x0d) - label(0x2d) - endloop(0x61) - - // Timer expired, and no glass was broken. Check if lab techs are dead. - label(0x2c) - if_chr_deadish(CHR_LABTECH1, /*goto*/ 0x63) - goto_next(0x06) - - label(0x63) - if_chr_deadish(CHR_LABTECH2, /*goto*/ 0x65) - - label(0x06) - if_chr_has_object(CHR_BOND, OBJ_PSYCHOSISGUN, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_PSYCHOSIS, 1, /*goto*/ 0x2c) - reloop(0x04) - - // Both lab techs dead - label(0x65) - - // Player has psychosis gun but ammo depleted - label(0x2c) - show_hudmsg(CHR_BOND, L_SEV_011) // "Mission failed - cannot escape from medlab." - set_stage_flag(STAGEFLAG_TRAPPED_AT_START) - goto_next(0x0e) - - // Glass broken - label(0x0d) - unset_stage_flag(STAGEFLAG_TRAPPED_AT_START) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x0e) - if_chr_in_room(CHR_BOND, 0x00, 0x0095, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0096, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0097, /*goto*/ 0x2c) - if_chr_in_room(CHR_BOND, 0x00, 0x0098, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x0e) - - label(0x06) - show_hudmsg(CHR_BOND, L_SEV_012) // "Alternative escape route found." - unset_stage_flag(STAGEFLAG_TRAPPED_AT_START) - goto_first(0x04) - - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_INTRO) - camera_movement(ANIM_CUT_SEV_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SEV_INTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - set_object_flag2(OBJ_TROLLEY, OBJFLAG2_04000000) - set_object_flag3(OBJ_TROLLEY, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SEV_INTRO_BED, OBJ_TROLLEY, 0x04, 0xffff) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x87) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - \ - label(0x06) - - wait_until(300, 0x76) - play_sound(SFX_0161, CHANNEL_7) - - wait_until(302, 0x77) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(330, 0x78) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(360, 0x79) - play_sound(SFX_0164, CHANNEL_6) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0x87) - label(0x2c) - if_controller_button_pressed(/*goto*/ 0x87) - label(0x2c) - endloop(0x08) - - label(0x87) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SEV_INTRO_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - unset_object_flag2(OBJ_TROLLEY, OBJFLAG2_04000000) - set_object_flag3(OBJ_TROLLEY, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SEV_INTRO_BED, OBJ_TROLLEY, 0x04, 0xfffe) - stop_cutscene_track - stop_ambient_track - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func041b_outro[] = { - set_invincible(CHR_BOND) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_OUTRO) - camera_movement(ANIM_CUT_SEV_OUTRO_CAM) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SEV_OUTRO_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - unset_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_OUTRO_GUARD, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_OUTRO_GUARD, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SEV_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_OUTRO_GUARD, 4) - - show_nonessential_chrs(FALSE) - restart_timer - - wait_until(46, 0x6c) - play_sound(SFX_M0_HEY_YOU, CHANNEL_7) - - wait_until(144, 0x6d) - play_sound(SFX_0085, CHANNEL_6) - - wait_until(205, 0x6e) - play_sound(SFX_04F2, CHANNEL_10) - - wait_until(210, 0x6f) - play_sound(SFX_0045, CHANNEL_10) - - wait_until(214, 0x70) - play_sound(SFX_ARGH_MAIAN_05E0, CHANNEL_10) - - wait_until(260, 0x71) - play_sound(SFX_007B, CHANNEL_10) - - wait_until(270, 0x72) - play_sound(SFX_M0_GRAB_A_BODY_BAG, CHANNEL_10) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0x87) - label(0x2c) - if_controller_button_pressed(/*goto*/ 0x87) - label(0x2c) - endloop(0x08) - - label(0x87) - label(0x06) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0419_init_outro_guard[] = { - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_unset_trolley_flag_when_destroyed[] = { - beginloop(0x04) - if_object_in_good_condition(OBJ_TROLLEY, /*goto*/ 0x2c) - unset_object_flag3(OBJ_TROLLEY, OBJFLAG3_PUSHABLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - endloop(0x04) - - endlist -}; - -u8 func041c_init_labtech[] = { - set_self_chrflag(CHRCFLAG_KEEPCORPSEKO) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func100e_break_glass[] = { - // If SA or PA, wait until experiment destroyed - // then break the surrounding glass. - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - beginloop(0x04) - if_objective_complete(0, /*goto*/ 0x0d) - endloop(0x04) - - label(0x0d) - disable_object(0x4f) - disable_object(0x50) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func100f_init_lighting[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x00d3, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d6, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d8, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d9, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00da, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00db, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0079, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0080, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0090, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0091, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0092, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0093, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0094, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0095, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0096, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0097, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0098, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0099, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x009a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x009b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00aa, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ab, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ac, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ad, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ae, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00af, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ba, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00be, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bf, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ca, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ce, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cf, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00d0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00d1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00d2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00dc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00dd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00de, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00df, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00f2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fa, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fe, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ff, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0100, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0101, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0102, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0103, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0104, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0105, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0106, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0107, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0108, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0109, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0083, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0084, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0085, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0086, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0087, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0088, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0089, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_unload_part1_chrs[] = { - // Wait until player is in room 0x0067 - probably crate room or so - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0067, /*goto*/ 0x2c) - endloop(0x04) - - // Unload all chrs in first part of the stage - label(0x2c) - set_ailist(CHR_LABTECH1, AILIST_UNLOAD) - set_ailist(CHR_LABTECH2, AILIST_UNLOAD) - set_ailist(0x00, AILIST_UNLOAD) - set_ailist(0x01, AILIST_UNLOAD) - set_ailist(0x02, AILIST_UNLOAD) - set_ailist(0x03, AILIST_UNLOAD) - set_ailist(0x04, AILIST_UNLOAD) - set_ailist(0x07, AILIST_UNLOAD) - set_ailist(0x08, AILIST_UNLOAD) - set_ailist(0x09, AILIST_UNLOAD) - set_ailist(0x0b, AILIST_UNLOAD) - set_ailist(0x0c, AILIST_UNLOAD) - set_ailist(0x0f, AILIST_UNLOAD) - set_ailist(0x10, AILIST_UNLOAD) - set_ailist(0x11, AILIST_UNLOAD) - set_ailist(0x12, AILIST_UNLOAD) - set_ailist(0x13, AILIST_UNLOAD) - set_ailist(0x14, AILIST_UNLOAD) - set_ailist(0x15, AILIST_UNLOAD) - set_ailist(0x16, AILIST_UNLOAD) - set_ailist(0x17, AILIST_UNLOAD) - set_ailist(0x18, AILIST_UNLOAD) - set_ailist(0x19, AILIST_UNLOAD) - set_ailist(0x1a, AILIST_UNLOAD) - set_ailist(0x46, AILIST_UNLOAD) - set_ailist(0x47, AILIST_UNLOAD) - set_ailist(0x1b, AILIST_UNLOAD) - set_ailist(0x1c, AILIST_UNLOAD) - set_ailist(0x1d, AILIST_UNLOAD) - set_ailist(0x1e, AILIST_UNLOAD) - set_ailist(0x1f, AILIST_UNLOAD) - set_ailist(0x20, AILIST_UNLOAD) - set_ailist(0x21, AILIST_UNLOAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0414_unload[] = { - label(0x2c) - yield - set_target_chr(CHR_BOND) - if_nearly_in_targets_sight(30, /*goto*/ 0x06) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) - set_target_chr(CHR_COOP) - if_nearly_in_targets_sight(30, /*goto*/ 0x06) - label(0x2c) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x08) - set_target_chr(CHR_ANTI) - if_nearly_in_targets_sight(30, /*goto*/ 0x06) - label(0x08) - yield - chr_drop_weapon(CHR_SELF) - remove_chr(CHR_SELF) - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x06) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -struct ailist ailists[] = { - { func1000_setup_counterop, 0x1000 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_check_experiment_destroyed, 0x1003 }, - { func1004_check_saucer_destroyed, 0x1004 }, - { func1005_check_experiment_destroyed_pointless, 0x1005 }, - { func1006_activate_alarm, 0x1006 }, - { func1007_disable_pods, 0x1007 }, - { func1008_check_console, 0x1008 }, - { func1009_check_for_exit, 0x1009 }, - { func100a_vertical_door_sounds, 0x100a }, - { func100b_check_medlab_escapable, 0x100b }, - { func100c_unset_trolley_flag_when_destroyed, 0x100c }, - { func100d_start_lifts, 0x100d }, - { func100e_break_glass, 0x100e }, - { func100f_init_lighting, 0x100f }, - { func1010_unload_part1_chrs, 0x1010 }, - { func0401_start_path00, 0x0401 }, - { func0402_start_path01, 0x0402 }, - { func0403_start_path02, 0x0403 }, - { func0404_start_path03, 0x0404 }, - { func0405_start_path04, 0x0405 }, - { func0406_start_path05, 0x0406 }, - { func0407_start_path06, 0x0407 }, - { func0408_start_path07, 0x0408 }, - { func0409_start_path08, 0x0409 }, - { func040a_start_path09, 0x040a }, - { func040b_start_path10, 0x040b }, - { func040c_start_path11, 0x040c }, - { func040d_start_path12, 0x040d }, - { func040e_start_path13, 0x040e }, - { func040f_start_path14, 0x040f }, - { func0410_clone_spawner, 0x0410 }, - { func0411_init_clone, 0x0411 }, - { func0412_clone, 0x0412 }, - { func0410_clone_spawner2, 0x0413 }, - { func0414_unload, 0x0414 }, - { func0415_init_50hp_guard, 0x0415 }, - { func0416_init_80hp_guard, 0x0416 }, - { func0417_init_lx_guard, 0x0417 }, - { func0418_init_alerted_guard, 0x0418 }, - { func0419_init_outro_guard, 0x0419 }, - { func1002_intro, 0x041a }, - { func041b_outro, 0x041b }, - { func041c_init_labtech, 0x041c }, - { func1002_intro, 0x0c00 }, - { func041b_outro, 0x0c01 }, - { NULL, 0 }, -}; diff --git a/src/setups/setupsevb.c b/src/setups/setupsevb.c index ec826f8f5..eb43db343 100644 --- a/src/setups/setupsevb.c +++ b/src/setups/setupsevb.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -32,8 +32,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -struct ailist ailists[] = { - { NULL, 0 }, -}; - diff --git a/src/setups/setupsevx.c b/src/setups/setupsevx.c index 566a3b6e4..4b95acce9 100644 --- a/src/setups/setupsevx.c +++ b/src/setups/setupsevx.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupsevxb.c b/src/setups/setupsevxb.c index 750cd3354..0a0a3994f 100644 --- a/src/setups/setupsevxb.c +++ b/src/setups/setupsevxb.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupsho.c b/src/setups/setupsho.c index 60cc92613..82ec8c764 100644 --- a/src/setups/setupsho.c +++ b/src/setups/setupsho.c @@ -113,7 +113,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -494,3475 +494,6 @@ s32 intro[] = { endintro }; -u8 func0401_init_unarmed_skedar[] = { - set_accuracy(0) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(160) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_ailist(CHR_SELF, AILIST_UNARMED_SKEDAR) - endlist -}; - -u8 func0402_unarmed_skedar[] = { - set_shotlist(AILIST_UNARMED_SKEDAR) - set_action(MA_NORMAL, TRUE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - // Dying - label(0x2d) - set_shotlist(GAILIST_IDLE) - yield - restart_timer - - beginloop(0x11) - if_timer_gt(30, /*goto*/ 0x2d) - endloop(0x11) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) -#define LABEL_HANDLE_PHOENIX_AREA 0x5a -#define LABEL_HANDLE_WALL_AREA 0x5b - - // Alive - label(0x06) - set_action(MA_NORMAL, TRUE) - stop_chr - if_self_flag_bankx_eq(CHRFLAG0_GP1, FALSE, BANK_0, /*goto*/ 0x03) - set_action(MA_TRACKING, TRUE) - try_run_to_target(/*goto*/ 0x03) - - beginloop(0x03) - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) - if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) - if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) - label(0x2e) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2d) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2d) - if_self_flag_bankx_eq(CHRFLAG0_GP1, FALSE, BANK_0, /*goto*/ 0x2e) - if_just_injured(CHR_SELF, /*goto*/ 0x2d) - - label(0x2e) - call_rng - if_rand_gt(1, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x05, 0xff, BANK_0, 0x00, 0x00) - label(0x06) - endloop(0x03) - - // Injured or detected enemy - label(0x2d) - label(0xd9) - yield - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) - if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) - if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2e) - label(0x2e) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - if_distance_to_target_lt(150, /*goto*/ 0x2f) - label(0x54) - if_num_times_shot_lt(1, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - label(0x2d) - restart_timer - set_action(MA_WAITING, TRUE) - say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - try_walk_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) - if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) - if_timer_gt(120, /*goto*/ 0x09) - endloop(0x08) - - label(0x09) - label(0x0a) - if_chr_not_talking(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x2d) - - label(0x06) - say_quip(CHR_BOND, QUIP_ATTACK2, 0x20, 0x00, 0xff, BANK_0, 0x00, 0x00) - label(0x2d) - restart_timer - set_action(MA_TRACKING, TRUE) - try_run_to_target(/*goto*/ 0x0b) - - beginloop(0x0b) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x10) - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) - if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_target_moving_away(/*goto*/ 0x2d) - if_distance_to_target_lt(150, /*goto*/ 0x2f) - label(0x2d) - if_distance_to_target_lt(50, /*goto*/ 0x2f) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - goto_first(0x0a) - - label(0x2f) - restart_timer - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - stop_chr - set_action(MA_FACING, TRUE) - try_face_entity(ATTACKFLAG_AIMATTARGET, 1, /*goto*/ 0x0c) - - beginloop(0x0c) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x10) - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) - if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - set_action(MA_PUNCHING, TRUE) - try_punch_or_kick(/*goto*/ 0x31) - goto_first(0xd9) - - // Punching or kicking - label(0x31) - - beginloop(0x30) - if_chr_has_hiddenflag(CHR_TARGET, CHRHFLAG_CLOAKED, /*goto*/ 0x10) - if_chr_in_room(CHR_SELF, 0x00, 0x003b, /*goto*/ LABEL_HANDLE_PHOENIX_AREA) - if_chr_in_room(CHR_SELF, 0x00, 0x0041, /*goto*/ LABEL_HANDLE_WALL_AREA) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x30) - - // Finished attack - label(0x06) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x10) - goto_first(0xd9) - - // Killed target - label(0x10) - stop_chr - unset_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - goto_first(0x03) - - // At ledge near Phoenix - label(LABEL_HANDLE_PHOENIX_AREA) - stop_chr - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - restart_timer - run_to_pad(PAD_SHO_0018) - - beginloop(0x5c) - if_chr_stopped(/*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0020, /*goto*/ 0x2d) // at T junction near Phoenix - endloop(0x5c) - - label(0x2d) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - goto_first(0x03) - - // At ledge prior to grenadable wall - label(LABEL_HANDLE_WALL_AREA) - stop_chr - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - restart_timer - run_to_pad(PAD_SHO_003C) - - beginloop(0x5c) - if_chr_stopped(/*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x0045, /*goto*/ 0x2d) // at weak wall - endloop(0x5c) - - label(0x2d) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - goto_first(0x03) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0405_puzzleroom_miniskedar_waiting[] = { - stop_chr - - beginloop(0x03) - if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) - - label(0x2e) - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x2d) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x2d) - if_just_injured(CHR_SELF, /*goto*/ 0x2d) - endloop(0x03) - - // Detected player - label(0x2d) - set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) - endlist -}; - -u8 func0403_init_miniskedar[] = { - set_self_chrflag(CHRCFLAG_FORCEAUTOAIM) - set_accuracy(0) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_ailist(CHR_SELF, AILIST_MINISKEDAR) - endlist -}; - -u8 func0404_miniskedar[] = { - set_shotlist(AILIST_MINISKEDAR) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - // Dying - label(0x2d) - yield - restart_timer - - beginloop(0x11) - if_timer_gt(30, /*goto*/ 0x2d) - endloop(0x11) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x06) - label(0x03) - yield - if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) - - label(0x2e) - if_can_see_target(/*goto*/ 0x2d) - if_just_injured(CHR_SELF, /*goto*/ 0x2d) - - // Healthy - call_rng - say_quip(CHR_BOND, QUIP_RETREAT2, 0xff, 0x05, 0xff, BANK_0, 0x00, 0x00) - label(0x06) - label(0x06) - goto_next(0x54) - - // Injured or detected enemy - label(0x2d) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - if_distance_to_target_lt(400, /*goto*/ 0x2f) - - label(0x54) - restart_timer - label(0x09) - restart_timer - if_chr_not_talking(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - label(0x06) - try_run_to_target(/*goto*/ 0x0b) - - beginloop(0x0b) - if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x2d) - label(0x2e) - if_can_see_target(/*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_distance_to_target_lt(400, /*goto*/ 0x2f) - label(0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - goto_first(0x09) - - label(0x2f) - restart_timer - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0c) - - beginloop(0x0c) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0c) - - label(0x2d) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - goto_first(0x0c) - - label(0x06) - if_distance_to_target_lt(200, /*goto*/ 0x2e) - miniskedar_try_pounce(0x04, 0x000e, /*goto*/ 0x30) - goto_first(0x03) - - beginloop(0x30) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x30) - - label(0x2d) - restart_timer - if_chr_injured_target(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - label(0x2e) - retreat(GOPOSFLAG_RUN, 1) - - beginloop(0x0d) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - goto_first(0x03) - - endlist -}; - -/** - * Spawn a clone and remove self. This function seems unnecessary. - */ -u8 func0407_init_cloaked_skedar[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) - - beginloop(0x04) - // Wait until clone dead - which it would be immediately? - chr_toggle_p1p2(CHR_SELF) - label(0x4f) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - // Spawn clone - label(0x4f) - try_spawn_clone2(CHR_SELF, AILIST_CLOAKED_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_HIDDEN, /*goto*/ 0x2d) - reloop(0x04) - - // Remove self - label(0x2d) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - yield - endloop(0x04) - - endlist -}; - -u8 func0408_cloaked_skedar[] = { - set_chr_team(CHR_SELF, TEAM_ENEMY) - rebuild_teams - rebuild_squadrons - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - restart_timer - - beginloop(0x08) - if_objective_complete(4, /*goto*/ 0x0e) - - // King is alive - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_PRESET, /*goto*/ 0x2d) - - // 1 in 256 chance of making skedar roar sound - call_rng - if_rand_gt(1, /*goto*/ 0x06) - say_quip(CHR_BOND, QUIP_GRENADE1, 0xff, 0x05, 0xff, BANK_0, 0x00, 0x00) - label(0x06) - endloop(0x08) - - // Player went close to cloaked skedar - label(0x2d) - unset_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, AILIST_INIT_UNARMED_SKEDAR) - - // King is dead - label(0x0e) - remove_chr(CHR_SELF) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Spawns up to 3 miniskedar clones, one at a time. - */ -u8 func0404_miniskedar_spawner[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_00040000) - set_morale(0) - - // Wait until player near trigger pad - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_PRESET, /*goto*/ 0x4f) - endloop(0x04) - - label(0x4f) - if_morale_lt(3, /*goto*/ 0x06) - goto_next(0x2e) - - label(0x06) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - label(0x4f) - try_spawn_clone2(CHR_SELF, AILIST_INIT_MINISKEDAR, SPAWNFLAG_00000010, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - add_morale(1) - label(0x2e) - yield - endloop(0x04) - - endlist -}; - -u8 unregistered_function3[] = { - camera_movement(ANIM_CUT_SHO_BETA_CAM) - yield - set_chr_hiddenflag(0x00, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_BETA_NOCHR, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x00, 4) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - endloop(0x08) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - give_object_to_chr(OBJ_TARGETAMP_BOND, CHR_BOND) - give_object_to_chr(OBJ_TARGETAMP_COOP, CHR_COOP) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - - label(0x2d) - disable_object(OBJ_TARGETAMP_COOP) - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1003_remove_random_skedar[] = { - #define remove_random(chr1, chr2) \ - call_rng \ - if_rand_gt(128, /*goto*/ 0x2d) \ - remove_chr(chr1) \ - goto_next(0x06) \ - label(0x2d) \ - remove_chr(chr2) \ - label(0x06) - - remove_random(0x05, 0x06) - remove_random(0x07, 0x08) - remove_random(0x0b, 0x0c) - remove_random(0x0f, 0x10) - remove_random(0x11, 0x12) - remove_random(0x13, 0x14) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101a_pointless[] = { - beginloop(0x04) - if_chr_death_animation_finished(CHR_KING1, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_check_army_defeated[] = { -#if VERSION >= VERSION_NTSC_1_0 - yield -#endif - - beginloop(0x04) - if_chr_death_animation_finished(0x2c, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(0x2d, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(0x2e, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(0x2f, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(0x30, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(0x31, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(0x32, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - show_hudmsg(CHR_BOND, L_SHO_029) // "Skedar secret army has been defeated." - set_stage_flag(STAGEFLAG_ARMY_DEFEATED) - - beginloop(0x91) - if_objective_complete(0, /*goto*/ 0x2d) - endloop(0x91) - - label(0x2d) - unset_object_flag2(0x45, OBJFLAG2_LOCKEDFRONT) - unset_object_flag2(0x46, OBJFLAG2_LOCKEDBACK) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_5e0c[] = { - yield - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) -#if VERSION >= VERSION_PAL_BETA - if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x41) -#else - if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x2d) -#endif - if_chr_distance_to_pad_lt(CHR_P1P2, 50, PAD_SHO_00D4, /*goto*/ 0x2d) - if_chr_in_room(CHR_P1P2, 0x00, 0x005f, /*goto*/ 0x2e) - unset_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) - endloop(0x04) - - // Crossed bridge without using puzzle piece, - // or one player crossed then another moved the piece off the pad - label(0x2e) - set_stage_flag(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE) - set_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) - -#if VERSION >= VERSION_PAL_BETA - label(0x41) - if_num_human_players_lt(2, /*goto*/ 0x2d) - unset_object_flag3(OBJ_PUZZLEROCK, OBJFLAG3_PUSHABLE) -#endif - - // Pad pressed, or follow through from above - label(0x2d) - if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE, TRUE, /*goto*/ 0x2d) - mute_channel(CHANNEL_5) - assign_sound(SFX_0436, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_PUZZLEROCK, TRUE) - - // Wait for a condition that would cause the bridge to retract - label(0x2d) - restart_timer - - beginloop(0x91) - if_stage_flag_eq(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE, TRUE, /*goto*/ 0x2d) - if_timer_gt(60, /*goto*/ 0x2e) - label(0x2d) - if_timer_lt(20, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE, TRUE, /*goto*/ 0x93) - if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x06) - if_chr_distance_to_pad_lt(CHR_P1P2, 50, PAD_SHO_00D4, /*goto*/ 0x06) - goto_next(0x2e) - - label(0x06) - reloop(0x91) - - label(0x93) - if_chr_in_room(CHR_P1P2, 0x00, 0x0057, /*goto*/ 0x06) // start side - endloop(0x91) - - // Player crossed bridge without using switch, then crossed back - label(0x06) - unset_stage_flag(STAGEFLAG_CROSSED_RAVINE_WITHOUT_BRIDGE) - unset_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) - goto_first(0x04) - - // Switch activated and bridge extended for 1 second - label(0x2e) - if_object_distance_to_pad_lt(OBJ_PUZZLEROCK, 50, PAD_SHO_00D4, /*goto*/ 0x2d) - if_chr_distance_to_pad_lt(CHR_P1P2, 50, PAD_SHO_00D4, /*goto*/ 0x2d) - - // Switch no longer pressed - mute_channel(CHANNEL_5) - assign_sound(SFX_0437, CHANNEL_5) - control_sound_from_object(CHANNEL_5, OBJ_PUZZLEROCK, TRUE) - goto_first(0x04) - - // Switch still pressed - label(0x2d) - set_stage_flag(STAGEFLAG_TRIGGER_BRIDGE) - goto_first(0x04) - - endlist -}; - -u8 func1006_bridge[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE, TRUE, /*goto*/ 0x2d) - set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - endloop(0x04) - - label(0x2d) - unset_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - mute_channel(CHANNEL_4) - assign_sound(SFX_DOOR_8020, CHANNEL_4) - play_sound_from_object(CHANNEL_4, OBJ_BRIDGE, 1, 1200, 1600) - yield - - beginloop(0x08) - if_lift_stationary(OBJ_BRIDGE, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - mute_channel(CHANNEL_4) - assign_sound(SFX_DOOR_8027, CHANNEL_4) - control_sound_from_object(CHANNEL_4, OBJ_BRIDGE, TRUE) - set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - set_stage_flag(STAGEFLAG_BRIDGE_EXTENDED) - - beginloop(0x09) - if_stage_flag_eq(STAGEFLAG_TRIGGER_BRIDGE, FALSE, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - - beginloop(0x91) - if_sound_finished(CHANNEL_4, /*goto*/ 0x2d) - endloop(0x91) - - label(0x2d) - unset_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - mute_channel(CHANNEL_4) - assign_sound(SFX_DOOR_8020, CHANNEL_4) - play_sound_from_object(CHANNEL_4, OBJ_BRIDGE, 1, 1200, 1600) - yield - - beginloop(0x0b) - if_lift_stationary(OBJ_BRIDGE, /*goto*/ 0x06) - endloop(0x0b) - - label(0x06) - unset_stage_flag(STAGEFLAG_BRIDGE_EXTENDED) - set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - mute_channel(CHANNEL_4) - assign_sound(SFX_DOOR_8027, CHANNEL_4) - control_sound_from_object(CHANNEL_4, OBJ_BRIDGE, TRUE) - goto_first(0x04) - - endlist -}; - -u8 func1007_bug_throws_bond[] = { - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_BOND_THREW_FIRST_BUG, FALSE, /*goto*/ 0x55) - if_stage_flag_eq(STAGEFLAG_BOND_THREW_SECOND_BUG, FALSE, /*goto*/ 0x56) - if_stage_flag_eq(STAGEFLAG_BOND_THREW_THIRD_BUG, FALSE, /*goto*/ 0x57) - - label(0x55) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 3, /*goto*/ 0x2d) - endloop(0x03) - - // Threw first - label(0x2d) - set_stage_flag(STAGEFLAG_BOND_THREW_FIRST_BUG) - goto_next(0x0e) - - // Check for second - label(0x56) - label(0x2d) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 2, /*goto*/ 0x2d) - goto_first(0x03) - - label(0x2d) - set_stage_flag(STAGEFLAG_BOND_THREW_SECOND_BUG) - goto_next(0x0e) - - // Check for third - label(0x57) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) - goto_first(0x03) - - label(0x2d) - set_stage_flag(STAGEFLAG_BOND_THREW_THIRD_BUG) - goto_next(0x0e) - - beginloop(0x0e) - if_weapon_thrown(WEAPON_TARGETAMPLIFIER, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x2d) - if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, OBJ_PILLAR1, /*goto*/ 0x09) - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x2d) - if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, OBJ_PILLAR2, /*goto*/ 0x0b) - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x2d) - if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, OBJ_PILLAR3, /*goto*/ 0x0c) - label(0x2d) - if_timer_gt(120, /*goto*/ 0x0d) - endloop(0x08) - - label(0x09) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_PILLAR1_MARKED) - show_hudmsg(CHR_BOND, L_SHO_025) // "Target Amplifier placed correctly." - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) - goto_first(0x03) - - label(0x0b) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_PILLAR2_MARKED) - show_hudmsg(CHR_BOND, L_SHO_025) // "Target Amplifier placed correctly." - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) - goto_first(0x03) - - label(0x0c) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_PILLAR3_MARKED) - show_hudmsg(CHR_BOND, L_SHO_025) // "Target Amplifier placed correctly." - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) - goto_first(0x03) - - label(0x0d) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2e) - if_stage_flag_eq(STAGEFLAG_COOP_BUGS_WASTED, TRUE, /*goto*/ 0x2d) - goto_next(0x0f) - - label(0x2d) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x2e) - goto_next(0x0f) - - label(0x2e) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, FALSE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, FALSE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, FALSE, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x06) - set_stage_flag(STAGEFLAG_BOND_BUGS_WASTED) - if_stage_flag_eq(STAGEFLAG_COOP_BUGS_WASTED, FALSE, /*goto*/ 0x0f) - set_stage_flag(STAGEFLAG_BUG_WASTED) - show_hudmsg(CHR_BOND, L_SHO_026) // "Target Amplifier placed incorrectly." - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x0f) - goto_first(0x03) - - endlist -}; - -u8 func101b_bug_throws_coop[] = { - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x03) - - label(0x2d) - set_stage_flag(STAGEFLAG_COOP_BUGS_WASTED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - beginloop(0x03) - if_stage_flag_eq(STAGEFLAG_COOP_THREW_FIRST_BUG, FALSE, /*goto*/ 0x55) - if_stage_flag_eq(STAGEFLAG_COOP_THREW_SECOND_BUG, FALSE, /*goto*/ 0x56) - if_stage_flag_eq(STAGEFLAG_COOP_THREW_THIRD_BUG, FALSE, /*goto*/ 0x57) - - label(0x55) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 3, /*goto*/ 0x2d) - endloop(0x03) - - label(0x2d) - set_stage_flag(STAGEFLAG_COOP_THREW_FIRST_BUG) - goto_next(0x0e) - - label(0x56) - label(0x2d) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 2, /*goto*/ 0x2d) - goto_first(0x03) - - label(0x2d) - set_stage_flag(STAGEFLAG_COOP_THREW_SECOND_BUG) - goto_next(0x0e) - - label(0x57) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) - goto_first(0x03) - - label(0x2d) - set_stage_flag(STAGEFLAG_COOP_THREW_THIRD_BUG) - goto_next(0x0e) - - beginloop(0x0e) - if_weapon_thrown(WEAPON_TARGETAMPLIFIER, /*goto*/ 0x06) - endloop(0x0e) - - label(0x06) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x2d) - if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, 0x01, /*goto*/ 0x09) - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x2d) - if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, 0x02, /*goto*/ 0x0b) - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x2d) - if_weapon_thrown_on_object(WEAPON_TARGETAMPLIFIER, 0x03, /*goto*/ 0x0c) - label(0x2d) - if_timer_gt(120, /*goto*/ 0x0d) - endloop(0x08) - - label(0x09) - unset_object_flag3(OBJ_PILLAR1, OBJFLAG3_RTRACKED_YELLOW) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_PILLAR1_MARKED) - show_hudmsg(CHR_COOP, L_SHO_025) // "Target Amplifier placed correctly." - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) - goto_first(0x03) - - label(0x0b) - unset_object_flag3(OBJ_PILLAR2, OBJFLAG3_RTRACKED_YELLOW) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_PILLAR2_MARKED) - show_hudmsg(CHR_COOP, L_SHO_025) // "Target Amplifier placed correctly." - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) - goto_first(0x03) - - label(0x0c) - unset_object_flag3(OBJ_PILLAR3, OBJFLAG3_RTRACKED_YELLOW) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x0d) - set_stage_flag(STAGEFLAG_PILLAR3_MARKED) - show_hudmsg(CHR_COOP, L_SHO_025) // "Target Amplifier placed correctly." - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x0d) - goto_first(0x03) - - label(0x0d) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) - goto_next(0x0f) - - label(0x2d) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_BUG, 1, /*goto*/ 0x2d) - goto_next(0x0f) - - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, FALSE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, FALSE, /*goto*/ 0x06) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, FALSE, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x06) - set_stage_flag(STAGEFLAG_COOP_BUGS_WASTED) - if_self_flag_bankx_eq(CHRFLAG0_UNDERCOVER, FALSE, BANK_0, /*goto*/ 0x0f) - set_stage_flag(STAGEFLAG_BUG_WASTED) - show_hudmsg(CHR_COOP, L_SHO_026) // "Target Amplifier placed incorrectly." - - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x0f) - goto_first(0x03) - - endlist -}; - -u8 func1008_lock_door[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - goto_next(0x04) - - // A - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA and PA - label(0x04) - yield - lock_door(0x09, 0x02) - lock_door(0x0a, 0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_altar[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0f) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_object_flag2(OBJ_ALTAR, OBJFLAG2_REMOVEWHENDESTROYED, /*goto*/ 0x2d) - if_chr_distance_to_pad_lt(CHR_P1P2, 300, PAD_SHO_0137, /*goto*/ 0x2e) - label(0x2d) - if_chr_activated_object(CHR_P1P2, OBJ_ALTAR, /*goto*/ 0x06) - endloop(0x08) - - // Activated - label(0x06) - - // Altar has flag - label(0x2d) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_DEVASTATOR, /*goto*/ 0x92) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_CALLISTO, /*goto*/ 0x93) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_FALCON2_SCOPE, /*goto*/ 0x94) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_SLAYER, /*goto*/ 0x95) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_MAULER, /*goto*/ 0x96) - - // At pad, or invalid weapon equipped - label(0x2e) - set_object_flag2(OBJ_ALTAR, OBJFLAG2_REMOVEWHENDESTROYED) - show_hudmsg(CHR_P1P2, L_SHO_051) // "Make your sacrifice to the God of War." - restart_timer - - beginloop(0x91) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x91) - - label(0x06) - goto_first(0x08) - - label(0x92) - unset_object_flag2(OBJ_ALTAR_DEVASTATOR, OBJFLAG2_INVISIBLE) - goto_next(0x2d) - - label(0x93) - unset_object_flag2(OBJ_ALTAR_CALLISTO, OBJFLAG2_INVISIBLE) - goto_next(0x2d) - - label(0x94) - unset_object_flag2(OBJ_ALTAR_FALCON, OBJFLAG2_INVISIBLE) - goto_next(0x2d) - - label(0x95) - unset_object_flag2(OBJ_ALTAR_SLAYER, OBJFLAG2_INVISIBLE) - goto_next(0x2d) - - label(0x96) - unset_object_flag2(OBJ_ALTAR_MAULER, OBJFLAG2_INVISIBLE) - goto_next(0x2d) - - label(0x2d) - play_sound(SFX_80AA, -1) - chr_drop_weapon(VERSION >= VERSION_NTSC_1_0 ? CHR_P1P2 : CHR_BOND) - label(0x04) - yield - label(0x2d) - label(0x0f) - unlock_door(0x09, 0x02) - unlock_door(0x0a, 0x02) - set_lights_state(0x0060, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0061, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0062, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0063, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0064, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0065, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0066, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0067, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0068, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0069, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x006a, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x006b, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x006c, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x006d, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x006e, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x006f, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0070, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0071, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0072, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0073, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0074, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0075, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0076, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0077, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0078, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x0079, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x007a, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x007b, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x007c, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x007d, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x007e, LIGHTOP_3, 0x06, 0x80, 0x78) - set_lights_state(0x007f, LIGHTOP_3, 0x06, 0x80, 0x78) - restart_timer - - beginloop(0x0e) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x0e) - - label(0x2d) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - show_hudmsg(CHR_P1P2, L_SHO_027) // "Generator has been reactivated." - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This function would have cycled the lights every 20 seconds, but the cycling - * part has been disabled. - */ -u8 func101c_setup_corridor_lighting[] = { - label(0x59) - restart_timer - label(0x04) - yield - label(0x2d) - set_lights_state(0x0060, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0061, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0062, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0063, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0064, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0065, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0066, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0067, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0068, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0069, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x006a, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x006b, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x006c, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x006d, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x006e, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x006f, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0070, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0071, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0072, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0073, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0074, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0076, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0078, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0079, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x007a, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x007b, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x007c, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x007d, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x007e, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x007f, LIGHTOP_1, 0x06, 0x00, 0x00) - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - - // The rest of this function is unreachable - restart_timer - - beginloop(0x08) - if_timer_gt(1200, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - set_lights_state(0x0060, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0061, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0062, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0063, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0064, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0065, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0066, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0067, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0068, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0069, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x006a, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x006b, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x006c, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x006d, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x006e, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x006f, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0070, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0071, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0072, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0073, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0074, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0075, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0076, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0077, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0078, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0079, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x007a, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x007b, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x007c, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x007d, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x007e, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x007f, LIGHTOP_3, 0x06, 0xff, 0x78) - goto_first(0x59) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040a_init_reaper_slayer_skedar[] = { - set_accuracy(20) - set_reaction_speed(75) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(160) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, AILIST_REAPER_SLAYER_SKEDAR) - endlist -}; - -u8 func0409_reaper_slayer_skedar[] = { -#if VERSION >= VERSION_NTSC_1_0 - unset_self_chrflag(CHRCFLAG_HIDDEN) -#endif - set_shotlist(AILIST_REAPER_SLAYER_SKEDAR) - if_chr_deadish(CHR_SELF, /*goto*/ 0x06) - goto_next(0x2d) - - // Dying - label(0x06) - set_shotlist(GAILIST_IDLE) - restart_timer - - beginloop(0x5d) - if_timer_gt(15, /*goto*/ 0x06) - endloop(0x5d) - - label(0x06) - say_quip(CHR_BOND, QUIP_DIE, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alive - label(0x2d) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x08) - - // Injured - label(0x06) - set_view_distance(100) - - // Healthy - label(0x08) - set_self_chrflag(CHRCFLAG_00000040) - label(0x5e) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x06) - set_target_chr(CHR_BOND) - try_attack_kneel(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x5f) - label(0x06) - kneel - - beginloop(0x5f) - chr_toggle_p1p2(CHR_SELF) - label(0x2d) - set_target_chr(CHR_P1P2) - if_self_flag_bankx_eq(CHRFLAG0_AIVSAI, FALSE, BANK_0, /*goto*/ 0x2e) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x60) - label(0x2e) - if_target_outside_my_yvisang(/*goto*/ 0x06) - if_target_in_sight(/*goto*/ 0x60) - label(0x06) - if_just_injured(CHR_SELF, /*goto*/ 0x58) - label(0x2d) - if_saw_injury(0x00, /*goto*/ 0x60) - if_near_miss(/*goto*/ 0x61) - label(0x2d) - set_target_chr(CHR_P1P2) - endloop(0x5f) - - label(0x06) - if_target_outside_my_yvisang(/*goto*/ 0x2d) - if_target_in_sight(/*goto*/ 0x60) - label(0x2d) - set_target_chr(CHR_BOND) - goto_first(0x5f) - - label(0x60) - if_can_see_target(/*goto*/ 0x2d) - goto_first(0x5e) - - label(0x58) - label(0x2d) - set_view_distance(100) - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x2d) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - say_quip(CHR_BOND, QUIP_SEEPLAYER, 0xff, 0x02, 0xff, BANK_0, 0x00, 0x00) - label(0x2d) - goto_next(0x71) - - // Unreachable - try_attack_amount(90, 100) - - beginloop(0x64) - if_chr_stopped(/*goto*/ 0x63) - endloop(0x64) - - label(0x63) - restart_timer - stop_chr - - beginloop(0x65) - if_chr_weapon_equipped(CHR_SELF, WEAPON_SLAYER, /*goto*/ 0x2e) - if_timer_gt(120, /*goto*/ 0x2d) - - label(0x2e) - if_timer_gt(200, /*goto*/ 0x2d) - endloop(0x65) - - label(0x2d) - label(0x06) - goto_first(0x5e) - - label(0x61) - set_view_distance(100) - restart_timer - if_self_flag_bankx_eq(CHRFLAG0_GP1, TRUE, BANK_0, /*goto*/ 0x6a) - set_self_flag_bankx(CHRFLAG0_GP1, BANK_0) - - label(0x6a) - call_rng - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_outside_my_yvisang(/*goto*/ 0x06) - if_target_in_sight(/*goto*/ 0x6b) - label(0x06) - if_timer_gt(60, /*goto*/ 0x6c) - if_rand_lt(4, /*goto*/ 0x6c) - goto_first(0x6a) - - label(0x6c) - if_can_see_target(/*goto*/ 0x6b) - goto_first(0x5e) - - label(0x6b) - goto_first(0x60) - - label(0x6d) - restart_timer - - beginloop(0x6e) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x6b) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x6e) - - label(0x06) - goto_first(0x5e) - - label(0x6b) - goto_first(0x60) - - label(0x71) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, FALSE, BANK_0, /*goto*/ 0x72) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x70) - label(0x70) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x72) - try_attack_amount(40, 60) - label(0x06) - goto_first(0x64) - - label(0x2d) - goto_first(0x63) - - endlist -}; - -u8 func100a_army_room[] = { -#if VERSION >= VERSION_NTSC_1_0 - yield -#endif - set_lights_state(0x0082, LIGHTOP_1, 0x06, 0x00, 0x00) - set_lights_state(0x0087, LIGHTOP_1, 0x06, 0x00, 0x00) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0082, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - close_door(0x0d) - close_door(0x0e) - close_door(0x0f) - close_door(0x10) - if_objective_complete(0, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - lock_door(0x0d, 0x02) - lock_door(0x0e, 0x02) - lock_door(0x0f, 0x02) - lock_door(0x10, 0x02) - label(0x06) - restart_timer - - beginloop(0x08) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - set_lights_state(0x0082, LIGHTOP_3, 0x06, 0xff, 0x78) - set_lights_state(0x0087, LIGHTOP_3, 0x06, 0xff, 0x78) - set_stage_flag(STAGEFLAG_TRIGGER_SKEDAR_ARMY) - play_x_track(XREASON_DEFAULT, 10, 60) - set_ailist(CHR_SELF, GAILIST_IDLE) - goto_first(0x04) - - endlist -}; - -u8 func100b_check_sanctum_accessed[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x007a, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - show_hudmsg(CHR_P1P2, L_SHO_028) // "Skedar Inner Sanctum has been reached." - set_stage_flag(STAGEFLAG_ACCESSED_SANCTUM) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040b_mauler_skedar[] = { - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_accuracy(20) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(50) - set_recovery_speed(0) - set_shield(0) - - beginloop(0x04) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - set_alertness(100) - set_target_chr(CHR_BOND) - try_jog_to_target(/*goto*/ 0x2d) - label(0x2d) - set_shotlist(GAILIST_COMBAT_WITH_TARGET) - set_returnlist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_wake_skedar_army[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_SKEDAR_ARMY, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - - #define enable_army_skedar(chr, loopid) \ - restart_timer \ - set_chr_flag_bankx(chr, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) \ - beginloop(loopid) \ - if_timer_gt(500, /*goto*/ 0x2d) \ - endloop(loopid) \ - label(0x2d) - - enable_army_skedar(0x2e, 0x08) - enable_army_skedar(0x31, 0x09) - enable_army_skedar(0x2c, 0x0b) - enable_army_skedar(0x2f, 0x0c) - enable_army_skedar(0x2d, 0x0d) - enable_army_skedar(0x32, 0x0e) - enable_army_skedar(0x30, 0x0f) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_king_waiting[] = { - set_shield(500) - set_accuracy(100) - set_chr_chrflag(CHR_SELF, CHRCFLAG_RUNFASTER) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) - if_difficulty_gt(DIFF_A, /*goto*/ 0x2d) - set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) - label(0x2d) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_INFINITESHIELD) - set_morale(0) - - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) -#if VERSION >= VERSION_NTSC_1_0 - stop_x_track(-1) -#endif - play_track_isolated(MUSIC_SKEDARRUINS_KING) - restart_timer - - beginloop(0x09) - if_timer_gt(300, /*goto*/ 0x2d) - endloop(0x09) - - label(0x2d) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, AILIST_KING_COMBAT) - endlist -}; - -/** - * morale tracks how many rockets have been fired in a row. - */ -u8 func040d_king_combat[] = { -#define LABEL_MAINLOOP 0x03 -#define LABEL_PLAYER_DEAD 0x11 -#define LABEL_FIRE_ROCKET 0x73 -#define LABEL_SPAWN_SKEDAR 0x74 -#define LABEL_SPAWN_MINISKEDAR 0x75 -#define LABEL_CLOAK 0x76 -#define LABEL_LOW_SHIELD 0x7c - - beginloop(0x59) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_attack_target(/*goto*/ 0x03) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - endloop(0x59) - - // Main loop - label(LABEL_MAINLOOP) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x04) - - beginloop(0x04) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_stage_flag_eq(STAGEFLAG_KING_SKEDAR_CLONE_EXISTS, TRUE, /*goto*/ 0x2d) - if_stage_flag_eq(STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS, TRUE, /*goto*/ 0x2d) - - // No clones exist - call_rng - if_rand_gt(200, /*goto*/ 0x79) - if_morale_lt(2, /*goto*/ 0x06) - goto_next(0x2d) - - label(0x06) - goto_next(LABEL_FIRE_ROCKET) - - label(0x79) - if_rand_gt(237, /*goto*/ 0x07) - if_rand_gt(218, /*goto*/ 0x06) - goto_next(LABEL_SPAWN_MINISKEDAR) - - label(0x06) - goto_next(LABEL_SPAWN_SKEDAR) - - label(0x07) - goto_next(LABEL_CLOAK) - - label(0x2d) - endloop(0x04) - - // - // Run to side and fire a rocket - // - label(LABEL_FIRE_ROCKET) - restart_timer - if_chr_distance_to_pad_lt(CHR_SELF, 300, PAD_SHO_0098, /*goto*/ 0x06) - jog_to_pad(PAD_SHO_0098) // left side (when facing king) - goto_next(0x7f) - - label(0x06) - restart_timer - jog_to_pad(PAD_SHO_0097) // right side - - beginloop(0x7f) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x7f) - - label(0x2d) - set_self_chrflag(CHRCFLAG_00000040) - - beginloop(0x7a) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_can_see_attack_target(/*goto*/ 0x06) - endloop(0x7a) - - label(0x06) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x70) - label(0x70) - say_quip(CHR_BOND, QUIP_ATTACK1, 0x19, 0x02, 0x01, BANK_0, 0x00, 0x00) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x7b) - goto_next(0x2d) - - label(0x06) - goto_first(LABEL_MAINLOOP) - - // Shoot successful - beginloop(0x7b) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x7b) - - label(0x2d) - add_morale(1) - goto_first(LABEL_MAINLOOP) - - // - // Spawn skedar - // - label(LABEL_SPAWN_SKEDAR) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_morale(0) - restart_timer - chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x66) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x66) - - label(0x2d) - set_chr_flag_bankx(CHR_KING_SKEDAR_SPAWNER, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - goto_first(LABEL_MAINLOOP) - - // - // Spawn miniskedar - // - label(LABEL_SPAWN_MINISKEDAR) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_morale(0) - restart_timer - chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x67) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x67) - - label(0x2d) - set_chr_flag_bankx(CHR_KING_MINISKEDAR_SPAWNER, CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - goto_first(LABEL_MAINLOOP) - - // - // Cloak and warp to player for hand combat - // - label(LABEL_CLOAK) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_morale(0) - restart_timer - chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - - beginloop(0x68) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ LABEL_PLAYER_DEAD) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x68) - - label(0x2d) - try_set_padpreset_to_target_quadrant(QUADRANT_BACK, /*goto*/ 0x2d) - try_set_padpreset_to_target_quadrant(QUADRANT_SIDE1, /*goto*/ 0x2d) - try_set_padpreset_to_target_quadrant(QUADRANT_SIDE2, /*goto*/ 0x2d) - goto_next(0x88) - - label(0x2d) - chr_move_to_pad(CHR_SELF, PAD_PRESET, 0x00, /*goto*/ 0x2d) - goto_next(0x88) - - label(0x2d) - set_countdown_timer(7) - start_countdown_timer - - label(0x8a) - restart_timer - try_run_to_target(/*goto*/ 0x08) - - beginloop(0x08) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ 0x0b) - if_timer_gt(20, /*goto*/ 0x89) - if_distance_to_target_lt(150, /*goto*/ 0x06) - endloop(0x08) - - // Unreachable - label(0x2d) - goto_next(0x88) - - // Every 20 frames - check countdown timer - label(0x89) - if_countdown_timer_lt(1, /*goto*/ 0x2d) - goto_first(0x8a) - - // Been chasing player while cloaked for 7 seconds - label(0x2d) - goto_next(0x88) - - // Distance to player < 150 - label(0x06) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - restart_timer - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - stop_chr - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x09) - - beginloop(0x09) - if_chr_death_animation_finished(CHR_P1P2, /*goto*/ 0x0b) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_target_out_of_fov_left(246, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x2d) - goto_next(0x87) - - label(0x06) - try_punch_or_kick(/*goto*/ 0x0b) - goto_next(0x87) - - beginloop(0x0b) - if_chr_stopped(/*goto*/ 0x2d) - endloop(0x0b) - - label(0x2d) - restart_timer - set_chr_cloaked(CHR_SELF, TRUE, TRUE) - - beginloop(0x0d) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x0d) - - label(0x2d) - label(0x88) - stop_chr - chr_move_to_pad(CHR_SELF, PAD_SHO_0097, 0x00, /*goto*/ 0x87) - chr_move_to_pad(CHR_SELF, PAD_SHO_0096, 0x00, /*goto*/ 0x87) - chr_move_to_pad(CHR_SELF, PAD_SHO_0098, 0x00, /*goto*/ 0x87) - - label(0x87) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - restart_timer - - beginloop(0x85) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x85) - - label(0x2d) - goto_first(LABEL_MAINLOOP) - - // Unreachable - nothing jumps here - label(0x77) - say_quip(CHR_BOND, QUIP_ATTACK2, 0xff, 0x03, 0xff, BANK_0, 0x00, 0x00) - set_morale(0) - restart_timer - chr_do_animation(ANIM_0350, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x69) - if_chr_shield_lt(CHR_SELF, 20, /*goto*/ LABEL_LOW_SHIELD) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x69) - - label(0x2d) - goto_first(LABEL_MAINLOOP) - - // Shield < 20 - label(LABEL_LOW_SHIELD) - say_quip(CHR_BOND, QUIP_GOTOCOVER1, 0xff, 0x00, 0xff, BANK_0, 0x00, 0x00) - jog_to_pad(PAD_SHO_0096) - - beginloop(0x7d) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x7d) - - label(0x06) - restart_timer - set_stage_flag(STAGEFLAG_SPIKES_VULNERABLE) - chr_do_animation(ANIM_0351, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x7e) - if_stage_flag_eq(STAGEFLAG_SPIKE_DESTROYED, TRUE, /*goto*/ 0x06) - if_timer_gt(500, /*goto*/ 0x06) - endloop(0x7e) - - label(0x06) - stop_chr - unset_stage_flag(STAGEFLAG_SPIKE_DESTROYED) - if_stage_flag_eq(STAGEFLAG_SPIKE4_DESTROYED, TRUE, /*goto*/ 0x83) - if_stage_flag_eq(STAGEFLAG_SPIKE3_DESTROYED, TRUE, /*goto*/ 0x82) - if_stage_flag_eq(STAGEFLAG_SPIKE2_DESTROYED, TRUE, /*goto*/ 0x81) - if_stage_flag_eq(STAGEFLAG_SPIKE1_DESTROYED, TRUE, /*goto*/ 0x80) - - set_shield(500) - goto_next(0x06) - - label(0x80) - set_shield(400) - goto_next(0x06) - - label(0x81) - set_shield(300) - goto_next(0x06) - - label(0x82) - set_shield(200) - goto_next(0x06) - - label(0x83) - set_shield(100) - - label(0x06) - unset_stage_flag(STAGEFLAG_SPIKES_VULNERABLE) - goto_first(LABEL_MAINLOOP) - - // Player dead - label(LABEL_PLAYER_DEAD) - goto_first(0x59) - - endlist -}; - -u8 func040e_king_skedar_spawner[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_INVINCIBLE) -#endif - set_self_chrflag(CHRCFLAG_00040000) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) - - beginloop(0x04) - if_chr_deadish(CHR_CLONE, /*goto*/ 0x2d) - goto_next(0x06) - - // Clone dead - label(0x2d) - unset_stage_flag(STAGEFLAG_KING_SKEDAR_CLONE_EXISTS) - - label(0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x4f) - reloop(0x04) - - label(0x4f) - if_chr_deadish(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - label(0x4f) - try_spawn_clone2(CHR_SELF, AILIST_INIT_KING_SKEDAR_CLONE, SPAWNFLAG_00000010, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_stage_flag(STAGEFLAG_KING_SKEDAR_CLONE_EXISTS) - yield - endloop(0x04) - - endlist -}; - -u8 func0410_init_king_skedar_clone[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) - yield - try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x20000000, /*goto*/ 0x06) - label(0x06) - yield - yield - yield - yield - unset_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, AILIST_INIT_UNARMED_SKEDAR) - endlist -}; - -u8 func0411_king_miniskedar_spawner[] = { - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_INVINCIBLE) -#endif - set_self_chrflag(CHRCFLAG_00040000) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00100000) - - beginloop(0x04) - if_chr_deadish(CHR_CLONE, /*goto*/ 0x2d) - goto_next(0x06) - - // Clone dead - label(0x2d) - unset_stage_flag(STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS) - label(0x06) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x4f) - reloop(0x04) - - // Clone dead and flag set - // Redundant check - label(0x4f) - if_chr_deadish(CHR_CLONE, /*goto*/ 0x4f) - reloop(0x04) - - // Spawn clone - label(0x4f) - try_spawn_clone2(CHR_SELF, AILIST_INIT_KING_MINISKEDAR_CLONE, SPAWNFLAG_00000010, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - unset_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_stage_flag(STAGEFLAG_KING_MINISKEDAR_CLONE_EXISTS) - yield - endloop(0x04) - - endlist -}; - -u8 func0412_init_king_miniskedar_clone[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_CLOAKED) - yield - try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x20000000, /*goto*/ 0x06) - label(0x06) - yield - yield - yield - yield - unset_self_chrflag(CHRCFLAG_HIDDEN) - set_chr_cloaked(CHR_SELF, FALSE, TRUE) - set_ailist(CHR_SELF, AILIST_INIT_MINISKEDAR) - endlist -}; - -u8 func100f_spikes_vulnerability[] = { - set_object_flag2(OBJ_SPIKE_ML, OBJFLAG2_00000002 | OBJFLAG2_00200000) - set_object_flag2(OBJ_SPIKE_MR, OBJFLAG2_00000002 | OBJFLAG2_00200000) - set_object_flag2(OBJ_SPIKE_BL, OBJFLAG2_00000002 | OBJFLAG2_00200000) - set_object_flag2(OBJ_SPIKE_BR, OBJFLAG2_00000002 | OBJFLAG2_00200000) - set_object_flag2(OBJ_SPIKE_T, OBJFLAG2_00000002 | OBJFLAG2_00200000) - - beginloop(0x91) - if_stage_flag_eq(STAGEFLAG_IN_INTRO, FALSE, /*goto*/ 0x86) - endloop(0x91) - - label(0x86) - label(0x03) - set_object_flag(OBJ_SPIKE_ML, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_SPIKE_MR, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_SPIKE_BL, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_SPIKE_BR, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_SPIKE_T, OBJFLAG_INVINCIBLE) - set_object_flag3(OBJ_SPIKE_ML, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - set_object_flag3(OBJ_SPIKE_MR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - set_object_flag3(OBJ_SPIKE_BL, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - set_object_flag3(OBJ_SPIKE_BR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - set_object_flag3(OBJ_SPIKE_T, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_SPIKES_VULNERABLE, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - unset_object_flag(OBJ_SPIKE_ML, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_SPIKE_MR, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_SPIKE_BL, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_SPIKE_BR, OBJFLAG_INVINCIBLE) - unset_object_flag3(OBJ_SPIKE_ML, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - unset_object_flag3(OBJ_SPIKE_MR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - unset_object_flag3(OBJ_SPIKE_BL, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - unset_object_flag3(OBJ_SPIKE_BR, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - - if_stage_flag_eq(STAGEFLAG_SPIKE1_DESTROYED, FALSE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_SPIKE2_DESTROYED, FALSE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_SPIKE3_DESTROYED, FALSE, /*goto*/ 0x08) - if_stage_flag_eq(STAGEFLAG_SPIKE4_DESTROYED, FALSE, /*goto*/ 0x08) - unset_object_flag(OBJ_SPIKE_T, OBJFLAG_INVINCIBLE) - unset_object_flag3(OBJ_SPIKE_T, OBJFLAG3_SHOWSHIELD | OBJFLAG3_HOVERBEDSHIELD) - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_SPIKES_VULNERABLE, FALSE, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - goto_first(0x03) - - endlist -}; - -#define wait_for_spike_destroyed(spike, shadow, noshadow) \ - beginloop(0x03) \ - if_object_in_good_condition(spike, /*goto*/ 0x2d) \ - goto_next(0x06) \ - \ - label(0x2d) \ - endloop(0x03) \ - \ - label(0x06) \ - set_object_flag2(shadow, OBJFLAG2_INVISIBLE) \ - unset_object_flag2(noshadow, OBJFLAG2_INVISIBLE) - -u8 func1010_spike_ml[] = { - wait_for_spike_destroyed(OBJ_SPIKE_ML, OBJ_SPIKE_SHAD_ML, OBJ_SPIKE_NOSHAD_ML) - set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) - endlist -}; - -u8 func1011_spike_mr[] = { - wait_for_spike_destroyed(OBJ_SPIKE_MR, OBJ_SPIKE_SHAD_MR, OBJ_SPIKE_NOSHAD_MR) - set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) - endlist -}; - -u8 func1012_spike_bl[] = { - wait_for_spike_destroyed(OBJ_SPIKE_BL, OBJ_SPIKE_SHAD_BL, OBJ_SPIKE_NOSHAD_BL) - set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) - endlist -}; - -u8 func1013_spike_br[] = { - wait_for_spike_destroyed(OBJ_SPIKE_BR, OBJ_SPIKE_SHAD_BR, OBJ_SPIKE_NOSHAD_BR) - set_ailist(CHR_SELF, AILIST_UPDATE_SPIKE_STAGEFLAGS) - endlist -}; - -u8 func1014_spike_top[] = { - wait_for_spike_destroyed(OBJ_SPIKE_T, OBJ_SPIKE_SHAD_T, OBJ_SPIKE_NOSHAD_T) - - set_stage_flag(STAGEFLAG_SPIKE5_DESTROYED) - yield - if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x06) - - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040f_update_spike_stageflags[] = { - if_stage_flag_eq(STAGEFLAG_SPIKE1_DESTROYED, TRUE, /*goto*/ 0x09) - set_stage_flag(STAGEFLAG_SPIKE1_DESTROYED) - set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x09) - if_stage_flag_eq(STAGEFLAG_SPIKE2_DESTROYED, TRUE, /*goto*/ 0x0b) - set_stage_flag(STAGEFLAG_SPIKE2_DESTROYED) - set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x0b) - if_stage_flag_eq(STAGEFLAG_SPIKE3_DESTROYED, TRUE, /*goto*/ 0x0c) - set_stage_flag(STAGEFLAG_SPIKE3_DESTROYED) - set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x0c) - set_stage_flag(STAGEFLAG_SPIKE4_DESTROYED) - set_stage_flag(STAGEFLAG_SPIKE_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c00_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_SKEDARRUINS_INTRO) - set_stage_flag(STAGEFLAG_IN_INTRO) - set_chr_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER) - set_chr_chrflag(CHR_KING2, CHRCFLAG_HIDDEN) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_01) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x08) - - label(0x86) - if_controller_button_pressed(/*goto*/ 0x86) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_02) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_ELVIS_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_CALLISTO, WEAPON_NONE) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x09) - - label(0x86) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - if_controller_button_pressed(/*goto*/ 0x86) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_03) - - set_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x37, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR1_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x37, 4) - - set_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x38, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x38, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR2_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x38, 4) - - set_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x39, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x39, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR3_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x39, 4) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x0b) - - label(0x86) - unset_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) - if_controller_button_pressed(/*goto*/ 0x86) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_04) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_ELVIS_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_DEVASTATOR, WEAPON_NONE) - - beginloop(0x0c) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x0c) - - label(0x86) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - if_controller_button_pressed(/*goto*/ 0x86) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_05) - - set_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x37, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR1_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x37, 4) - - set_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x38, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x38, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR2_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x38, 4) - - set_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x39, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x39, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR3_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x39, 4) - - set_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x3a, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x3a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR4_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x3a, 4) - - beginloop(0x0d) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x0d) - - label(0x86) - unset_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) - if_controller_button_pressed(/*goto*/ 0x86) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_06) - - enable_object(0x36) - set_object_flag2(0x36, OBJFLAG2_04000000) - set_object_flag3(0x36, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_INTRO_SKSHUTTLE_01, 0x36, 0x01, 0xffff) - object_set_modelpart_visible(0x36, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - - beginloop(0x0e) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x0e) - - label(0x86) - disable_object(0x36) - if_controller_button_pressed(/*goto*/ 0x86) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_07) - - set_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x37, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x37, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR1_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x37, 4) - - set_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x38, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x38, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR2_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x38, 4) - - set_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x39, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x39, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR3_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x39, 4) - - set_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x3a, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x3a, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_SKEDAR4_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x3a, 4) - - unset_chr_chrflag(CHR_KING2, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_KING2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_KING2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_KING2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_KING, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_KING2, 4) - - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - - beginloop(0x0f) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x0f) - - label(0x86) - unset_chr_chrflag(0x37, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x38, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x39, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x3a, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_KING2, CHRCFLAG_UNPLAYABLE) - camera_movement(ANIM_CUT_SHO_INTRO_CAM_08) - cmd0175(60) - if_controller_button_pressed(/*goto*/ 0x86) - - enable_object(0x36) - set_object_flag2(0x36, OBJFLAG2_04000000) - set_object_flag3(0x36, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_INTRO_SKSHUTTLE_02, 0x36, 0x04, 0xffff) - object_set_modelpart_visible(0x36, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_JO_03, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - beginloop(0x10) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x10) - - label(0x86) - unset_stage_flag(STAGEFLAG_IN_INTRO) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER) - mute_channel(CHANNEL_7) - label(0x06) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_INTRO_JO_03, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - disable_object(0x36) - remove_chr(0x37) - remove_chr(0x38) - remove_chr(0x39) - remove_chr(0x3a) - remove_chr(CHR_KING2) - unset_chr_chrflag(CHR_KING1, CHRCFLAG_HIDDEN) - set_ailist(CHR_KING1, AILIST_KING_WAITING) - set_object_flag2(0x2a, OBJFLAG2_04000000) - set_object_flag2(0x2b, OBJFLAG2_04000000) - set_object_flag2(0x2c, OBJFLAG2_04000000) - set_object_flag2(0x2d, OBJFLAG2_04000000) - set_object_flag2(0x2e, OBJFLAG2_04000000) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - stop_cutscene_track - stop_ambient_track - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0414_outro_from_menu[] = { - set_ailist(CHR_ELVIS, GAILIST_IDLE) -#if VERSION >= VERSION_NTSC_1_0 - disable_object(OBJ_SPIKE_ML) - disable_object(OBJ_SPIKE_MR) - disable_object(OBJ_SPIKE_BL) - disable_object(OBJ_SPIKE_BR) -#endif - set_ailist(CHR_SELF, AILIST_OUTRO) - endlist -}; - -u8 func0414_outro[] = { - if_chr_death_animation_finished(CHR_BOND, /*goto*/ 0x2d) - set_target_chr(CHR_BOND) - goto_next(0x06) - - label(0x2d) - set_target_chr(CHR_COOP) - - label(0x06) - set_chr_chrflag(CHR_TARGET, CHRCFLAG_KILLCOUNTABLE) - camera_movement(ANIM_CUT_SHO_OUTRO_CAM_01) - play_cutscene_track(MUSIC_SKEDARRUINS_OUTRO) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_ailist(CHR_TARGET, GAILIST_IDLE) - remove_chr(0x05) - remove_chr(0x06) - remove_chr(0x07) - remove_chr(0x08) - remove_chr(0x09) - remove_chr(0x0a) - remove_chr(0x0b) - remove_chr(0x0c) - remove_chr(0x0d) - remove_chr(0x0e) - remove_chr(0x17) - remove_chr(0x0f) - remove_chr(0x10) - remove_chr(0x0d) - remove_chr(0x1c) - remove_chr(0x18) - remove_chr(0x19) - remove_chr(0x1a) - remove_chr(0x11) - remove_chr(0x12) - remove_chr(0x13) - remove_chr(0x14) - remove_chr(0x1b) - remove_chr(0x15) - remove_chr(0x16) - remove_chr(0x1d) - remove_chr(0x1e) - remove_chr(0x1f) - set_ailist(CHR_KING1, GAILIST_IDLE) - - set_chr_chrflag(CHR_KING1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_KING1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_KING1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_OUTRO_KING_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_KING1, 4) - - object_do_animation(ANIM_CUT_SHO_OUTRO_SPIKE_01, OBJ_SPIKE_T, 0x04, 0xffff) - set_stage_flag(STAGEFLAG_IN_OUTRO) - show_nonessential_chrs(FALSE) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x08) - - label(0x86) - camera_movement(ANIM_CUT_SHO_OUTRO_CAM_02) - - set_chr_chrflag(CHR_KING1, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_KING1, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_KING1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_OUTRO_KING_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_KING1, 4) - - set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_OUTRO_JO_01, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) - - object_do_animation(ANIM_CUT_SHO_OUTRO_SPIKE_02, OBJ_SPIKE_T, 0x04, 0xffff) - - enable_object(0x37) - set_object_flag2(0x37, OBJFLAG2_04000000) - set_object_flag3(0x37, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE05, 0x37, 0x04, 0xffff) - - enable_object(0x38) - set_object_flag2(0x38, OBJFLAG2_04000000) - set_object_flag3(0x38, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE06, 0x38, 0x04, 0xffff) - - enable_object(0x39) - set_object_flag2(0x39, OBJFLAG2_04000000) - set_object_flag3(0x39, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE07, 0x39, 0x04, 0xffff) - - enable_object(0x3a) - set_object_flag2(0x3a, OBJFLAG2_04000000) - set_object_flag3(0x3a, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE08, 0x3a, 0x04, 0xffff) - - enable_object(0x3b) - set_object_flag2(0x3b, OBJFLAG2_04000000) - set_object_flag3(0x3b, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE09, 0x3b, 0x04, 0xffff) - enable_object(0x3c) - - set_object_flag2(0x3c, OBJFLAG2_04000000) - set_object_flag3(0x3c, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE10, 0x3c, 0x04, 0xffff) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x09) - - label(0x86) - disable_object(0x3c) - camera_movement(ANIM_CUT_SHO_OUTRO_CAM_03) - - set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_OUTRO_JO_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_TARGET, 4) - - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_SHO_OUTRO_ELVIS_02, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - - enable_object(0x23) - set_object_flag2(0x23, OBJFLAG2_04000000) - set_object_flag3(0x23, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE01, 0x23, 0x04, 0xffff) - - enable_object(0x24) - set_object_flag2(0x24, OBJFLAG2_04000000) - set_object_flag3(0x24, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE02, 0x24, 0x04, 0xffff) - - enable_object(0x25) - set_object_flag2(0x25, OBJFLAG2_04000000) - set_object_flag3(0x25, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE03, 0x25, 0x04, 0xffff) - - enable_object(0x26) - set_object_flag2(0x26, OBJFLAG2_04000000) - set_object_flag3(0x26, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_SHO_OUTRO_RUBBLE04, 0x26, 0x04, 0xffff) - - beginloop(0x0b) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x86) - - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x86) - label(0x2d) - endloop(0x0b) - - label(0x86) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_KILLCOUNTABLE) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_KILLCOUNTABLE) - unset_stage_flag(STAGEFLAG_IN_OUTRO) - disable_object(0x23) - disable_object(0x24) - disable_object(0x25) - disable_object(0x26) - label(0x06) - stop_cutscene_track - stop_ambient_track - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0413_hide[] = { - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1015_msg_specialpillars[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0026, /*goto*/ 0x91) - if_chr_in_room(CHR_P1P2, 0x00, 0x0031, /*goto*/ 0x92) - if_chr_in_room(CHR_P1P2, 0x00, 0x0035, /*goto*/ 0x93) - if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x94) - if_chr_in_room(CHR_P1P2, 0x00, 0x000e, /*goto*/ 0x95) - endloop(0x04) - - label(0x91) - if_object_in_room(0x01, 0x0026, /*goto*/ 0x2d) - if_object_in_room(0x02, 0x0026, /*goto*/ 0x2d) - if_object_in_room(0x03, 0x0026, /*goto*/ 0x2d) - goto_first(0x04) - - label(0x92) - if_object_in_room(0x01, 0x0031, /*goto*/ 0x2d) - if_object_in_room(0x02, 0x0031, /*goto*/ 0x2d) - if_object_in_room(0x03, 0x0031, /*goto*/ 0x2d) - goto_first(0x04) - - label(0x93) - if_object_in_room(0x01, 0x0037, /*goto*/ 0x2d) - if_object_in_room(0x02, 0x0037, /*goto*/ 0x2d) - if_object_in_room(0x03, 0x0037, /*goto*/ 0x2d) - goto_first(0x04) - - label(0x94) - if_object_in_room(0x01, 0x002b, /*goto*/ 0x2d) - if_object_in_room(0x02, 0x002b, /*goto*/ 0x2d) - if_object_in_room(0x03, 0x002b, /*goto*/ 0x2d) - goto_first(0x04) - - label(0x95) - if_object_in_room(0x01, 0x000d, /*goto*/ 0x2d) - if_object_in_room(0x02, 0x000d, /*goto*/ 0x2d) - if_object_in_room(0x03, 0x000d, /*goto*/ 0x2d) - goto_first(0x04) - - label(0x2d) - speak(CHR_P1P2, L_SHO_030, MP3_03E0, CHANNEL_6, COLOR_09_BLUE) // "This seems to be one of the special pillars." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_msg_powersmoreconstant[] = { - restart_timer - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0077, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - speak(CHR_P1P2, L_SHO_031, MP3_03E1, CHANNEL_6, COLOR_09_BLUE) // "The power's more constant in this area. The Inner ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_msg_skedararmy[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0082, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - speak(CHR_P1P2, L_SHO_032, MP3_03E2, CHANNEL_6, COLOR_09_BLUE) // "OH, NO!!! A Skedar army in suspended animation!" - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_msg_cutoffthehead[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0088, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x08) - - label(0x2d) - speak(CHR_P1P2, L_SHO_033, MP3_03E3, CHANNEL_6, COLOR_09_BLUE) // "Okay, this is it... Cut off the head and the body ..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1019_blow_pillars[] = { - // Wait until all pillars marked - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_PILLAR1_MARKED, TRUE, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR2_MARKED, TRUE, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_stage_flag_eq(STAGEFLAG_PILLAR3_MARKED, TRUE, /*goto*/ 0x2d) - endloop(0x04) - - // Wait 10 seconds - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(600, /*goto*/ 0x2d) - endloop(0x08) - - // 1 - label(0x2d) - unset_object_flag(0x27, OBJFLAG_00000100) - unset_object_flag(0x28, OBJFLAG_00000100) - unset_object_flag(0x29, OBJFLAG_00000100) - unset_object_flag(OBJ_PILLAR1, OBJFLAG_INVINCIBLE) - unset_object_flag(0x27, OBJFLAG_INVINCIBLE) - destroy_object(0x27) - yield - yield - yield - yield - yield - restart_timer - - beginloop(0x09) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x09) - - // 2 - label(0x2d) - unset_object_flag(OBJ_PILLAR2, OBJFLAG_INVINCIBLE) - unset_object_flag(0x28, OBJFLAG_INVINCIBLE) - destroy_object(0x28) - yield - yield - yield - yield - yield - restart_timer - - beginloop(0x0b) - if_timer_gt(180, /*goto*/ 0x2d) - endloop(0x0b) - - // 3 - label(0x2d) - unset_object_flag(OBJ_PILLAR3, OBJFLAG_INVINCIBLE) - unset_object_flag(0x29, OBJFLAG_INVINCIBLE) - destroy_object(0x29) - yield - yield - yield - yield - yield - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_setup_pillars[] = { - yield - shuffle_ruins_pillars(OBJ_PILLAR1, OBJ_PILLAR2, OBJ_PILLAR3, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x27, 0x28, 0x29, 0x2f, 0x30, 0x31, 0x32, 0x33) - yield - set_object_flag3(OBJ_PILLAR1, OBJFLAG3_RTRACKED_YELLOW) - set_object_flag3(OBJ_PILLAR2, OBJFLAG3_RTRACKED_YELLOW) - set_object_flag3(OBJ_PILLAR3, OBJFLAG3_RTRACKED_YELLOW) - set_object_flag(OBJ_PILLAR1, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_PILLAR2, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_PILLAR3, OBJFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_remove_pillar_shadow[] = { - beginloop(0x04) - // One of the pillars, but with a different tag - if_object_in_good_condition(0x41, /*goto*/ 0x2d) - - // Destroyed - remove shadow - label(0x06) - disable_object(0x3d) - disable_object(0x3e) - unset_object_flag2(0x4e, OBJFLAG2_INVISIBLE) - unset_object_flag2(0x4f, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - endloop(0x04) - - // Unreachable - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c00_intro_sounds[] = { - label(0xda) - if_chr_has_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER, /*goto*/ 0xdb) - yield - goto_first(0xda) - - label(0xdb) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_RUNFASTER) - - #define wait_until_with_stageflag(time, loopid) \ - beginloop(loopid) \ - if_stage_flag_eq(STAGEFLAG_IN_INTRO, FALSE, /*goto*/ 0x86) \ - if_controller_button_pressed(/*goto*/ 0x86) \ - if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? time : time - 50, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x86) \ - if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? time : time - 50, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - label(0x2d) - restart_timer - - wait_until_with_stageflag(100, 0x91) - speak(CHR_BOND, L_SHO_034, MP3_048D, CHANNEL_10, COLOR_04_ORANGE) // "This is the Skedar fanatics' most holy place. They..." - - wait_until_with_stageflag(770, 0xa4) - play_sound(SFX_RELOAD_FARSIGHT, CHANNEL_10) - - wait_until_with_stageflag(800, 0x92) - speak(CHR_BOND, L_SHO_035, MP3_048E, CHANNEL_10, COLOR_09_BLUE) // "So let me get this straight - it's holy. But there..." - - wait_until_with_stageflag(1018, 0xa5) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(1090, 0xa6) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until_with_stageflag(1148, 0xa7) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(1210, 0x93) - speak(CHR_BOND, L_SHO_036, MP3_048F, CHANNEL_10, COLOR_04_ORANGE) // "Yes. In all of the time that we Maians fought the ..." - - wait_until_with_stageflag(1230, 0xa8) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until(1270, 0xc5) - play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) - - wait_until_with_stageflag(1274, 0xa9) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(1330, 0xaa) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until_with_stageflag(1375, 0xab) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(1435, 0xac) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until_with_stageflag(1490, 0xad) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(1600, 0xc7) - play_sound(SFX_05C7, CHANNEL_10) - - wait_until_with_stageflag(1670, 0xc8) - play_sound(SFX_05C6, CHANNEL_10) - - wait_until_with_stageflag(1710, 0xae) - play_sound(SFX_05C5, CHANNEL_10) - - wait_until_with_stageflag(1840, 0xaf) - play_sound(SFX_05CC, CHANNEL_10) - - wait_until_with_stageflag(2040, 0xb7) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2065, 0xb0) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until_with_stageflag(2090, 0xb8) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2115, 0xb1) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until(2050, 0xc6) // time is out of order - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until_with_stageflag(2140, 0xb9) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2180, 0xb2) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until_with_stageflag(2220, 0xb3) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2250, 0xb4) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2290, 0xb5) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2340, 0xb6) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until_with_stageflag(2650, 0x94) - speak(CHR_BOND, L_SHO_037, MP3_0490, CHANNEL_10, COLOR_09_BLUE) // "Then we have to be certain that no fanatics surviv..." - - wait_until_with_stageflag(3250, 0x95) - speak(CHR_BOND, L_SHO_038, MP3_0491, CHANNEL_10, COLOR_04_ORANGE) // "If you're caught on the ground when the fleet gets..." - - wait_until(3330, 0xc3) - play_sound(SFX_SKEDAR_ROAR_0530, CHANNEL_10) - - wait_until(3535, 0xc4) - play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) - - wait_until_with_stageflag(3600, 0x96) - mute_channel(CHANNEL_7) - speak(CHR_BOND, L_SHO_039, MP3_0492, CHANNEL_10, COLOR_09_BLUE) // "That's a mistake I don't intend to make." - - wait_until(4040, 0xc0) - play_sound(SFX_05A0, CHANNEL_10) - - wait_until(4158, 0xc1) - play_sound(SFX_05A1, CHANNEL_10) - - wait_until(4236, 0xc2) - play_sound(SFX_SKEDAR_ROAR_0529, CHANNEL_10) - - wait_until(4580, 0xbc) - play_sound(SFX_01D8, CHANNEL_10) - - wait_until(4610, 0xbd) - play_sound(SFX_01DA, CHANNEL_10) - - wait_until(4630, 0xbe) - play_sound(VERSION >= VERSION_NTSC_1_0 ? SFX_80F6 : SFX_01D9, CHANNEL_10) - - wait_until(4678, 0xbf) - play_sound(SFX_01DB, CHANNEL_10) - - wait_until_with_stageflag(4675, 0x97) - play_sound(SFX_0162, CHANNEL_10) - - wait_until_with_stageflag(4750, 0xbb) - play_sound(SFX_0161, CHANNEL_10) - - mute_channel(CHANNEL_0) - mute_channel(CHANNEL_1) - mute_channel(CHANNEL_2) - mute_channel(CHANNEL_3) - mute_channel(CHANNEL_4) - mute_channel(CHANNEL_5) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_7) - label(0x86) - mute_channel(CHANNEL_10) - goto_first(0xda) - - endlist -}; - -u8 func0414_outro_sounds[] = { - // The kill countable flag is probably just used to track which player - // destroyed the final spike so they can be shown in the outro. - label(0xda) - if_chr_has_chrflag(CHR_BOND, CHRCFLAG_KILLCOUNTABLE, /*goto*/ 0xdb) - if_chr_has_chrflag(CHR_COOP, CHRCFLAG_KILLCOUNTABLE, /*goto*/ 0xdc) - yield - goto_first(0xda) - - label(0xdb) - set_target_chr(CHR_BOND) - goto_next(0x2d) - - label(0xdc) - set_target_chr(CHR_COOP) - goto_next(0x2d) - - #define outro_wait_until_with_stageflag(time, loopid) \ - beginloop(loopid) \ - if_stage_flag_eq(STAGEFLAG_IN_OUTRO, FALSE, /*goto*/ 0x86) \ - if_controller_button_pressed(/*goto*/ 0x86) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - #define outro_wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x86) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - label(0x2d) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_KILLCOUNTABLE) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_KILLCOUNTABLE) - restart_timer - - outro_wait_until_with_stageflag(40, 0xd5) - play_sound(SFX_0067, CHANNEL_10) - - outro_wait_until_with_stageflag(80, 0x9e) - play_sound(SFX_0067, CHANNEL_10) - - outro_wait_until_with_stageflag(120, 0x9f) - play_sound(SFX_0067, CHANNEL_10) - - outro_wait_until_with_stageflag(160, 0xa0) - play_sound(SFX_05C0, CHANNEL_10) - - outro_wait_until_with_stageflag(180, 0xa1) - play_sound(SFX_SKEDAR_ROAR_052D, CHANNEL_10) - - outro_wait_until_with_stageflag(230, 0x9b) - speak(CHR_BOND, L_SHO_040, MP3_04DE, CHANNEL_10, COLOR_09_BLUE) // "Yesss..." - - outro_wait_until_with_stageflag(470, 0xa9) - play_sound(SFX_8099, CHANNEL_10) - - outro_wait_until_with_stageflag(494, 0xa2) - play_sound(SFX_EXPLOSION_8098, CHANNEL_10) - play_sound(SFX_00F6, CHANNEL_10) - - outro_wait_until_with_stageflag(520, 0xa8) - play_sound(SFX_809B, CHANNEL_10) - - outro_wait_until_with_stageflag(540, 0xa3) - play_sound(SFX_80A2, CHANNEL_10) - play_sound(SFX_00F6, CHANNEL_10) - - outro_wait_until_with_stageflag(550, 0xd6) - play_sound(MP3_07C8, CHANNEL_10) - - outro_wait_until_with_stageflag(600, 0xaa) - play_sound(SFX_80A3, CHANNEL_10) - - outro_wait_until_with_stageflag(616, 0xa4) - play_sound(SFX_809F, CHANNEL_10) - play_sound(SFX_00F6, CHANNEL_10) - - outro_wait_until_with_stageflag(700, 0xa5) - play_sound(SFX_80A1, CHANNEL_10) - play_sound(SFX_00F6, CHANNEL_10) - - outro_wait_until_with_stageflag(760, 0xcd) - play_sound(SFX_80A3, CHANNEL_10) - - outro_wait_until(780, 0xae) - fade_to_color(0x000000ff, 80) - - outro_wait_until_with_stageflag(790, 0xa6) - play_sound(SFX_809C, CHANNEL_10) - play_sound(SFX_00F6, CHANNEL_10) - - outro_wait_until_with_stageflag(820, 0xcc) - play_sound(SFX_80A2, CHANNEL_10) - - outro_wait_until_with_stageflag(860, 0xa7) - play_sound(SFX_80A3, CHANNEL_10) - - outro_wait_until_with_stageflag(880, 0xce) - play_sound(MP3_07DA, CHANNEL_10) - - outro_wait_until(920, 0xaf) - fade_to_color(0xffffffff, 0) - fade_to_color(0x00000000, 120) - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_TARGET, WEAPON_NONE, WEAPON_NONE) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - - outro_wait_until_with_stageflag(1680, 0x91) - mute_channel(CHANNEL_10) - speak(CHR_BOND, L_SHO_041, MP3_0493, CHANNEL_10, COLOR_04_ORANGE) // "Joanna! Joanna!" - - outro_wait_until_with_stageflag(2020, 0x9c) - speak(CHR_BOND, L_SHO_054, MP3_0755, CHANNEL_10, COLOR_04_ORANGE) // "Where are you? Are you hurt?" - - outro_wait_until_with_stageflag(2206, 0x92) - speak(CHR_BOND, L_SHO_042, MP3_0494, CHANNEL_10, COLOR_09_BLUE) // "Elvis! Elvis! Over here." - - outro_wait_until_with_stageflag(2625, 0x93) - speak(CHR_BOND, L_SHO_043, MP3_0495, CHANNEL_10, COLOR_04_ORANGE) // "No problem. Grab my arms - we'll get you out in no..." - - outro_wait_until_with_stageflag(2810, 0xd4) - play_sound(SFX_SKEDAR_ROAR_0531, CHANNEL_10) - - outro_wait_until_with_stageflag(2895, 0x94) - speak(CHR_BOND, L_SHO_044, MP3_0496, CHANNEL_10, COLOR_09_BLUE) // "No, quick! Give me your gun!" - - outro_wait_until_with_stageflag(3160, 0xca) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_ELVIS, WEAPON_PHOENIX, WEAPON_NONE) - - outro_wait_until_with_stageflag(3280, 0xcb) - set_cutscene_weapon(CHR_TARGET, WEAPON_PHOENIX, WEAPON_NONE) - set_cutscene_weapon(CHR_ELVIS, WEAPON_NONE, WEAPON_NONE) - - outro_wait_until_with_stageflag(3290, 0x95) - speak(CHR_BOND, L_SHO_045, MP3_0497, CHANNEL_10, COLOR_09_BLUE) // "Will! You! Just! Let! Go!" - - outro_wait_until_with_stageflag(3420, 0xcf) - set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) - yield - yield - set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) - play_sound(SFX_SKEDAR_ROAR_052E, CHANNEL_10) - - outro_wait_until_with_stageflag(3445, 0xd0) - set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) - yield - yield - set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) - - outro_wait_until_with_stageflag(3470, 0xd1) - set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) - yield - yield - set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) - - outro_wait_until_with_stageflag(3495, 0xd2) - set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) - yield - yield - set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) - - outro_wait_until_with_stageflag(3520, 0xd3) - set_chr_shooting_in_cutscene(CHR_TARGET, TRUE) - yield - yield - set_chr_shooting_in_cutscene(CHR_TARGET, FALSE) - play_sound_from_object2(CHANNEL_6, 0x25, SFX_SKEDAR_ROAR_052D, 0x00, 0x00) - - outro_wait_until_with_stageflag(3600, 0xd7) - play_sound(MP3_07C9, CHANNEL_10) - - outro_wait_until_with_stageflag(3880, 0xd8) - play_sound(SFX_0427, CHANNEL_10) - - outro_wait_until_with_stageflag(3990, 0x96) - speak(CHR_BOND, L_SHO_046, MP3_0498, CHANNEL_10, COLOR_04_ORANGE) // "I managed to get the fleet to stop the bombardment..." - - outro_wait_until_with_stageflag(4425, 0x97) - speak(CHR_BOND, L_SHO_047, MP3_0499, CHANNEL_10, COLOR_09_BLUE) // "I'd have got out in time if that one hadn't grabbe..." - - outro_wait_until_with_stageflag(4650, 0x98) - speak(CHR_BOND, L_SHO_048, MP3_049A, CHANNEL_10, COLOR_04_ORANGE) // "Of course, Joanna, of course." - - outro_wait_until_with_stageflag(4825, 0x99) - speak(CHR_BOND, L_SHO_049, MP3_049B, CHANNEL_10, COLOR_09_BLUE) // "No, I would have." - - outro_wait_until_with_stageflag(4960, 0x9a) - speak(CHR_BOND, L_SHO_050, MP3_049C, CHANNEL_10, COLOR_04_ORANGE) // "I believe you." - - outro_wait_until_with_stageflag(5560, 0x9d) - play_sound(SFX_0161, CHANNEL_7) - - label(0x86) - mute_channel(CHANNEL_10) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - goto_first(0xda) - - endlist -}; - -u8 func1020_show_phoenix[] = { - // Show Phoenix once pillars destroyed - beginloop(0x04) - if_object_in_good_condition(0x2a, /*goto*/ 0x2d) - if_object_in_good_condition(0x2b, /*goto*/ 0x2d) - if_object_in_good_condition(0x2c, /*goto*/ 0x2d) - if_object_in_good_condition(0x2d, /*goto*/ 0x2d) - if_object_in_good_condition(0x2e, /*goto*/ 0x2d) - unset_object_flag(OBJ_PHOENIX1, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_PHOENIX1, OBJFLAG2_INVISIBLE) - unset_object_flag(OBJ_PHOENIX2, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_PHOENIX2, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2d) - endloop(0x04) - - endlist -}; - -/** - * Handle the mine hidden inside the first ravine debris. - */ -u8 func1021_handle_mine[] = { - yield - if_difficulty_lt(DIFF_SA, /*goto*/ 0x2d) - - // SA and PA - disable_object(OBJ_REMOTEMINE) - - // A - label(0x2d) - destroy_object(OBJ_REMOTEMINE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1022_armyroom_exitdoors[] = { - yield - set_object_flag2(0x45, OBJFLAG2_LOCKEDFRONT) - set_object_flag2(0x46, OBJFLAG2_LOCKEDBACK) - if_difficulty_gt(DIFF_SA, /*goto*/ 0x2d) - - // A and SA - beginloop(0x91) - if_objective_complete(0, /*goto*/ 0x06) - endloop(0x91) - - label(0x06) - unset_object_flag2(0x45, OBJFLAG2_LOCKEDFRONT) - unset_object_flag2(0x46, OBJFLAG2_LOCKEDBACK) - - // All difficulties - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 unregistered_function1[] = { - restart_timer - - beginloop(0x04) - if_timer_gt(300, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - chr_drop_weapon(CHR_BOND) - show_hudmsg(CHR_BOND, L_SHO_026) // "Target Amplifier placed incorrectly." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Used to print whether the puzzle rock is pushable or not. - */ -u8 unregistered_function2[] = { - beginloop(0x04) - if_object_flag3(OBJ_PUZZLEROCK, OBJFLAG3_PUSHABLE, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func1024_check_grenades_wasted[] = { - beginloop(0x04) - if_ammo_quantity_lt(CHR_BOND, AMMOTYPE_DEVASTATOR, 1, /*goto*/ 0x2d) - reloop(0x04) - - label(0x2d) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - if_ammo_quantity_lt(CHR_COOP, AMMOTYPE_DEVASTATOR, 1, /*goto*/ 0x2d) - endloop(0x04) - - label(0x2d) - restart_timer - - beginloop(0x91) - if_timer_gt(240, /*goto*/ 0x2d) - endloop(0x91) - - label(0x2d) - if_object_in_good_condition(0x4d, /*goto*/ 0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x09) - endloop(0x08) - - beginloop(0x09) - if_object_in_good_condition(0x4d, /*goto*/ 0x2d) - - // Blown up using other means (eg. Phoenix or all guns cheat) - unset_stage_flag(STAGEFLAG_GRENADES_WASTED) - show_hudmsg(CHR_BOND, L_SHO_053) // "Alternative entrance to Shrine created." - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2d) - if_stage_flag_eq(STAGEFLAG_GRENADES_WASTED, TRUE, /*goto*/ 0x2d) - show_hudmsg(CHR_BOND, L_SHO_052) // "Grenade ammo used up - can't enter Shrine." - set_stage_flag(STAGEFLAG_GRENADES_WASTED) - label(0x2d) - endloop(0x09) - - endlist -}; - -u8 func1023_setup_rtracker[] = { - yield - set_object_flag3(OBJ_PHOENIX1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_PHOENIX2, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1427_setup_environment[] = { - yield - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0021, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0022, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0023, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0049, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0049, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0058, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1025_unlock_doors_for_buddy[] = { - yield - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2d) - - // Co-op mode - // Wait for pillars objective - beginloop(0x91) -#if VERSION >= VERSION_NTSC_1_0 - if_objective_complete(0, /*goto*/ 0x2d) - reloop(0x91) - - // Unlock doors repeatedly - label(0x2d) -#endif - unlock_door(0x0d, 0x02) - unlock_door(0x0e, 0x02) - unlock_door(0x0f, 0x02) - unlock_door(0x10, 0x02) - unlock_door(0x45, 0x80) - unlock_door(0x46, 0x80) - endloop(0x91) - - // Buddy doesn't exist - label(0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Open the portal in the explosive wall to prevent a flicker - * where the room isn't rendered on the first frame after exploding. - */ -u8 func1426_setup_portals[] = { - yield - set_portal_flag(0x0072, PORTALFLAG_FORCEOPEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1028_buddybridge[] = { - yield - - // Wait for camera to finish - beginloop(0x59) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x2e) - - label(0x2d) - endloop(0x59) - - // Wait 5 seconds - label(0x2e) - restart_timer - - beginloop(0x04) - if_timer_gt(VERSION >= VERSION_NTSC_1_0 ? 300 : 180, /*goto*/ 0x2d) - endloop(0x04) - - // This flag is set by global ailists - label(0x2d) - if_stage_flag_eq(STAGEFLAG_AI_BUDDY_EXISTS, FALSE, /*goto*/ 0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Flag not set - so this is solo mode - // Remove the bridge and barricade over the first ravine - label(0x2d) - disable_object(OBJ_BUDDYBRIDGE) - disable_object(OBJ_BUDDYBARRICADE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func0401_init_unarmed_skedar, 0x0401 }, - { func0402_unarmed_skedar, 0x0402 }, - { func0403_init_miniskedar, 0x0403 }, - { func0404_miniskedar, 0x0404 }, - { func0405_puzzleroom_miniskedar_waiting, 0x0405 }, - { func0404_miniskedar_spawner, 0x0406 }, - { func0407_init_cloaked_skedar, 0x0407 }, - { func0408_cloaked_skedar, 0x0408 }, - { func0409_reaper_slayer_skedar, 0x0409 }, - { func040a_init_reaper_slayer_skedar, 0x040a }, - { func040b_mauler_skedar, 0x040b }, - { func040c_king_waiting, 0x040c }, - { func040d_king_combat, 0x040d }, - { func040e_king_skedar_spawner, 0x040e }, - { func040f_update_spike_stageflags, 0x040f }, - { func0410_init_king_skedar_clone, 0x0410 }, - { func0411_king_miniskedar_spawner, 0x0411 }, - { func0412_init_king_miniskedar_clone, 0x0412 }, - { func0413_hide, 0x0413 }, - { func0414_outro, 0x0414 }, - { func0c00_intro, 0x0c00 }, - { func0414_outro_from_menu, 0x0c01 }, - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func0c00_intro, 0x1002 }, - { func1003_remove_random_skedar, 0x1003 }, - { func1004_setup_pillars, 0x1004 }, - { func1005_5e0c, 0x1005 }, - { func1006_bridge, 0x1006 }, - { func1007_bug_throws_bond, 0x1007 }, - { func1008_lock_door, 0x1008 }, - { func1009_altar, 0x1009 }, - { func100a_army_room, 0x100a }, - { func100b_check_sanctum_accessed, 0x100b }, - { func100c_check_army_defeated, 0x100c }, - { func100e_wake_skedar_army, 0x100e }, - { func100f_spikes_vulnerability, 0x100f }, - { func1010_spike_ml, 0x1010 }, - { func1011_spike_mr, 0x1011 }, - { func1012_spike_bl, 0x1012 }, - { func1013_spike_br, 0x1013 }, - { func1014_spike_top, 0x1014 }, - { func1015_msg_specialpillars, 0x1015 }, - { func1016_msg_powersmoreconstant, 0x1016 }, - { func1017_msg_skedararmy, 0x1017 }, - { func1018_msg_cutoffthehead, 0x1018 }, - { func1019_blow_pillars, 0x1019 }, - { func101a_pointless, 0x101a }, - { func101b_bug_throws_coop, 0x101b }, - { func101c_setup_corridor_lighting, 0x101c }, - { func101d_remove_pillar_shadow, 0x101d }, - { func0c00_intro_sounds, 0x141e }, - { func0414_outro_sounds, 0x141f }, - { func1020_show_phoenix, 0x1020 }, - { func1021_handle_mine, 0x1021 }, - { func1022_armyroom_exitdoors, 0x1022 }, - { func1023_setup_rtracker, 0x1023 }, - { func1024_check_grenades_wasted, 0x1024 }, - { func1025_unlock_doors_for_buddy, 0x1025 }, - { func1426_setup_portals, 0x1426 }, - { func1427_setup_environment, 0x1427 }, - { func1028_buddybridge, 0x1028 }, - { NULL, 0 }, -}; - struct path paths[] = { { NULL, 0, 0 }, }; diff --git a/src/setups/setupsilo.c b/src/setups/setupsilo.c index 56837031d..43b007c3c 100644 --- a/src/setups/setupsilo.c +++ b/src/setups/setupsilo.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupstat.c b/src/setups/setupstat.c index e8045ae5e..59b2683df 100644 --- a/src/setups/setupstat.c +++ b/src/setups/setupstat.c @@ -66,7 +66,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -298,1097 +298,3 @@ s32 intro[] = { struct path paths[] = { { NULL, 0, 0 }, }; - -u8 func1001_objectives_failed_msg[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1000_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func0403_init_maian_leader[] = { - stop_chr - yield - set_alertness(100) - set_accuracy(100) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(300) - set_recovery_speed(100) - set_shield(0) - set_ailist(CHR_SELF, AILIST_DEFEND) - endlist -}; - -u8 func0402_init_king[] = { - set_self_chrflag(CHRCFLAG_LOSEXTRAHEIGHT) - set_alertness(100) - set_accuracy(100) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(300) - set_recovery_speed(100) - set_shield(0) - set_self_chrflag(CHRCFLAG_UNEXPLODABLE) - set_ailist(CHR_SELF, AILIST_DEFEND) - endlist -}; - -u8 func0401_defend[] = { - set_shotlist(AILIST_DEFEND) - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - if_chr_deadish(CHR_SELF, /*goto*/ 0x2d) - goto_next(0x06) - - // Dying - label(0x2d) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Not dying - go to pad - label(0x06) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) - - label(0x03) - restart_timer - if_chr_distance_to_pad_gt(CHR_SELF, 500, PAD_PRESET, /*goto*/ 0x06) - go_to_target_pad(GOPOSFLAG_JOG) - - label(0x06) - go_to_target_pad(GOPOSFLAG_RUN) - - // Wait until at pad or 1 second has passed - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_PRESET, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x2d) - endloop(0x04) - - // Timer expired - loop again - label(0x2d) - goto_first(0x03) - - // At pad - label(0x06) - stop_chr - - // Wait for enemy to come into sight, or to be pushed away from pad - beginloop(0x09) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_distance_to_pad_gt(CHR_SELF, 300, PAD_PRESET, /*goto*/ 0x06) - endloop(0x09) - - // Pushed away from pad - return to it - label(0x06) - goto_first(0x03) - - // Line of sight to enemy - // The first king attacks immediately, while the other kings and Maian - // leader have a 2 second delay. Suspect this is a @bug; the logic would - // make more sense if it were the other way around. - label(0x08) - if_self_flag_bankx_eq(CHRFLAG1_WARFIRSTKING, TRUE, BANK_1, /*goto*/ 0x2d) - restart_timer - - beginloop(0x8f) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x8f) - - label(0x2d) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x2d) - set_returnlist(CHR_SELF, AILIST_DEFEND) - set_shotlist(AILIST_DEFEND) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - label(0x2d) - goto_first(0x03) - - endlist -}; - -u8 func1003_spawn_maians[] = { - yield - - // Wait for intro to finish - beginloop(0x58) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x2e) - label(0x2d) - endloop(0x58) - - label(0x2e) - yield - yield - yield - yield - yield - label(0x04) - yield - label(0x06) - set_morale(50) - - // Loop until a Maian is able to be spawned or counter depleted - beginloop(0x8d) - if_morale_lt(1, /*goto*/ 0x06) - try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_0053, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_0050, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004D, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004C, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004E, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_ELVIS1, HEAD_MAIAN_S, PAD_STAT_004A, AILIST_INIT_MAIAN, 0, /*goto*/ 0x8e) - reloop(0x8d) - - // Successful spawn - label(0x8e) - yield - subtract_morale(1) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - if_num_chrs_in_squadron_gt(7, GROUP_MAIANS, /*goto*/ 0x2d) - reloop(0x8d) - - // Wait 5 seconds - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x2d) - endloop(0x08) - - // If a spot has freed up, go back to the spawning part to spawn another - label(0x2d) - if_num_chrs_in_squadron_gt(7, GROUP_MAIANS, /*goto*/ 0x2d) - endloop(0x8d) - - // Still no free spot, so go back to the 5 second wait - label(0x2d) - goto_first(0x08) - - // Counter depleted - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0405_init_maian[] = { - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_RUNFASTER) - set_chr_team(CHR_SELF, TEAM_ALLY) - set_squadron(GROUP_MAIANS) - rebuild_teams - rebuild_squadrons - try_equip_weapon(MODEL_CHRMAIANSMG, WEAPON_CALLISTO, 0x00000000, /*goto*/ 0x06) - label(0x06) - try_inherit_properties(CHR_MAIAN_TEMPLATE, /*goto*/ 0x2d) - label(0x2d) - set_accuracy(100) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 200) - add_health_or_armor(0) - set_recovery_speed(100) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_MAIAN) - endlist -}; - -u8 func0404_maian[] = { - set_returnlist(CHR_SELF, AILIST_MAIAN) - set_shotlist(AILIST_MAIAN) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - - label(0x03) - set_target_chr(CHR_KING1) - if_chr_deadish(CHR_KING1, /*goto*/ 0x8f) - goto_next(0x2d) - - // King 1 dead - label(0x8f) - set_target_chr(CHR_KING2) - if_chr_deadish(CHR_KING2, /*goto*/ 0x90) - goto_next(0x2d) - - // King 2 dead - label(0x90) - set_target_chr(CHR_KING3) - run_to_pad(PAD_STAT_0094) - goto_next(0x04) - - // Go to king - label(0x2d) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x06) - endloop(0x04) - - // King died while running to him - label(0x06) - goto_first(0x03) - - // Maian has line of sight to king - label(0x08) - if_chr_deadish(CHR_TARGET, /*goto*/ 0x06) - set_returnlist(CHR_SELF, AILIST_MAIAN) - set_shotlist(AILIST_MAIAN) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // King died while fighting - label(0x06) - goto_first(0x03) - - endlist -}; - -u8 func1004_spawn_king1_skedar[] = { - // Wait for intro to finish - beginloop(0x58) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x2e) - label(0x2d) - endloop(0x58) - - label(0x2e) - yield - yield - yield - yield - yield - label(0x04) - yield - label(0x06) - set_morale(65) - - // Loop until a Skedar is able to be spawned or counter depleted - beginloop(0x8d) - if_stage_flag_eq(STAGEFLAG_KING1_DEAD, TRUE, /*goto*/ 0x0e) - if_morale_lt(1, /*goto*/ 0x06) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0079, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_007D, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0083, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0085, AILIST_KING1_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - reloop(0x8d) - - // Successful spawn - label(0x8e) - yield - subtract_morale(1) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - if_num_chrs_in_squadron_gt(5, 0x02, /*goto*/ 0x2d) - reloop(0x8d) - - // Wait for 10 seconds if Maian squad is somewhat full, - // or wait 1 second if Maian squad is somewhat empty. - label(0x2d) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_KING1_DEAD, TRUE, /*goto*/ 0x0e) - if_num_chrs_in_squadron_gt(3, GROUP_MAIANS, /*goto*/ 0x2e) - if_timer_gt(60, /*goto*/ 0x2d) - label(0x2e) - if_timer_gt(600, /*goto*/ 0x2d) - endloop(0x08) - - // If squad is still full, wait another 1 or 10 seconds - label(0x2d) - if_num_chrs_in_squadron_gt(5, GROUP_KING1_SKEDAR, /*goto*/ 0x2d) - goto_first(0x8d) - - // Spawn more - label(0x2d) - goto_first(0x08) - - // Counter depleted - label(0x06) - - // King 1 dead - label(0x0e) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_spawn_king2_skedar[] = { - // Wait for intro to finish - beginloop(0x58) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x2e) - label(0x2d) - endloop(0x58) - - // Wait for king 1 to die - label(0x2e) - yield - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_KING1_DEAD, TRUE, /*goto*/ 0x06) - endloop(0x04) - - // Loop until a Skedar is able to be spawned or counter depleted - label(0x06) - set_morale(50) - - beginloop(0x8d) - if_stage_flag_eq(STAGEFLAG_KING2_DEAD, TRUE, /*goto*/ 0x0e) - if_morale_lt(1, /*goto*/ 0x06) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_008E, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0090, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_008F, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0091, AILIST_KING2_SKEDAR, SPAWNFLAG_00000010 | SPAWNFLAG_00000200, /*goto*/ 0x8e) - reloop(0x8d) - - // Successful spawn - label(0x8e) - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - yield - subtract_morale(1) - rebuild_teams - rebuild_squadrons - if_num_chrs_in_squadron_gt(3, GROUP_KING2_SKEDAR, /*goto*/ 0x2d) - reloop(0x8d) - - // Wait 15 seconds or until king 2 dead - label(0x2d) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_KING2_DEAD, TRUE, /*goto*/ 0x0e) - if_timer_gt(900, /*goto*/ 0x2d) - endloop(0x08) - - // If squad still full, wait another 15 seconds, otherwise loop back to - // the spawning code. - label(0x2d) - if_num_chrs_in_squadron_gt(3, GROUP_KING2_SKEDAR, /*goto*/ 0x2d) - endloop(0x8d) - - label(0x2d) - goto_first(0x08) - - // Counter depleted - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_spawn_king3_skedar[] = { - // Wait for intro to finish - beginloop(0x58) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x2e) - label(0x2d) - endloop(0x58) - - // Wait for king 2 to die - label(0x2e) - yield - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_KING2_DEAD, TRUE, /*goto*/ 0x06) - endloop(0x04) - - // Loop until a Skedar is able to be spawned or counter depleted - label(0x06) - set_morale(50) - - beginloop(0x8d) - if_stage_flag_eq(STAGEFLAG_KING3_DEAD, TRUE, /*goto*/ 0x0e) - if_morale_lt(1, /*goto*/ 0x06) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0095, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0096, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_012E, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - try_spawn_chr_at_pad(BODY_SKEDAR, HEAD_RANDOM, PAD_STAT_0132, AILIST_KING3_SKEDAR, SPAWNFLAG_00000200, /*goto*/ 0x8e) - reloop(0x8d) - - // Successful spawn - label(0x8e) - yield - subtract_morale(1) - rebuild_teams - rebuild_squadrons - if_num_chrs_in_squadron_gt(5, 0x04, /*goto*/ 0x2d) - reloop(0x8d) - - // Squad full - wait 15 seconds or for king 3 to die - label(0x2d) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_KING3_DEAD, TRUE, /*goto*/ 0x0e) - if_timer_gt(900, /*goto*/ 0x2d) - endloop(0x08) - - // Spawn more or wait another 15 seconds - label(0x2d) - if_num_chrs_in_squadron_gt(5, GROUP_KING3_SKEDAR, /*goto*/ 0x2d) - endloop(0x8d) - - label(0x2d) - goto_first(0x08) - - // Countdown depleted - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0407_king1_skedar[] = { - try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x00000000, /*goto*/ 0x06) - label(0x06) - try_inherit_properties(CHR_SKEDAR_TEMPLATE, /*goto*/ 0x2d) - label(0x2d) - set_squadron(GROUP_KING1_SKEDAR) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - set_accuracy(10) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 150) - add_health_or_armor(80) - set_recovery_speed(100) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_SKEDAR) - endlist -}; - -u8 func0408_king2_skedar[] = { - try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x00000000, /*goto*/ 0x06) - label(0x06) - try_inherit_properties(CHR_SKEDAR_TEMPLATE, /*goto*/ 0x2d) - label(0x2d) - set_squadron(GROUP_KING2_SKEDAR) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - set_accuracy(10) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 150) - add_health_or_armor(80) - set_recovery_speed(100) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_SKEDAR) - endlist -}; - -u8 func0409_king3_skedar[] = { - try_equip_weapon(MODEL_CHRMAULER, WEAPON_MAULER, 0x00000000, /*goto*/ 0x06) - label(0x06) - try_inherit_properties(CHR_SKEDAR_TEMPLATE, /*goto*/ 0x2d) - label(0x2d) - set_squadron(GROUP_KING3_SKEDAR) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_chr_hiddenflag(CHR_SELF, CHRHFLAG_00400000) - set_accuracy(10) - set_reaction_speed(50) - set_chr_maxdamage(CHR_SELF, 150) - add_health_or_armor(80) - set_recovery_speed(100) - set_shield(0) - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, AILIST_SKEDAR) - endlist -}; - -u8 func0406_skedar[] = { - set_shotlist(AILIST_SKEDAR) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - label(0x03) - - // Go to Maian leader - set_target_chr(CHR_MAIAN_LEADER) - try_run_to_target(/*goto*/ 0x04) - - beginloop(0x04) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x08) - endloop(0x04) - - label(0x08) - set_returnlist(CHR_SELF, AILIST_SKEDAR) - set_shotlist(AILIST_SKEDAR) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func1005_check_leader_dead[] = { - beginloop(0x03) - if_chr_deadish(CHR_MAIAN_LEADER, /*goto*/ 0x2d) - endloop(0x03) - - label(0x2d) - show_hudmsg(CHR_BOND, L_STAT_007) // "Maian leader has been killed." - set_stage_flag(STAGEFLAG_LEADER_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1009_check_king1_dead[] = { - set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - - beginloop(0x03) - if_chr_deadish(CHR_KING1, /*goto*/ 0x2d) - endloop(0x03) - - label(0x2d) - show_hudmsg(CHR_BOND, L_STAT_008) // "Skedar King has been killed." - set_stage_flag(STAGEFLAG_KING1_DEAD) - unlock_door(0x3e, 0x40) - unlock_door(0x3f, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_check_king2_dead[] = { - set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0e) - - beginloop(0x03) - if_chr_deadish(CHR_KING2, /*goto*/ 0x2d) - endloop(0x03) - - label(0x2d) - show_hudmsg(CHR_BOND, L_STAT_008) // "Skedar King has been killed." - set_stage_flag(STAGEFLAG_KING2_DEAD) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_king3_dead[] = { - set_object_flag(OBJ_BRIDGE, OBJFLAG_DEACTIVATED) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0e) - - beginloop(0x03) - if_chr_deadish(CHR_KING3, /*goto*/ 0x2d) - endloop(0x03) - - label(0x2d) - show_hudmsg(CHR_BOND, L_STAT_008) // "Skedar King has been killed." - set_stage_flag(STAGEFLAG_KING3_DEAD) - label(0x0e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_check_end_level[] = { - // Wait for all objectives complete - beginloop(0x03) - if_all_objectives_complete(/*goto*/ 0x2d) - endloop(0x03) - - // Wait 2 seconds - label(0x2d) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x2d) - endloop(0x08) - - // Check Jo not dead - label(0x2d) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2d) - goto_next(0x06) - - // Check Velvet not dead - label(0x2d) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2d) - goto_next(0x06) - - // Mission failed - label(0x2d) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x06) - set_ailist(CHR_SELF, AILIST_OUTRO) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_hide[] = { - label(0x03) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100d_king1_invincible[] = { - beginloop(0x03) - if_chr_in_room(CHR_BOND, 0x00, 0x0070, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0071, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0072, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0073, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0074, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0075, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0076, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0077, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0078, /*goto*/ 0x2d) - if_chr_in_room(CHR_BOND, 0x00, 0x0079, /*goto*/ 0x2d) - set_chr_chrflag(CHR_KING1, CHRCFLAG_INVINCIBLE) - reloop(0x03) - - label(0x2d) - unset_chr_chrflag(CHR_KING1, CHRCFLAG_INVINCIBLE) - endloop(0x03) - - endlist -}; - -u8 unregistered_function[] = { - yield - - // Wait for intro to finish - beginloop(0x58) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x2e) - label(0x2d) - endloop(0x58) - - label(0x2e) - yield - yield - yield - yield - yield - - // Remove Blonde if counterop doesn't exist - label(0x03) - if_chr_death_animation_finished(CHR_ANTI, /*goto*/ 0x2d) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2d) - remove_chr(CHR_BLONDE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_INTRO) - set_chr_hiddenflag(CHR_ANTI, CHRHFLAG_00020000) - set_chr_hiddenflag(CHR_BLONDE, CHRHFLAG_00020000) - camera_movement(ANIM_CUT_STAT_INTRO_CAM) - cmd0175(60) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - unset_chr_chrflag(CHR_MAIAN1, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_MAIAN1, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN1, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN1, 4) - - unset_chr_chrflag(CHR_MAIAN2, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_MAIAN2, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN2, 4) - - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_PHOENIX, WEAPON_NONE) - - // Wait 200 frames (3.3 secs) or until button pressed - beginloop(0x96) - if_controller_button_pressed(/*goto*/ 0x82) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x96) - - // Timer expired - play a sound (explosion?) - label(0x06) - play_sound(SFX_MAIAN_05E2, CHANNEL_10) - - // Wait for camera to finish or button to be pressed - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x82) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x82) - label(0x2d) - endloop(0x08) - - // Outro done - label(0x82) - mute_channel(CHANNEL_10) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ANTI, CHRHFLAG_00020000) - - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN1, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(CHR_MAIAN3, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN3, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN3, 2) - - unset_chr_chrflag(CHR_MAIAN4, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN4, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_INTRO_MAIAN3, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN4, 2) - - set_ailist(CHR_MAIAN1, AILIST_INIT_MAIAN) - set_ailist(CHR_MAIAN2, AILIST_INIT_MAIAN) - stop_cutscene_track - stop_ambient_track - enter_firstperson - yield - label(0x2d) - set_ailist(CHR_SELF, AILIST_BLOW_MINES) - endlist -}; - -u8 func040b_outro[] = { - set_invincible(CHR_BOND) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_OUTRO) - camera_movement(ANIM_CUT_STAT_OUTRO_CAM) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - - unset_chr_chrflag(CHR_MAIAN3, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_MAIAN3, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN3, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_OUTRO_MAIAN1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN3, 4) - - unset_chr_chrflag(CHR_MAIAN4, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_MAIAN4, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN4, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_OUTRO_MAIAN2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN4, 4) - - unset_chr_chrflag(CHR_MAIAN5, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_MAIAN5, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_MAIAN5, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_STAT_OUTRO_MAIAN3, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_MAIAN5, 4) - - show_nonessential_chrs(FALSE) - - // Wait 10 frames or for button press - restart_timer - - beginloop(0x96) - if_controller_button_pressed(/*goto*/ 0x82) - if_timer_gt(10, /*goto*/ 0x06) - endloop(0x96) - - // Play sound - label(0x06) - play_sound(SFX_MAIAN_05E3, CHANNEL_10) - - // Wait 70 frames or for button press - beginloop(0x97) - if_controller_button_pressed(/*goto*/ 0x82) - if_timer_gt(70, /*goto*/ 0x06) - endloop(0x97) - - // Play sound - label(0x06) - play_sound(SFX_MAIAN_05E5, CHANNEL_10) - - // Wait 180 frames or for button press - beginloop(0x98) - if_controller_button_pressed(/*goto*/ 0x82) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x98) - - // Play sound - label(0x06) - play_sound(SFX_MAIAN_05E7, CHANNEL_10) - - // Wait for outro to finish - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2d) - goto_next(0x82) - label(0x2d) - if_controller_button_pressed(/*goto*/ 0x82) - label(0x2d) - endloop(0x08) - - label(0x82) - label(0x06) - mute_channel(CHANNEL_10) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100f_blow_mines[] = { - yield - - #define wait(loopid) \ - restart_timer \ - \ - beginloop(loopid) \ - if_timer_gt(120, /*goto*/ 0x2d) \ - endloop(loopid) \ - \ - label(0x2d) - - wait(0x94) - destroy_object(OBJ_MINE6) - wait(0x95) - destroy_object(OBJ_MINE1) - wait(0x8f) - destroy_object(OBJ_MINE2) - wait(0x90) - destroy_object(OBJ_MINE3) - wait(0x91) - destroy_object(OBJ_MINE4) - wait(0x92) - destroy_object(OBJ_MINE5) - wait(0x93) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_init_lighting[] = { - yield - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0015, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0016, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0017, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0018, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0019, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x001f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0020, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0021, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0021, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0022, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0022, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0023, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0023, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0031, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0040, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0041, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0042, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0043, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0044, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0045, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0046, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0047, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0049, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0049, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x004a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0048, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x004f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0058, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0059, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1000_counterop, 0x1000 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1003_spawn_maians, 0x1003 }, - { func1004_spawn_king1_skedar, 0x1004 }, - { func1005_check_leader_dead, 0x1005 }, - { func1007_check_end_level, 0x1007 }, - { func1008_spawn_king2_skedar, 0x1008 }, - { func1009_check_king1_dead, 0x1009 }, - { func100a_check_king2_dead, 0x100a }, - { func100b_check_king3_dead, 0x100b }, - { func100c_spawn_king3_skedar, 0x100c }, - { func100d_king1_invincible, 0x100d }, - { func100f_blow_mines, 0x100f }, - { func1010_init_lighting, 0x1010 }, - { func100f_blow_mines, 0x040d }, - { func040c_hide, 0x040c }, - { func0401_defend, 0x0401 }, - { func0402_init_king, 0x0402 }, - { func0403_init_maian_leader, 0x0403 }, - { func0404_maian, 0x0404 }, - { func0405_init_maian, 0x0405 }, - { func0406_skedar, 0x0406 }, - { func0407_king1_skedar, 0x0407 }, - { func0408_king2_skedar, 0x0408 }, - { func0409_king3_skedar, 0x0409 }, - { func1002_intro, 0x040a }, - { func040b_outro, 0x040b }, - { func1002_intro, 0x0c00 }, - { func040b_outro, 0x0c01 }, - { NULL, 0 }, -}; diff --git a/src/setups/setuptra.c b/src/setups/setuptra.c index 4fad1578b..abe0a2f56 100644 --- a/src/setups/setuptra.c +++ b/src/setups/setuptra.c @@ -105,7 +105,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -613,3298 +613,6 @@ s32 intro[] = { endintro }; -u8 func1400_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - yield - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1022_gas_damage_bond[] = { - set_target_chr(CHR_BOND) - set_ailist(CHR_SELF, AILIST_GAS_DAMAGE) - endlist -}; - -u8 func1023_gas_damage_coop[] = { - set_target_chr(CHR_COOP) - if_chr_death_animation_finished(CHR_TARGET, /*goto*/ 0x32) - set_ailist(CHR_SELF, AILIST_GAS_DAMAGE) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0401_gas_damage[] = { - beginloop(0x12) - if_stage_flag_eq(STAGEFLAG_INTRO_DONE, TRUE, /*goto*/ 0x32) - endloop(0x12) - - label(0x32) - restart_timer - - beginloop(0x04) - if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x008f, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0090, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0092, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0093, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0094, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0095, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0096, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0097, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0098, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - restart_timer - - // @bug: Only Jo gets motion blur? - label(0x08) - yield - call_rng - if_rand_gt(50, /*goto*/ 0x32) - add_motion_blur(CHR_BOND, 7, TRUE) - label(0x32) - if_timer_lt(460, /*goto*/ 0x32) - restart_timer - damage_chr_by_amount(CHR_TARGET, 2, 2) - label(0x32) - if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x008f, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0090, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0092, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0093, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0094, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0095, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0096, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0097, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0098, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x0099, /*goto*/ 0x06) - if_chr_in_room(CHR_TARGET, 0x00, 0x009a, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - goto_first(0x08) - - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_jon_msgs_gravedanger[] = { - beginloop(0x0d) - if_stage_flag_eq(STAGEFLAG_INTRO_DONE, TRUE, /*goto*/ 0x32) - endloop(0x0d) - - label(0x32) - restart_timer - - beginloop(0x04) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - restart_timer -#if VERSION >= VERSION_NTSC_1_0 - speak(CHR_BOND, L_TRA_014, SFX_814F, CHANNEL_4, COLOR_03_RED) // "Joanna - this is Jonathan. You're in grave danger." -#else - speak(CHR_BOND, L_TRA_014, SFX_814C, CHANNEL_4, COLOR_03_RED) // "Joanna - this is Jonathan. You're in grave danger." -#endif - - beginloop(0x08) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_015, SFX_8150, CHANNEL_4, COLOR_03_RED) // "They've flooded the area with nerve gas." - - beginloop(0x09) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_016, SFX_8151, CHANNEL_4, COLOR_03_RED) // "Get our friend to the containment lab. There's a h..." - - beginloop(0x0a) - if_timer_gt(270, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_017, SFX_8152, CHANNEL_4, COLOR_03_RED) // "I'll contact you when you get there - good luck!" - - beginloop(0x0c) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_jon_msgs_meetup[] = { - beginloop(0x04) - if_object_in_room(OBJ_HOVERBED, 0x00df, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_ELVIS_STASHED) - mute_channel(CHANNEL_0) -#if VERSION >= VERSION_NTSC_1_0 - unset_object_flag2(0x0d, OBJFLAG2_LOCKEDFRONT) -#endif - set_object_flag2(0x0d, OBJFLAG2_LOCKEDBACK) - unlock_door(0x0d, 0x20) - release_grabbed_object(CHR_BOND) - yield - unset_object_flag3(OBJ_HOVERBED, OBJFLAG3_GRABBABLE) - unset_object_flag3(OBJ_HOVERBED, OBJFLAG3_PUSHABLE) - restart_timer - speak(CHR_BOND, L_TRA_018, SFX_8153, CHANNEL_4, COLOR_03_RED) // "Good work, Jo. We need to meet up. They're getting..." - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_019, SFX_8154, CHANNEL_4, COLOR_03_RED) // "Use the maintenance hatch I've opened in one of th..." - - beginloop(0x09) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_stage_flag(STAGEFLAG_JON_SAID_MAINT_HATCH) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_check_medpack_collected[] = { - beginloop(0x04) - if_chr_has_object(CHR_BOND, OBJ_MEDPACK_BOND, /*goto*/ 0x06) - if_chr_has_object(CHR_COOP, OBJ_MEDPACK_BOND, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_COLLECTED_MEDPACK) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0403_init_jonathan[] = { - set_self_chrflag(CHRCFLAG_PUSHABLE) - set_self_chrflag(CHRCFLAG_NOAUTOAIM) - if_difficulty_gt(DIFF_A, /*goto*/ 0x32) - - // Agent only - beginloop(0x0d) - chr_move_to_pad(CHR_JONATHAN, PAD_TRA_0398, 0x00, /*goto*/ 0x32) - endloop(0x0d) - - // All difficulties - label(0x32) - add_health_or_armor(1200) - set_alertness(150) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_JONATHAN_WAITING_FOR_MEETUP) - endlist -}; - -u8 func0402_jonathan_waiting_for_meetup[] = { - set_shotlist(AILIST_JONATHAN_WAITING_FOR_MEETUP) - if_chr_deadish(CHR_SELF, /*goto*/ 0x32) - goto_next(0x67) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x67) - set_self_flag_bankx(CHRFLAG0_CAMP, BANK_0) - set_self_chrflag(CHRCFLAG_RUNFASTER) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x06) - endloop(0x04) - - label(0x06) - lock_door(0x0d, 0x20) - lock_door(0x33, 0x20) - lock_door(0x34, 0x20) - speak(CHR_P1P2, L_TRA_025, MP3_02B3, CHANNEL_4, COLOR_03_RED) // "Joanna - over here." - label(0x08) - restart_timer - do_preset_animation(PRESETANIM_TALK3) - - beginloop(0x09) - if_within_targets_fovx_by_angle(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x0a) - - beginloop(0x0a) - if_sound_finished(CHANNEL_4, /*goto*/ 0x32) - reloop(0x0a) - - label(0x32) - if_timer_lt(150, /*goto*/ 0x32) - if_distance_to_target_lt(300, /*goto*/ 0x06) - label(0x32) - endloop(0x0a) - - label(0x06) - speak(CHR_P1P2, L_TRA_026, MP3_02B4, CHANNEL_4, COLOR_03_RED) // "We need to get back to our friend." - set_stage_flag(STAGEFLAG_MET_JON) - do_preset_animation(PRESETANIM_TALKRANDOM) - restart_timer - - beginloop(0x0c) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - stop_chr - set_ailist(CHR_SELF, AILIST_JONATHAN_FOLLOWING_AND_MINE) - endlist -}; - -u8 func0404_jonathan_following_and_mine[] = { -#define LABEL_FOLLOW 0x5a - - set_chr_team(CHR_SELF, TEAM_ALLY) - yield - rebuild_teams - rebuild_squadrons - set_returnlist(CHR_SELF, AILIST_JONATHAN_FOLLOWING_AND_MINE) - set_shotlist(AILIST_JONATHAN_FOLLOWING_AND_MINE) - if_chr_deadish(CHR_SELF, /*goto*/ 0x32) - goto_next(0x06) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x32) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x0d) - label(0x32) - goto_next(0x63) - - // Alive - label(0x06) - restart_timer - - beginloop(0x64) - if_chr_stopped(/*goto*/ 0x63) - endloop(0x64) - - label(0x63) - if_stage_flag_eq(STAGEFLAG_JON_SHOT_WHILE_PLANTING, TRUE, /*goto*/ 0x0e) - set_target_chr(CHR_P1P2) - - label(LABEL_FOLLOW) - if_distance_to_target_gt(200, /*goto*/ 0x5c) - - // distance <= 200 (waiting) - stop_chr - restart_timer - - beginloop(0x5b) - label(0x32) - if_can_see_target(/*goto*/ 0x06) - goto_next(0x5c) - - label(0x06) - if_distance_to_target_gt(200, /*goto*/ 0x5c) - endloop(0x5b) - - // distance > 200 - label(0x5c) - restart_timer - if_distance_to_target_lt(300, /*goto*/ 0x32) - - // distance >= 300 - try_run_to_target(/*goto*/ 0x5d) - - // distance > 200 and distance < 300 - label(0x32) - try_walk_to_target(/*goto*/ 0x5d) - - // Moving towards Jo - label(0x5d) - restart_timer - yield - - label(0x06) - if_enemy_distance_lt_and_los(1500, /*goto*/ 0x09) - - // distance >= 1500 and no line of sight - // Note the timer check is pointless here because it is restarted in - // each loop iteration. - label(0x32) - set_target_chr(CHR_P1P2) - if_distance_to_target_lt(200, /*goto*/ 0x5e) - if_timer_gt(120, /*goto*/ 0x5e) - if_chr_stopped(/*goto*/ 0x5e) - goto_first(0x5d) - - label(0x5e) - if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x32) - if_stage_flag_eq(STAGEFLAG_JON_ENTERED_MINE_ROOM, TRUE, /*goto*/ 0x32) - if_chr_in_room(CHR_JONATHAN, 0x00, 0x00dc, /*goto*/ 0x0a) - if_chr_in_room(CHR_JONATHAN, 0x00, 0x00dd, /*goto*/ 0x0a) - goto_first(LABEL_FOLLOW) - - // Unreachable - if_chr_in_room(CHR_P1P2, 0x00, 0x00dc, /*goto*/ 0x0a) - if_chr_in_room(CHR_P1P2, 0x00, 0x00dd, /*goto*/ 0x0a) - - label(0x32) - goto_first(LABEL_FOLLOW) - - // Saw enemy - label(0x09) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // In mine room - label(0x0a) - unset_self_chrflag(CHRCFLAG_PUSHABLE) - set_stage_flag(STAGEFLAG_JON_ENTERED_MINE_ROOM) - speak(CHR_P1P2, L_TRA_027, MP3_02B5, CHANNEL_4, COLOR_03_RED) // "Right, we're near. Cover me, Jo..." - set_shotlist(AILIST_JONATHAN_SHOT_WHILE_PLANTING) - label(0x0b) - jog_to_pad(PAD_TRA_038B) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - play_x_track(XREASON_DEFAULT, 10, 30) - restart_timer - try_face_entity(ATTACKFLAG_AIMATPAD, 0x0173, /*goto*/ 0xc4) - - beginloop(0xc4) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0xc4) - - label(0x06) - restart_timer - set_stage_flag(STAGEFLAG_JON_PLANTING_EXPLOSIVES) - - label(0xc2) - call_rng - if_rand_lt(86, /*goto*/ 0x6a) - if_rand_lt(172, /*goto*/ 0x6b) - chr_do_animation(ANIM_OPERATE_0204, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x0e) - - label(0x6a) - chr_do_animation(ANIM_OPERATE_0205, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - goto_next(0x0e) - - label(0x6b) - chr_do_animation(ANIM_OPERATE_0206, -1, -1, CHRANIMFLAG_SLOWUPDATE, 10, CHR_SELF, 2) - - label(0x0e) - set_shotlist(AILIST_JONATHAN_SHOT_WHILE_PLANTING) - resume_timer - unset_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - - // Mine planting loop (33.3 seconds) - beginloop(0x0d) - if_timer_gt(2000, /*goto*/ 0x06) - if_chr_idle(/*goto*/ 0x32) - goto_first(0xc2) - - label(0x32) - endloop(0x0d) - - label(0x06) - set_shotlist(AILIST_JONATHAN_FOLLOWING_AND_MINE) - set_stage_flag(STAGEFLAG_JON_FINISHED_EXPLOSIVES) - unset_stage_flag(STAGEFLAG_JON_SHOT_WHILE_PLANTING) - set_self_chrflag(CHRCFLAG_PUSHABLE) - speak(CHR_P1P2, L_TRA_028, MP3_02B6, CHANNEL_4, COLOR_03_RED) // "Okay - stand back." - run_to_pad(PAD_TRA_0140) - - beginloop(0x0f) - if_chr_stopped(/*goto*/ 0x12) - endloop(0x0f) - - label(0x12) - stop_chr - - beginloop(0x10) - if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x06) - endloop(0x10) - - label(0x06) - unlock_door(0x0a, 0x02) - speak(CHR_P1P2, L_TRA_032, MP3_02B7, CHANNEL_4, COLOR_03_RED) // "Okay, Jo - let's go." - restart_timer - - beginloop(0x11) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x11) - - label(0x06) - goto_first(LABEL_FOLLOW) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0413_jonathan_hangar[] = { - set_returnlist(CHR_SELF, AILIST_JONATHAN_HANGAR) - set_shotlist(AILIST_JONATHAN_HANGAR) - if_chr_deadish(CHR_SELF, /*goto*/ 0x32) - goto_next(0x06) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x32) - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x63) - - // Injured - label(0x06) - restart_timer - - beginloop(0x64) - if_chr_stopped(/*goto*/ 0x63) - endloop(0x64) - - // Attack enemy (jumped to from further below) - label(0x09) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - - // Alive and well - label(0x63) - set_target_chr(CHR_P1P2) - label(0x12) - jog_to_pad(PAD_TRA_015F) - - beginloop(0x13) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x32) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_distance_to_pad_lt(CHR_SELF, 3510, PAD_TRA_001E, /*goto*/ 0x06) -#endif - if_chr_stopped(/*goto*/ 0x06) - endloop(0x13) - - label(0x32) - goto_first(0x09) - - // Waiting at pad - label(0x06) - set_stage_flag(STAGEFLAG_JON_WAITING_AT_UFO) - stop_chr - set_target_chr(CHR_P1P2) - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x14) - - // Wait until both Joanna and Elvis within 400 units - beginloop(0x14) - set_target_chr(CHR_ELVIS) - if_distance_to_target_gt(400, /*goto*/ 0x32) - set_target_chr(CHR_P1P2) - if_distance_to_target_gt(400, /*goto*/ 0x32) - if_target_in_sight(/*goto*/ 0x06) - label(0x32) - endloop(0x14) - - // Start conversation - label(0x06) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - restart_timer - chr_do_animation(ANIM_TALKING_0232, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_ELVIS, 2) - speak(CHR_P1P2, L_TRA_059, MP3_029A, CHANNEL_5, COLOR_06_WHITE) // "Oh, no! We have a problem. It's a single seater!" - - beginloop(0x7d) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x7d) - - label(0x32) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x7d) - - label(0x06) - restart_timer - chr_do_animation(ANIM_TALKING_0233, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_ELVIS, 2) - speak(CHR_P1P2, L_TRA_060, MP3_029B, CHANNEL_5, COLOR_06_WHITE) // "Two can get in but no more." - - beginloop(0x7e) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x7e) - - label(0x32) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x7e) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_041, MP3_02A7, CHANNEL_5, COLOR_09_BLUE) // "It's the only way out of here." - - beginloop(0x15) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x15) - - label(0x32) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x15) - - label(0x06) - restart_timer - chr_do_animation(ANIM_TALKING_0232, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_ELVIS, 2) - speak(CHR_P1P2, L_TRA_061, MP3_029C, CHANNEL_5, COLOR_06_WHITE) // "Plus, it's got no style, you know what I'm saying?" - - beginloop(0x7f) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x7f) - - label(0x32) - if_timer_gt(200, /*goto*/ 0x06) - endloop(0x7f) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_042, MP3_02A8, CHANNEL_5, COLOR_09_BLUE) // "You're the only one who can fly it, Elvis, so get ..." - - beginloop(0x17) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - endloop(0x17) - - label(0x32) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x17) - - label(0x06) - restart_timer - chr_do_animation(ANIM_TALKING_0231, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_JONATHAN, 2) - speak(CHR_P1P2, L_TRA_045, MP3_02B9, CHANNEL_5, COLOR_03_RED) // "One of us will have to stay behind and open the ha..." - - beginloop(0x1a) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x1a) - - label(0x32) - if_timer_gt(240, /*goto*/ 0x06) - endloop(0x1a) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_043, MP3_02A9, CHANNEL_5, COLOR_09_BLUE) // "But we can't leave you behind." - - beginloop(0x18) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x18) - - label(0x32) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x18) - - label(0x06) - restart_timer - speak(CHR_BOND, L_TRA_044, MP3_02AA, CHANNEL_5, COLOR_09_BLUE) // "There must be a way out of here." - - beginloop(0x19) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0xc3) - if_sound_finished(CHANNEL_5, /*goto*/ 0x32) - reloop(0x19) - - label(0x32) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x19) - - label(0x06) - restart_timer - chr_do_animation(ANIM_TALKING_0232, -1, 200, CHRANIMFLAG_MOVEWHENINVIS, 0, CHR_JONATHAN, 2) - speak(CHR_P1P2, L_TRA_046, MP3_02BA, CHANNEL_5, COLOR_03_RED) // "I'll get out on that hoverbike. Cover me while I o..." - - beginloop(0x1b) - if_timer_gt(120, /*goto*/ 0x66) - reloop(0x1b) - - label(0x66) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) - set_ailist(CHR_ELVIS, AILIST_ELVIS_GO_TO_UFO) - - label(0x06) - set_stage_flag(STAGEFLAG_HANGAR_CONVERSATION_FINISHED) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - restart_timer - jog_to_pad(PAD_TRA_016F) - - // Once Jon starts jogging, 4 seconds will pass before he starts checking - // other things. One of these is a Y check, where the X music will start - // once he's a certain way up the ramp. The other is a distance to Jo check - // where she'll take over. - beginloop(0x1c) - if_timer_lt(240, /*goto*/ 0x32) - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x32) - if_chr_y(CHR_SELF, -600, OPERATOR_GREATER_THAN, /*goto*/ 0x33) - set_target_chr(CHR_P1P2) - if_distance_to_target_lt(300, /*goto*/ 0x59) - label(0x32) - if_chr_stopped(/*goto*/ 0x06) - reloop(0x1c) - - // Jon is up the ramp - label(0x33) - set_stage_flag(STAGEFLAG_HANGAR_X_MUSIC_STARTED) - play_x_track(XREASON_DEFAULT, 10, 90) - run_to_pad(PAD_TRA_016F) - set_stage_flag(STAGEFLAG_HANGAR_X_MUSIC_STARTED) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x1c) - - // At first terminal - label(0x06) - chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x1d) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x1d) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x32) - set_stage_flag(STAGEFLAG_INNER_DOOR_OPENING) - open_door(0x2c) - open_door(0x2d) - set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) - show_hudmsg(CHR_P1P2, L_TRA_039) // "Inner hangar door is opening." - - label(0x32) - set_self_flag_bankx(CHRFLAG0_FORCESAFETYCHECKS, BANK_0) - run_to_pad(PAD_TRA_0171) - - beginloop(0x1e) - if_chr_distance_to_pad_lt(CHR_SELF, 3690, PAD_TRA_0014, /*goto*/ 0x06) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x1e) - - // At second terminal - label(0x06) - chr_do_animation(ANIM_OPERATE_0204, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x1f) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x1f) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x20) - set_stage_flag(STAGEFLAG_OUTER_DOOR_OPENING) - open_door(0x2e) - open_door(0x2f) - set_object_flag(0x2e, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2f, OBJFLAG_DOOR_KEEPOPEN) - show_hudmsg(CHR_P1P2, L_TRA_037) // "Outer hangar door is opening." - - beginloop(0x20) - set_ailist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) - endloop(0x20) - - // Jo taking over - label(0x59) - speak(CHR_BOND, L_TRA_047, MP3_02AC, CHANNEL_5, COLOR_09_BLUE) // "Jonathan, go with Elvis. I'll see to the consoles." - restart_timer - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x46) - - beginloop(0x46) - if_target_in_fov_left(10, /*goto*/ 0x06) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x46) - - label(0x06) - restart_timer - - beginloop(0x4a) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x4a) - - label(0x06) - set_stage_flag(STAGEFLAG_JO_DOING_TERMINALS) - set_stage_flag(STAGEFLAG_HANGAR_X_MUSIC_STARTED) - play_x_track(XREASON_DEFAULT, 10, 90) - set_ailist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) - - // Elvis dead - label(0xc3) - set_returnlist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) - set_ailist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) - endlist -}; - -u8 func041c_elvis_go_to_ufo[] = { - set_returnlist(CHR_SELF, AILIST_ELVIS_GO_TO_UFO) - set_shotlist(AILIST_ELVIS_GO_TO_UFO) - if_chr_deadish(CHR_SELF, /*goto*/ 0x32) - goto_next(0x06) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - run_to_pad(PAD_TRA_03FE) - - beginloop(0x08) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x08) - - label(0x06) - stop_chr - - beginloop(0x6a) - endloop(0x6a) - - endlist -}; - -u8 func041b_jonathan_after_terminals[] = { - set_returnlist(CHR_SELF, AILIST_JONATHAN_AFTER_TERMINALS) - set_shotlist(AILIST_JONATHAN_AFTER_TERMINALS) - if_chr_deadish(CHR_SELF, /*goto*/ 0x32) - goto_next(0x06) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - run_to_pad(PAD_TRA_015F) // conversation corner - - beginloop(0x4b) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_distance_to_pad_lt(CHR_SELF, 3510, PAD_TRA_0014, /*goto*/ 0x06) -#endif - if_chr_stopped(/*goto*/ 0x06) - endloop(0x4b) - - label(0x06) - jog_to_pad(PAD_TRA_0168) // corner near ramp - - beginloop(0x4c) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x09) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x4c) - - label(0x06) - stop_chr - - beginloop(0x4d) - if_enemy_distance_lt_and_los(2540, /*goto*/ 0x09) - endloop(0x4d) - - label(0x09) - set_ailist(CHR_SELF, GAILIST_COMBAT_WITH_TARGET) - endlist -}; - -u8 func0405_jonathan_shot_while_planting[] = { - set_stage_flag(STAGEFLAG_JON_SHOT_WHILE_PLANTING) - label(0x04) - pause_timer - if_just_injured(CHR_SELF, /*goto*/ 0x06) - goto_next(0x63) - - // Injured - label(0x06) - restart_timer - - beginloop(0x64) - if_self_flag_bankx_eq(CHRFLAG0_SAID_INJURY_QUIP, TRUE, BANK_0, /*goto*/ 0x06) - if_num_times_shot_lt(1, /*goto*/ 0x06) - if_timer_lt(20, /*goto*/ 0x06) - speak(CHR_P1P2, L_TRA_051, SFX_8155, CHANNEL_5, COLOR_03_RED) // "Damn it, Joanna... cover me!" - set_self_flag_bankx(CHRFLAG0_SAID_INJURY_QUIP, BANK_0) - label(0x06) - if_chr_stopped(/*goto*/ 0x63) - endloop(0x64) - - // Not injured, or recovered - label(0x63) - label(0x0b) - walk_to_pad(PAD_TRA_038B) - - beginloop(0x0c) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x0c) - - label(0x06) - try_face_entity(ATTACKFLAG_AIMATPAD, 0x0173, /*goto*/ 0xc4) - - beginloop(0xc4) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0xc4) - - label(0x06) - set_shotlist(AILIST_JONATHAN_FOLLOWING_AND_MINE) - set_ailist(CHR_SELF, AILIST_JONATHAN_FOLLOWING_AND_MINE) - endlist -}; - -/** - * @unused - */ -u8 func0406_unused_0406[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_alertness(100) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * Waits until the meetup with Jon is done and the player is in the hallway. - * Spawns 15 guards total, maximum 4 alive at any time. Every 60 seconds, checks - * to see whether it should spawn more. Stops once 15 have been spawned or Jon - * has finished planting the explosives. - */ -u8 func1008_spawngroup1[] = { - // Wait until meeting done and player in the T-junction corridor - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_chr_in_room(CHR_P1P2, 0x00, 0x003f, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_morale(15) - - beginloop(0x5f) - // Keep doing this until explosives finished, or 15 guards spawned - if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x06) - if_morale_lt(1, /*goto*/ 0x06) - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_00C7, AILIST_SPAWNGROUP1_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - reloop(0x5f) - - // Spawned a guard - label(0x60) - yield - if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x06) - subtract_morale(1) - if_num_chrs_in_squadron_gt(3, SPAWNGROUP1, /*goto*/ 0x32) - reloop(0x5f) - - label(0x32) - restart_timer - - beginloop(0x08) - if_timer_gt(3600, /*goto*/ 0x32) - endloop(0x08) - - label(0x32) - endloop(0x5f) - - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_spawngroup1_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_squadron(SPAWNGROUP1) - run_to_pad(PAD_TRA_013E) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) - endlist -}; - -/** - * Spawns 12 guards while Jon is planing the explosives. Maximum 4 alive at any - * time. No delay between them; once one dies another is immediately spawned. - * Location is spawned guard is one of 2 places, 50% chance of each. Spawning - * stops when wall explodes. - */ -u8 func1013_spawngroup2[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_JON_PLANTING_EXPLOSIVES, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_morale(12) - - beginloop(0x5f) - if_morale_lt(1, /*goto*/ 0x06) - call_rng - if_rand_gt(128, /*goto*/ 0x32) - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0144, AILIST_SPAWNGROUP2_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - goto_next(0x06) - - label(0x32) - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0138, AILIST_SPAWNGROUP2_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - goto_next(0x06) - - label(0x60) - yield - if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x06) - subtract_morale(1) - rebuild_teams - rebuild_squadrons - label(0x08) - yield - if_stage_flag_eq(STAGEFLAG_WALL_EXPLODED, TRUE, /*goto*/ 0x06) - if_num_chrs_in_squadron_gt(4, SPAWNGROUP2, /*goto*/ 0x32) - call_rng - if_rand_gt(5, /*goto*/ 0x32) - endloop(0x5f) - - label(0x32) - goto_first(0x08) - - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1013_spawngroup2_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_squadron(SPAWNGROUP2) - rebuild_teams - rebuild_squadrons -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * SA/PA only. Waits until medpack is started, then spawns up to 4 guards. - * - * The intended behavior is to spawn them all pretty much immediately with a - * random delay in between, then wait for them all to be dead, then complete the - * medpack. But two errors make make this not work as intended. - * - * The first error is that if any spawn fails (eg. due to the player looking at - * the pad) then the ailist jumps straight to the end where it waits for the - * group to be dead, and does not spawn any more guards. - * - * The second error is in the handler for if_all_chrs_in_squadron_are_dead. The - * implementation of this command has a bug which makes it only check if the - * most recently spawned guard is dead. If there are no chrs in the squadron - * (eg. if the first guard fails to spawn) then this check doesn't pass either. - * - * In other words: - * 1) killing the most recently spawned guard will cause the medpack to finish, - * 2) the spawning process stops if any spawn fails due to the player looking at - * the pad, and - * 3) at least one guard must spawn for an early medpack finish. - */ -u8 func1014_spawngroup3[] = { - if_difficulty_lt(DIFF_SA, /*goto*/ 0x32) - goto_next(0x04) - - // Agent - do nothing - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA and PA - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MEDPACK_STARTED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_morale(4) - - beginloop(0x5f) - if_morale_lt(1, /*goto*/ 0x06) - call_rng - if_rand_gt(128, /*goto*/ 0x32) - - // @bug: If either of these fail to spawn, the ailist jumps straight to - // the end rather than attempting to respawn them. - - // Spawn at top of ramp - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0117, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - goto_next(0x06) - - // Spawn in mine room - label(0x32) - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_013E, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - goto_next(0x06) - - // Spawned a guard - label(0x60) - yield - if_stage_flag_eq(STAGEFLAG_ELVIS_REVIVED, TRUE, /*goto*/ 0x06) - subtract_morale(1) - rebuild_teams - rebuild_squadrons - - // Wait for Elvis to be revived, or 5 in 256 chance of spawning another - // guard anyway. Note that the if_num_chrs_in_squadron_gt check can't - // pass because this squadron never has more than 4 chrs in it. - label(0x08) - yield - if_stage_flag_eq(STAGEFLAG_ELVIS_REVIVED, TRUE, /*goto*/ 0x06) - if_num_chrs_in_squadron_gt(6, SPAWNGROUP3, /*goto*/ 0x32) - call_rng - if_rand_gt(5, /*goto*/ 0x32) - endloop(0x5f) - - label(0x32) - goto_first(0x08) - - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - - beginloop(0x0d) - if_all_chrs_in_squadron_are_dead(SPAWNGROUP3, /*goto*/ 0x06) - endloop(0x0d) - - label(0x06) - set_stage_flag(STAGEFLAG_TRIGGER_MEDPACK_FINISH) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1014_spawngroup3_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_squadron(SPAWNGROUP3) - rebuild_teams - rebuild_squadrons -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) -#endif - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -/** - * Start spawning guards when the hangar X music starts. Stop spawning when 12 - * reached, or when both hangar doors are open. - */ -u8 func1015_spawngroup4[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - label(0x06) - set_morale(12) - - beginloop(0x5f) - call_rng - if_rand_gt(128, /*goto*/ 0x32) - - // @bug: This is spawning guards using the same function as the previous - // spawn group. This causes the guards to set their group to spawngroup3 - // which causes the if_num_chrs_in_squadron_gt check further below to - // never pass. - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0140, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - goto_next(0x06) - - label(0x32) - try_spawn_chr_at_pad(BODY_AREA51GUARD, HEAD_RANDOM, PAD_TRA_0117, AILIST_SPAWNGROUP3_GUARD, SPAWNFLAG_00000200, /*goto*/ 0x60) - goto_next(0x06) - - label(0x60) - yield - if_stage_flag_eq(STAGEFLAG_BOTH_HANGAR_DOORS_OPEN, TRUE, /*goto*/ 0x06) - subtract_morale(1) - rebuild_teams - rebuild_squadrons - - label(0x08) - yield - if_morale_lt(1, /*goto*/ 0x06) - if_num_chrs_in_squadron_gt(6, SPAWNGROUP4, /*goto*/ 0x32) - call_rng - if_rand_gt(2, /*goto*/ 0x32) - endloop(0x5f) - - label(0x32) - goto_first(0x08) - - label(0x06) - yield - yield - yield - yield - yield - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func1015_spawngroup4_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - try_equip_weapon(MODEL_CHRSUPERDRAGON, WEAPON_SUPERDRAGON, 0x00000000, /*goto*/ 0x06) - label(0x06) - set_chr_team(CHR_SELF, TEAM_ENEMY) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - set_self_flag_bankx(CHRFLAG0_AIVSAI, BANK_0) - set_squadron(SPAWNGROUP4) - rebuild_teams - rebuild_squadrons - run_to_pad(PAD_TRA_0168) - set_ailist(CHR_SELF, GAILIST_CHOOSE_TARGET) - endlist -}; - -u8 func1009_blow_up_wall[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - restart_timer - - beginloop(0x08) - if_timer_gt(300, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - unset_object_flag(OBJ_WALLMINE, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_WALLMINE, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_WALLOBJECT, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_WALLDOOR, OBJFLAG_INVINCIBLE) - yield - yield - destroy_object(OBJ_WALLMINE) - set_stage_flag(STAGEFLAG_WALL_EXPLODED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_check_hangar_accessed[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x00e7, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - set_stage_flag(STAGEFLAG_ENTERED_HANGAR) - show_hudmsg(CHR_P1P2, L_TRA_031) // "The secret hangar has been located." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100b_check_jonathan_dead[] = { - if_difficulty_lt(DIFF_PA, /*goto*/ 0x32) - goto_next(0x04) - - // A and SA - label(0x32) - give_object_to_chr(OBJ_MEDPACK_BOND, CHR_BOND) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x32) - give_object_to_chr(OBJ_MEDPACK_COOP, CHR_COOP) - goto_next(0x04) - - label(0x32) - disable_object(OBJ_MEDPACK_COOP) - - // All difficulties - beginloop(0x04) - if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_STARTED_OUTRO, TRUE, /*goto*/ 0x32) - show_hudmsg(CHR_BOND, L_TRA_029) // "Jonathan has been killed." - set_stage_flag(STAGEFLAG_JON_DEAD) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_medpack_activation[] = { - beginloop(0x67) - if_stage_flag_eq(STAGEFLAG_ENTERED_HANGAR, TRUE, /*goto*/ 0x04) - endloop(0x67) - - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0c) - if_chr_activated_object(CHR_P1P2, OBJ_HOVERBED, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_AUTOSURGEON, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - set_stage_flag(STAGEFLAG_MEDPACK_STARTED) - show_hudmsg(CHR_P1P2, L_TRA_033) // "Alien medpack activated." -#if VERSION >= VERSION_NTSC_1_0 - assign_sound(SFX_814C, CHANNEL_7) -#else - assign_sound(SFX_043C, CHANNEL_7) -#endif - control_sound_from_object(CHANNEL_7, OBJ_HOVERBED, TRUE) - restart_timer - - beginloop(0x12) - if_timer_gt(120, /*goto*/ 0x32) - endloop(0x12) - - label(0x32) -#if VERSION >= VERSION_NTSC_1_0 - assign_sound(SFX_814D, CHANNEL_7) -#else - assign_sound(SFX_047C, CHANNEL_7) -#endif - control_sound_from_object(CHANNEL_7, OBJ_HOVERBED, TRUE) - restart_timer - - beginloop(0x08) - if_timer_gt(2000, /*goto*/ 0x09) - if_stage_flag_eq(STAGEFLAG_TRIGGER_MEDPACK_FINISH, TRUE, /*goto*/ 0x09) - endloop(0x08) - - label(0x09) - mute_channel(CHANNEL_7) -#if VERSION >= VERSION_NTSC_1_0 - assign_sound(SFX_814E, CHANNEL_7) -#else - assign_sound(SFX_043D, CHANNEL_7) -#endif - control_sound_from_object(CHANNEL_7, 0x00, TRUE) - show_hudmsg(CHR_P1P2, L_TRA_035) // "Alien medpack has been administered." - yield - - beginloop(0x0c) -#if VERSION >= VERSION_NTSC_1_0 - chr_toggle_p1p2(CHR_SELF) -#endif - if_chr_in_room(CHR_P1P2, 0x00, 0x00df, /*goto*/ 0x32) - endloop(0x0c) - - label(0x32) - if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x32) - if_chr_deadish(CHR_BOND, /*goto*/ 0x33) - goto_next(0x06) - - // Joanna is dead - label(0x33) - if_chr_deadish(CHR_COOP, /*goto*/ 0x32) - goto_next(0x06) - - // Everyone is alive - label(0x06) - set_ailist(CHR_JONATHAN, GAILIST_IDLE) - set_ailist(CHR_ELVIS, GAILIST_IDLE) - set_ailist(CHR_SELF, 0x0411) - - // Jonathan is dead - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0412_init_elvis[] = { - stop_chr -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_PUSHABLE) -#endif - set_stage_flag(STAGEFLAG_ELVIS_REVIVED) - label(0x0a) - label(0x06) - add_health_or_armor(200) - set_chr_maxdamage(CHR_SELF, 1) - set_ailist(CHR_SELF, AILIST_ELVIS_FOLLOW) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040b_elvis_follow[] = { - set_target_chr(CHR_JONATHAN) - - label(0x5a) - restart_timer - - beginloop(0x5b) - // @bug: The pad and distance arguments are swapped here, so this is - // actually checking if Elvis is within 3510 units of pad 0x1e. This - // pad is up near the start of Infiltration so this will never pass. -#if VERSION >= VERSION_NTSC_1_0 - if_chr_distance_to_pad_lt(CHR_SELF, 3510, 30, /*goto*/ 0x08) -#else - if_chr_distance_to_pad_lt(CHR_SELF, 3510, 20, /*goto*/ 0x08) -#endif - if_can_see_target(/*goto*/ 0x06) - goto_next(0x5c) - - label(0x06) - if_distance_to_target_gt(200, /*goto*/ 0x5c) - endloop(0x5b) - - label(0x5c) - restart_timer - try_run_to_target(/*goto*/ 0x5d) - - label(0x5d) - restart_timer - yield - label(0x06) -#if VERSION >= VERSION_NTSC_1_0 - if_chr_distance_to_pad_lt(CHR_SELF, 300, PAD_TRA_015F, /*goto*/ 0x08) -#else - if_chr_distance_to_pad_lt(CHR_SELF, 200, PAD_TRA_015F, /*goto*/ 0x08) -#endif - label(0x32) - set_target_chr(CHR_JONATHAN) - if_distance_to_target_lt(200, /*goto*/ 0x5e) - if_timer_gt(120, /*goto*/ 0x5e) - if_chr_stopped(/*goto*/ 0x5e) - goto_first(0x5d) - - label(0x5e) - goto_first(0x5a) - - label(0x08) - stop_chr - - beginloop(0x09) - endloop(0x09) - - endlist -}; - -u8 func100f_terminals[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, OBJ_TERMINAL1, /*goto*/ 0x08) - if_chr_activated_object(CHR_P1P2, OBJ_TERMINAL2, /*goto*/ 0x0a) - reloop(0x04) - - // Terminal 1 - label(0x08) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_TERMINAL1, TRUE) - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x32) - show_hudmsg(CHR_P1P2, L_TRA_080) // "Console is not active." - goto_next(0x0f) - - // Terminal 1 active - label(0x32) - if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x0f) - show_hudmsg(CHR_P1P2, L_TRA_039) // "Inner hangar door is opening." - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, FALSE, /*goto*/ 0x32) - set_stage_flag(STAGEFLAG_INNER_DOOR_OPENING) - label(0x32) - open_door(0x2c) - open_door(0x2d) - set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) - reloop(0x04) - - // Terminal 2 - label(0x0a) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_TERMINAL2, TRUE) - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x32) - show_hudmsg(CHR_P1P2, L_TRA_080) // "Console is not active." - goto_next(0x0f) - - // Terminal 2 active - label(0x32) - if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x0f) - show_hudmsg(CHR_P1P2, L_TRA_037) // "Outer hangar door is opening." - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, FALSE, /*goto*/ 0x32) - set_stage_flag(STAGEFLAG_OUTER_DOOR_OPENING) - label(0x32) - open_door(0x2e) - open_door(0x2f) - set_object_flag(0x2e, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2f, OBJFLAG_DOOR_KEEPOPEN) - reloop(0x04) - - // Wait 2 seconds - label(0x0f) - restart_timer - - beginloop(0x10) - if_timer_gt(120, /*goto*/ 0x32) - endloop(0x10) - - label(0x32) - endloop(0x04) - - endlist -}; - -u8 func100d_check_terminals_destroyed[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x06) - if_object_in_good_condition(OBJ_TERMINAL1, /*goto*/ 0x06) - if_door_state(0x2c, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x06) - goto_next(0x08) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x06) - if_object_in_good_condition(OBJ_TERMINAL2, /*goto*/ 0x06) - if_door_state(0x2e, (DOORSTATE_OPEN | DOORSTATE_OPENING), /*goto*/ 0x06) - goto_first(0x08) - - label(0x06) - endloop(0x04) - - label(0x08) - show_hudmsg(CHR_BOND, L_TRA_036) // "Mission critical object destroyed." - set_stage_flag(STAGEFLAG_HANGAR_TERMINAL_DESTROYED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_check_elvis_dead[] = { - beginloop(0x04) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - if_stage_flag_eq(STAGEFLAG_STARTED_OUTRO, TRUE, /*goto*/ 0x32) - set_stage_flag(STAGEFLAG_ELVIS_DEAD) - show_hudmsg(CHR_BOND, L_TRA_030) // "Elvis has been killed." - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_check_end_level[] = { - beginloop(0x04) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x32) - if_objective_complete(0, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) -#if VERSION < VERSION_NTSC_1_0 -#endif - if_objective_complete(1, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) -#if VERSION < VERSION_NTSC_1_0 -#endif - if_difficulty_lt(DIFF_SA, /*goto*/ 0x32) - if_objective_complete(3, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) -#if VERSION < VERSION_NTSC_1_0 -#endif - if_objective_complete(2, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) - if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, FALSE, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) -#if VERSION < VERSION_NTSC_1_0 -#endif - if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) - if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) - if_chr_deadish(CHR_ELVIS, /*goto*/ 0x0f) - - if_chr_deadish(CHR_JONATHAN, /*goto*/ 0x0f) - - if_chr_deadish(CHR_BOND, /*goto*/ 0x32) - goto_next(0x06) - - // Joanna is dead - label(0x32) - if_chr_deadish(CHR_COOP, /*goto*/ 0x33) - goto_next(0x06) - - // Both Joanna and Velvet are dead - label(0x33) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Mission complete - label(0x06) - if_stage_flag_eq(STAGEFLAG_JO_DOING_TERMINALS, FALSE, /*goto*/ 0x32) - set_ailist(CHR_SELF, AILIST_UFO_EXIT) - - label(0x32) - set_invincible(CHR_BOND) - set_ailist(CHR_SELF, AILIST_OUTRO) - - // Jonathan and/or Elvis are dead - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_unlock_doors_when_jo_escaping[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_JO_ESCAPE_STARTED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unlock_door(0x06, 0x40) - unlock_door(0x07, 0x40) - unlock_door(0x08, 0x04) - unlock_door(0x09, 0x04) - unlock_door(0x1d, 0x40) - unlock_door(0x1e, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1012_hoverbike_auto_doors[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_JO_ESCAPE_STARTED, TRUE, /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_0176, /*goto*/ 0x08) - if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_0158, /*goto*/ 0x09) - if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_00DB, /*goto*/ 0x0a) - if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_00A1, /*goto*/ 0x0c) - if_chr_distance_to_pad_lt(CHR_P1P2, 500, PAD_TRA_009E, /*goto*/ 0x0d) - reloop(0x04) - - // Pad/door 1 - label(0x08) - if_door_state(0x0a, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_object_flag(0x0a, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x0a) - reloop(0x04) - - // Pad/door 2 - label(0x09) - if_door_state(0x0b, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_object_flag(0x0b, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x0b) - reloop(0x04) - - // Pad/door 3 - label(0x0a) - if_door_state(0x08, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_object_flag(0x08, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x09, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x08) - open_door(0x09) - reloop(0x04) - - // Pad/door 4 - label(0x0c) - if_door_state(0x0c, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_object_flag(0x0c, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x0c) - reloop(0x04) - - // Pad/door 5 - label(0x0d) - if_door_state(0x05, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x06) - reloop(0x04) - - label(0x06) - set_object_flag(0x05, OBJFLAG_DOOR_KEEPOPEN) - open_door(0x05) - endloop(0x04) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040c_hidden_guardtype1[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1016_enable_guards_after_meetup[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - enable_chr(0x0d) - enable_chr(0x0e) - enable_chr(0x0f) - enable_chr(0x10) - enable_chr(0x11) - enable_chr(0x12) - enable_chr(0x13) - enable_chr(0x14) - enable_chr(0x15) - enable_chr(0x16) - unset_chr_chrflag(0x0d, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0d, CHRCFLAG_INVINCIBLE) - set_ailist(0x0d, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x0e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0e, CHRCFLAG_INVINCIBLE) - set_ailist(0x0e, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x0f, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x0f, CHRCFLAG_INVINCIBLE) - set_ailist(0x0f, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x10, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x10, CHRCFLAG_INVINCIBLE) - set_ailist(0x10, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x11, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x11, CHRCFLAG_INVINCIBLE) - set_ailist(0x11, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x12, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x12, CHRCFLAG_INVINCIBLE) - set_ailist(0x12, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x13, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x13, CHRCFLAG_INVINCIBLE) - set_ailist(0x13, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x14, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x14, CHRCFLAG_INVINCIBLE) - set_ailist(0x14, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x15, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x15, CHRCFLAG_INVINCIBLE) - set_ailist(0x15, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) - set_ailist(0x16, AILIST_INIT_SUPERDRAGON_GUARD) - rebuild_teams - rebuild_squadrons - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1017_check_both_hangar_doors_open[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) - if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - show_hudmsg(CHR_BOND, L_TRA_053) // "The hangar doors are now open." - set_stage_flag(STAGEFLAG_BOTH_HANGAR_DOORS_OPEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040d_hidden_guardtype2[] = { - set_chr_chrflag(CHR_SELF, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_SELF, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1018_unhide_guards_when_jo_escaping[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_JO_ESCAPE_STARTED, TRUE, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unset_chr_chrflag(0x16, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x16, CHRCFLAG_INVINCIBLE) - set_ailist(0x16, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x17, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x17, CHRCFLAG_INVINCIBLE) - set_ailist(0x17, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x18, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x18, CHRCFLAG_INVINCIBLE) - set_ailist(0x18, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x19, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x19, CHRCFLAG_INVINCIBLE) - set_ailist(0x19, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x1a, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1a, CHRCFLAG_INVINCIBLE) - set_ailist(0x1a, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x1b, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1b, CHRCFLAG_INVINCIBLE) - set_ailist(0x1b, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x1c, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1c, CHRCFLAG_INVINCIBLE) - set_ailist(0x1c, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x1d, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1d, CHRCFLAG_INVINCIBLE) - set_ailist(0x1d, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x1e, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1e, CHRCFLAG_INVINCIBLE) - set_ailist(0x1e, AILIST_INIT_SUPERDRAGON_GUARD) - unset_chr_chrflag(0x1f, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x1f, CHRCFLAG_INVINCIBLE) - set_ailist(0x1f, AILIST_INIT_SUPERDRAGON_GUARD) - unlock_door(0x0c, 0x40) - unlock_door(0x15, 0x40) - unlock_door(0x16, 0x40) - unlock_door(0x17, 0x40) - unlock_door(0x18, 0x40) - unlock_door(0x19, 0x40) - unlock_door(0x1a, 0x40) - unlock_door(0x1b, 0x40) - unlock_door(0x1c, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func040e_hidden_biotech[] = { - label(0x04) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1019_enable_biotechs_after_stash[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_ELVIS_STASHED, TRUE, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - unset_chr_chrflag(0x25, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x25, CHRCFLAG_INVINCIBLE) - set_ailist(0x25, AILIST_INIT_BIOTECH) - unset_chr_chrflag(0x26, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x26, CHRCFLAG_INVINCIBLE) - set_ailist(0x26, AILIST_INIT_BIOTECH) - unset_chr_chrflag(0x27, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x27, CHRCFLAG_INVINCIBLE) - set_ailist(0x27, AILIST_INIT_BIOTECH) - unset_chr_chrflag(0x28, CHRCFLAG_HIDDEN) - unset_chr_chrflag(0x28, CHRCFLAG_INVINCIBLE) - set_ailist(0x28, AILIST_INIT_BIOTECH) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1002_intro[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_ESCAPE_INTRO) - camera_movement(ANIM_CUT_TRA_INTRO_CAM) - cmd0175(60) - - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_INTRO_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - - set_chr_chrflag(0x23, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x23, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x23, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x23, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_INTRO_BIO1, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x23, 4) - - set_chr_chrflag(0x24, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(0x24, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x24, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x24, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_INTRO_BIO2, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x24, 4) - - set_object_flag2(OBJ_HOVERBED, OBJFLAG2_04000000) - set_object_flag3(OBJ_HOVERBED, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_INTRO_BED, OBJ_HOVERBED, 0x04, 0xffff) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 90) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_FALCON2_SCOPE, WEAPON_NONE) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0x68) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - label(0x06) - - wait_until(2, 0xc5) - speak(CHR_BOND, L_TRA_081, SFX_81BA, CHANNEL_7, COLOR_02_WHITE) // "What the hell do you think you're doing? This is s..." - - wait_until(60, 0x6a) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(115, 0x6b) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(156, 0x6c) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(205, 0x6d) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(260, 0x6e) - play_sound(SFX_0161, CHANNEL_5) - - wait_until(341, 0x6f) - play_sound(SFX_0162, CHANNEL_6) - open_door(0x0e) - open_door(0x0f) - - wait_until(444, 0x70) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(468, 0x71) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(490, 0x72) - play_sound(SFX_0164, CHANNEL_5) - - wait_until(528, 0x73) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(545, 0x8a) - speak(CHR_BOND, L_TRA_084, MP3_0758, CHANNEL_7, COLOR_09_BLUE) // "I don't care much for procedures!" - - wait_until(588, 0x74) - play_sound(SFX_0162, CHANNEL_5) - - wait_until(632, 0x75) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(698, 0x76) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(706, 0x77) - - wait_until(770, 0xc6) - speak(CHR_BOND, L_TRA_082, MP3_0436, CHANNEL_7, COLOR_02_WHITE) // "Director Easton will hear about this, young lady." - - wait_until(810, 0xbe) - close_door(0x0e) - close_door(0x0f) - - wait_until(830, 0x78) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(872, 0x79) - play_sound(SFX_0162, CHANNEL_4) - - wait_until(998, 0xc7) - speak(CHR_BOND, L_TRA_083, MP3_0437, CHANNEL_7, COLOR_02_WHITE) // "You can't take that! It's government property! Thi..." - - wait_until(1032, 0x7b) - play_sound(SFX_0161, CHANNEL_5) - - wait_until(1224, 0x7c) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(1260, 0x7d) - play_sound(SFX_0163, CHANNEL_4) - - wait_until(1286, 0x7e) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(1325, 0x7f) - play_sound(SFX_01B9, CHANNEL_6) - - wait_until(1334, 0x80) - play_sound(SFX_00FB, CHANNEL_10) - - wait_until(1342, 0x81) - play_sound(SFX_00FB, CHANNEL_10) - - wait_until(1353, 0x82) - play_sound(SFX_00F9, CHANNEL_10) - - wait_until(1362, 0x83) - - wait_until(1372, 0x84) - play_sound(SFX_00FA, CHANNEL_10) - - wait_until(1388, 0x85) - play_sound(SFX_01BA, CHANNEL_5) - - wait_until(1396, 0x86) - play_sound(SFX_00FC, CHANNEL_10) - - wait_until(1432, 0xbf) - open_door(0x10) - - wait_until(1510, 0x8f) - play_sound(SFX_0162, CHANNEL_4) - - wait_until(1544, 0x90) - play_sound(SFX_0163, CHANNEL_6) - - wait_until(1590, 0x91) - play_sound(SFX_0164, CHANNEL_4) - - wait_until(1624, 0x92) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(1662, 0x93) - play_sound(SFX_0162, CHANNEL_4) - - wait_until(1716, 0x94) - play_sound(SFX_01B9, CHANNEL_6) - - wait_until(1730, 0x95) - play_sound(SFX_00FE, CHANNEL_10) - play_sound(SFX_00FA, CHANNEL_10) - - wait_until(1736, 0x96) - speak(CHR_BOND, L_TRA_063, MP3_0438, CHANNEL_7, COLOR_02_WHITE) // "Let's see how that overconfident thief deals with ..." - set_stage_flag(STAGEFLAG_GAS_ON) - - wait_until(1773, 0x9a) - play_sound(SFX_01BB, CHANNEL_5) - - wait_until(1822, 0xc0) - close_door(0x10) - - wait_until(1826, 0x9f) - play_sound(SFX_00FD, CHANNEL_10) - - wait_until(1834, 0xa0) - play_sound(SFX_00FD, CHANNEL_10) - - wait_until(1850, 0xa1) - play_sound(SFX_00FA, CHANNEL_10) - - wait_until(1926, 0xa4) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(2146, 0xa5) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(2180, 0xa6) - play_sound(SFX_0507, CHANNEL_5) - - wait_until(2202, 0xa7) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(2218, 0xa8) - speak(CHR_BOND, L_TRA_064, MP3_0439, CHANNEL_7, COLOR_09_BLUE) // "What's that noise? Can't be... Gas!" - - wait_until(2271, 0xa9) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(2300, 0xaa) - play_sound(SFX_0163, CHANNEL_5) - - wait_until(2362, 0xab) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(2384, 0xac) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(2428, 0xad) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(2458, 0xae) - play_sound(SFX_0161, CHANNEL_6) - - wait_until(2582, 0xaf) - speak(CHR_BOND, L_TRA_065, MP3_043A, CHANNEL_7, COLOR_02_WHITE) // "Noooo, that wasn't meant to happen!" - - wait_until(2725, 0xb1) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2748, 0xb2) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2768, 0x97) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2810, 0x98) - play_sound(SFX_0429, CHANNEL_10) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2877, 0x99) - play_sound(SFX_0429, CHANNEL_10) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2904, 0xb3) - play_sound(SFX_0429, CHANNEL_10) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2924, 0xb5) - play_sound(SFX_0429, CHANNEL_10) - play_sound(SFX_0429, CHANNEL_10) - - wait_until(2930, 0xb4) - play_sound(SFX_COUGH_04AF, CHANNEL_10) - - wait_until(3024, 0x89) - play_sound(SFX_00FA, CHANNEL_10) - play_sound(SFX_00F9, CHANNEL_10) - - wait_until(3060, 0xb0) - play_sound(SFX_COUGH_04B0, CHANNEL_10) - - wait_until(3178, 0xb6) - play_sound(SFX_007D, CHANNEL_6) - - wait_until(3242, 0xb7) - play_sound(SFX_01DC, CHANNEL_6) - play_sound(SFX_00FC, CHANNEL_10) - - wait_until(3290, 0xb8) - play_sound(SFX_01DC, CHANNEL_6) - play_sound(SFX_00FD, CHANNEL_10) - - wait_until(3334, 0xb9) - play_sound(SFX_00FA, CHANNEL_10) - - wait_until(3894, 0xba) - speak(CHR_BOND, L_TRA_067, MP3_043B, CHANNEL_7, COLOR_09_BLUE) // "You idiot! We'd better get out of here." - - wait_until(4146, 0xbb) - play_sound(SFX_0162, CHANNEL_6) - - wait_until(4316, 0xbc) - play_sound(SFX_0164, CHANNEL_6) - - wait_until(4336, 0xbd) - play_sound(SFX_0163, CHANNEL_5) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x32) - goto_next(0x68) - - label(0x32) - if_controller_button_pressed(/*goto*/ 0x68) - label(0x32) - endloop(0x08) - - label(0x68) - set_stage_flag(STAGEFLAG_INTRO_DONE) - set_stage_flag(STAGEFLAG_GAS_ON) - mute_channel(CHANNEL_7) - mute_channel(CHANNEL_6) - mute_channel(CHANNEL_10) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_INTRO_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - - unset_chr_chrflag(0x23, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(0x23, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_INTRO_BIO1, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x23, 2) - - unset_chr_chrflag(0x24, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(0x24, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_INTRO_BIO2, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x24, 2) - - unset_object_flag2(OBJ_HOVERBED, OBJFLAG2_04000000) - set_object_flag3(OBJ_HOVERBED, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_INTRO_BED, OBJ_HOVERBED, 0x04, 0xfffe) - - drop_concealed_items(0x23) - drop_concealed_items(0x24) - stop_cutscene_track - stop_ambient_track - enter_firstperson - revoke_control(CHR_BOND, 0) - yield - grab_object(CHR_BOND, OBJ_HOVERBED) - grant_control(CHR_BOND) - yield - kill(0x23) - kill(0x24) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c01_midcutscene[] = { - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_ESCAPE_MIDCUTSCENE) - camera_movement(ANIM_CUT_TRA_MID_CAM) - cmd0175(60) - disable_object(OBJ_HOVERBED) -#if VERSION >= VERSION_NTSC_1_0 - set_target_chr(CHR_BOND) - if_chr_deadish(CHR_BOND, /*goto*/ 0x33) - goto_next(0x06) - - label(0x33) - if_chr_deadish(CHR_COOP, /*goto*/ 0x06) - set_target_chr(CHR_COOP) - - label(0x06) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) -#endif - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_JONATHAN, GAILIST_IDLE) - -#if VERSION >= VERSION_NTSC_1_0 - set_chr_chrflag(CHR_TARGET, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_TARGET, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_TARGET, CHRHFLAG_00020000) -#else - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) -#endif - chr_do_animation(ANIM_CUT_TRA_MID_JO, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, 4) - - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_MID_ELVIS, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 4) - - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_MID_JON, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 4) - - set_object_flag2(OBJ_HOVERBED_EMPTY, OBJFLAG2_04000000) - set_object_flag3(OBJ_HOVERBED_EMPTY, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_MID_BED, OBJ_HOVERBED_EMPTY, 0x04, 0xffff) - - show_nonessential_chrs(FALSE) - if_object_in_room(OBJ_HOVERBIKE, 0x00df, /*goto*/ 0x06) - goto_next(0x32) - - label(0x06) - move_object_to_pad(OBJ_HOVERBIKE, PAD_TRA_038A) - label(0x32) - restart_timer - set_cutscene_weapon(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, WEAPON_NONE, WEAPON_NONE) - - wait_until(83, 0x6a) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_069, MP3_043C, CHANNEL_7, COLOR_06_WHITE) // "***aahh...! aahaa...! aaaaahhh! aha. ahh.***" - - wait_until(116, 0x6b) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) - - wait_until(124, 0x6c) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_4) - - wait_until(142, 0x6d) - play_sound(SFX_FOOTSTEP_80C6, CHANNEL_6) - - wait_until(148, 0x6e) - play_sound(SFX_FOOTSTEP_80C7, CHANNEL_4) - - wait_until(172, 0x6f) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) - - wait_until(176, 0x70) - play_sound(SFX_FOOTSTEP_80C7, CHANNEL_4) - - wait_until(214, 0x71) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) - - wait_until(690, 0x72) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_070, MP3_043D, CHANNEL_7, COLOR_06_WHITE) // "I'm alive. I thought I'd be chopped up like the ot..." - - wait_until(1392, 0x73) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_071, MP3_043E, CHANNEL_7, COLOR_09_BLUE) // "You... You speak our language?" - - wait_until(1400, 0x74) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) - - wait_until(1554, 0x75) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_072, MP3_043F, CHANNEL_7, COLOR_03_RED) // "Watch her... she's sharp." - - wait_until(1688, 0x76) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_073, MP3_0440, CHANNEL_7, COLOR_06_WHITE) // "Earrggghh...eerggh..." - - wait_until(1962, 0x77) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_074, MP3_0441, CHANNEL_7, COLOR_09_BLUE) // "What's wrong?" - - wait_until(1988, 0x78) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) - - wait_until(2014, 0x79) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_4) - - wait_until(2113, 0x7a) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_075, MP3_0442, CHANNEL_7, COLOR_06_WHITE) // "I have a headache. And with a head this big, that'..." - - wait_until(2470, 0x7b) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_076, MP3_0443, CHANNEL_7, COLOR_09_BLUE) // "Can you walk? We must leave before they get organi..." - - wait_until(2480, 0x7c) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) - - wait_until(2526, 0x7d) - play_sound(SFX_FOOTSTEP_80C6, CHANNEL_6) - - wait_until(2624, 0x7e) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) - - wait_until(2642, 0x7f) - play_sound(SFX_FOOTSTEP_80C6, CHANNEL_4) - - wait_until(2678, 0x80) - play_sound(SFX_FOOTSTEP_80C7, CHANNEL_6) - - wait_until(2712, 0x81) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_4) - - wait_until(2726, 0x82) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_6) - - wait_until(2728, 0x83) - play_sound(SFX_FOOTSTEP_80C7, CHANNEL_7) - - wait_until(2806, 0x84) - play_sound(SFX_FOOTSTEP_80C4, CHANNEL_6) - - wait_until(2824, 0x85) - play_sound(SFX_FOOTSTEP_80C5, CHANNEL_4) - - wait_until(2842, 0x86) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_077, MP3_0444, CHANNEL_7, COLOR_06_WHITE) // "I think so. What's your name?" - - wait_until(3024, 0x87) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_078, MP3_0445, CHANNEL_7, COLOR_09_BLUE) // "I'm Agent Dark. Or Joanna, if you prefer." - - wait_until(3270, 0x88) - speak(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, L_TRA_079, MP3_0446, CHANNEL_7, COLOR_06_WHITE) // "Well, Joanna, I'm Protector One. But you can call ..." - - wait_until(3308, 0x89) - play_sound(SFX_FOOTSTEP_80C6, CHANNEL_6) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x32) - goto_next(0x68) - - label(0x32) - if_controller_button_pressed(/*goto*/ 0x68) - label(0x32) - endloop(0x08) - - label(0x68) - set_stage_flag(STAGEFLAG_INTRO_DONE) - mute_channel(CHANNEL_7) - stop_cutscene_track - stop_ambient_track - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_MID_JO, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, VERSION >= VERSION_NTSC_1_0 ? CHR_TARGET : CHR_BOND, 2) - - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_ELVIS, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_MID_ELVIS, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_ELVIS, 2) - - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_JONATHAN, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_MID_JON, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_JONATHAN, 2) - - unset_object_flag2(OBJ_HOVERBED_EMPTY, OBJFLAG2_04000000) - set_object_flag3(OBJ_HOVERBED_EMPTY, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_MID_BED, OBJ_HOVERBED_EMPTY, 0x04, 0xfffe) - - unset_object_flag2(0x0a, OBJFLAG2_AICANNOTUSE) - unset_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - unset_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) - set_ailist(CHR_JONATHAN, AILIST_JONATHAN_HANGAR) - set_ailist(CHR_ELVIS, AILIST_INIT_ELVIS) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x32) - chr_move_to_pad(CHR_COOP, PAD_TRA_0156, 0x01, /*goto*/ 0x32) - label(0x32) - show_nonessential_chrs(TRUE) - set_ailist(CHR_SELF, GAILIST_END_CINEMA) - endlist -}; - -u8 func101b_gas_sound[] = { - beginloop(0x67) - if_stage_flag_eq(STAGEFLAG_GAS_ON, TRUE, /*goto*/ 0x04) - endloop(0x67) - - label(0x04) - yield - assign_sound(SFX_816A, CHANNEL_0) - play_sound_from_object(CHANNEL_0, 0x2b, 1, 8000, 3000) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0c02_outro[] = { - open_door(0x2c) - open_door(0x2e) - set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) - label(0x32) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_ESCAPE_OUTRO_LONG) - camera_movement(ANIM_CUT_TRA_OUTRO_CAM_01) - label(0x32) - disable_object(OBJ_UFO2) - - enable_object(OBJ_UFO1) - set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) - set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_01, OBJ_UFO1, 0x04, 0xffff) - - set_stage_flag(STAGEFLAG_STARTED_OUTRO) - remove_chr(CHR_ELVIS) - remove_chr(CHR_JONATHAN) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - show_nonessential_chrs(FALSE) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x32) - goto_next(0x68) - - label(0x32) - if_controller_button_pressed(/*goto*/ 0x68) - label(0x32) - endloop(0x08) - - label(0x68) - label(0x32) - camera_movement(ANIM_CUT_TRA_OUTRO_CAM_02) - - enable_object(OBJ_UFO1) - set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) - set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_02, OBJ_UFO1, 0x04, 0xffff) - - set_chr_chrflag(0x2b, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(0x2b, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(0x2b, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, 0x2b, 4) - - open_door(0x2c) - open_door(0x2e) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x32) - goto_next(0x69) - - label(0x32) - if_controller_button_pressed(/*goto*/ 0x69) - label(0x32) - endloop(0x09) - - label(0x69) - label(0x06) - disable_object(OBJ_UFO2) - if_stage_flag_eq(STAGEFLAG_JO_DOING_TERMINALS, FALSE, /*goto*/ 0x32) - stop_cutscene_track - stop_ambient_track - - label(0x32) - goto_next(0x06) - - // Unreachable - label(0x09) - set_stage_flag(STAGEFLAG_UFO_LEAVING) - set_ailist(CHR_SELF, GAILIST_END_CINEMA) - - label(0x06) - set_stage_flag(STAGEFLAG_ESCAPED) - yield - yield - set_invincible(CHR_BOND) - revoke_control(CHR_BOND, 4) - hide_countdown_timer - stop_countdown_timer - unset_savefile_flag(GAMEFILEFLAG_DEFENSE_JON) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Makes the UFO exit, when Jo is doing terminals and has to escape via - * hoverbike. - */ -u8 func0415_ufo_exit[] = { - configure_environment(0x0000, AIENVCMD_PLAYUFOHUM, 5) - disable_object(OBJ_UFO2) - enable_object(OBJ_UFO1) - set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) - set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_01, OBJ_UFO1, 0x04, 0xffff) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_INVINCIBLE) - set_chr_chrflag(CHR_ELVIS, CHRCFLAG_UNEXPLODABLE) - set_chr_chrflag(CHR_JONATHAN, CHRCFLAG_UNEXPLODABLE) - set_stage_flag(STAGEFLAG_UFO_LEAVING) - restart_timer - - beginloop(0x08) - if_timer_gt(600, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - configure_environment(0x0000, AIENVCMD_STOPUFOHUM, 0) - stop_ambient_track - disable_object(OBJ_UFO1) - set_ailist(CHR_SELF, GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1021_jo_escaping[] = { - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_UFO_LEAVING, TRUE, /*goto*/ 0x32) - endloop(0x08) - - label(0x32) - set_stage_flag(STAGEFLAG_JO_ESCAPE_STARTED) - restart_timer - - beginloop(0x0f) - if_timer_gt(180, /*goto*/ 0x32) - endloop(0x0f) - - label(0x32) - set_stage_flag(STAGEFLAG_TRIGGER_JETBIKE_MESSAGE) - - beginloop(0x0a) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x0014, /*goto*/ 0x06) - endloop(0x0a) - - label(0x06) - set_stage_flag(STAGEFLAG_ESCAPED) - yield - yield - set_invincible(CHR_BOND) - revoke_control(CHR_BOND, 4) - hide_countdown_timer - stop_countdown_timer - label(0x62) - set_savefile_flag(GAMEFILEFLAG_DEFENSE_JON) - play_cutscene_track(MUSIC_ESCAPE_OUTRO_LONG) - camera_movement(ANIM_CUT_TRA_OUTRO_CAM_02) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_P1P2_OPPOSITE, CHRCFLAG_HIDDEN) - set_ailist(CHR_P1P2, GAILIST_IDLE) - - enable_object(OBJ_UFO1) - set_object_flag2(OBJ_UFO1, OBJFLAG2_04000000) - set_object_flag3(OBJ_UFO1, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_TRA_OUTRO_UFO_02, OBJ_UFO1, 0x04, 0xffff) - - set_chr_chrflag(CHR_P1P2, CHRCFLAG_UNPLAYABLE) - unset_chr_chrflag(CHR_P1P2, CHRCFLAG_HIDDEN) - set_chr_hiddenflag(CHR_P1P2, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_TRA_OUTRO_GUARD, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_P1P2, 4) - - beginloop(0x09) - if_camera_animating(/*goto*/ 0x32) - goto_next(0x69) - - label(0x32) - if_controller_button_pressed(/*goto*/ 0x69) - label(0x32) - endloop(0x09) - - label(0x69) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Unreachable - end_level - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This is most likely a hidden guard. Spawns clones after meeting Jon until he - * enters the mine room. - * - * There are 4 of these guards, and each one will have one clone alive at a - * time. - */ -u8 func0416_spawn_during_follow[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_self_chrflag(CHRCFLAG_00040000) - set_self_chrflag(CHRCFLAG_CLONEABLE) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - - beginloop(0x04) - if_can_see_target(/*goto*/ 0x32) - if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x06) - label(0x32) - reloop(0x04) - - // Met Jon - label(0x06) - label(0x54) - if_chr_death_animation_finished(CHR_CLONE, /*goto*/ 0x54) - reloop(0x04) - - label(0x54) - try_spawn_clone2(CHR_SELF, AILIST_INIT_FOLLOWER_CLONE, 0, /*goto*/ 0x32) - reloop(0x04) - - // Spawned - label(0x32) - restart_timer - - beginloop(0x08) - if_stage_flag_eq(STAGEFLAG_JON_ENTERED_MINE_ROOM, TRUE, /*goto*/ 0x32) - if_timer_gt(1800, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - endloop(0x04) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0417_init_follower_clone[] = { - set_self_flag_bankx(CHRFLAG1_NOIDLEANIMS, BANK_1) - label(0x04) - rebuild_teams - rebuild_squadrons - try_inherit_properties(0x09, /*goto*/ 0x06) - label(0x06) - set_ailist(CHR_SELF, AILIST_FOLLOWER_CLONE) - endlist -}; - -u8 func0418_follower_clone[] = { - call_rng - if_rand_lt(128, /*goto*/ 0x32) - set_target_chr(CHR_COOP) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x32) - goto_next(0x06) - - label(0x32) - set_target_chr(CHR_BOND) - label(0x06) - set_ailist(CHR_SELF, GAILIST_ALERTED) - endlist -}; - -u8 func0419_init_biotech[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(20) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(0) - set_recovery_speed(0) - set_shield(0) - set_returnlist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -u8 func041a_init_superdragon_guard[] = { - set_chr_dodge_rating(2, 10) - set_accuracy(10) - set_reaction_speed(40) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func101a_medpack_switch[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_object_in_good_condition(OBJ_MEDPACK_SWITCH, /*goto*/ 0x32) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - set_stage_flag(STAGEFLAG_MEDPACK_SWITCH_DESTROYED) - show_hudmsg(CHR_BOND, L_TRA_036) // "Mission critical object destroyed." - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x32) - if_chr_activated_object(CHR_P1P2, OBJ_MEDPACK_SWITCH, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - assign_sound(SFX_043A, CHANNEL_7) - control_sound_from_object(CHANNEL_7, OBJ_MEDPACK_SWITCH, TRUE) - show_hudmsg(CHR_P1P2, L_TRA_054) // "Medical containment doors unlocked." - unlock_door(0x12, 0x40) - unlock_door(0x13, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Warps Jon to the catwalk outside the mine room. - */ -u8 unregistered_function1[] = { - // Wait until met Jon - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_MET_JON, TRUE, /*goto*/ 0x08) - endloop(0x04) - - // Wait until player in mine room - beginloop(0x08) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x00dc, /*goto*/ 0x32) - if_chr_in_room(CHR_P1P2, 0x00, 0x00dd, /*goto*/ 0x32) - endloop(0x08) - - label(0x32) - set_ailist(CHR_JONATHAN, 0x040f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * @unused - */ -u8 func040f_warp_jon_to_catwalk[] = { - set_target_chr(CHR_BOND) - if_can_see_target(/*goto*/ 0x06) - set_target_chr(CHR_COOP) - if_can_see_target(/*goto*/ 0x06) - stop_chr - yield - chr_move_to_pad(CHR_JONATHAN, PAD_TRA_0152, 0x00, /*goto*/ 0x32) - label(0x32) - yield - set_ailist(CHR_JONATHAN, AILIST_JONATHAN_FOLLOWING_AND_MINE) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101d_msg_medpackaroundhere[] = { - beginloop(0x04) - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x00d2, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - - beginloop(0x6a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x32) - endloop(0x6a) - - label(0x32) - speak(CHR_P1P2, L_TRA_055, MP3_03C0, CHANNEL_6, COLOR_09_BLUE) // "The medpack's got to be somewhere around here." - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101e_msg_hookup[] = { - restart_timer - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_JON_SAID_MAINT_HATCH, TRUE, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - - beginloop(0x6a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x32) - endloop(0x6a) - - label(0x32) - speak(CHR_BOND, L_TRA_056, MP3_03C1, CHANNEL_6, COLOR_09_BLUE) // "Time to hook up with Jonathan, before he gets into..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101f_msg_oil[] = { - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_JON_SAID_MAINT_HATCH, TRUE, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) - if_chr_in_room(CHR_P1P2, 0x00, 0x00dc, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - yield - yield - yield - - beginloop(0x6a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x32) - endloop(0x6a) - - label(0x32) - speak(CHR_P1P2, L_TRA_057, MP3_03C2, CHANNEL_6, COLOR_09_BLUE) // "That smell... oil... I smelt that in the other han..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1020_msg_jetbike[] = { - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_JETBIKE_MESSAGE, TRUE, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - - beginloop(0x6a) - if_sound_finished(CHANNEL_6, /*goto*/ 0x32) - endloop(0x6a) - - label(0x32) - speak(CHR_BOND, L_TRA_058, MP3_03C3, CHANNEL_6, COLOR_09_BLUE) // "The jetbike should get me out before they lock the..." - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1024_wall_immune_to_explosives[] = { - set_object_flag(OBJ_WALLOBJECT, OBJFLAG_INVINCIBLE) - set_object_flag(OBJ_WALLDOOR, OBJFLAG_INVINCIBLE) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_JON_FINISHED_EXPLOSIVES, TRUE, /*goto*/ 0x32) - endloop(0x04) - - label(0x32) - unset_object_flag(OBJ_WALLOBJECT, OBJFLAG_INVINCIBLE) - unset_object_flag(OBJ_WALLDOOR, OBJFLAG_INVINCIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * Wait until barrel destroyed then unset immune to explosives on the medpack - * glass. This wouldn't have worked as intended, as destroying any one barrel - * would cause the glass to become suscepitble to explosives. - */ -#define glass_explosives_thing(barrel) \ - beginloop(0x04) \ - if_object_in_good_condition(barrel, /*goto*/ 0x32) \ - unset_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) \ - restart_timer \ - \ - beginloop(0x08) \ - if_timer_gt(60, /*goto*/ 0x06) \ - endloop(0x08) \ - \ - label(0x06) \ - set_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) \ - set_ailist(CHR_SELF, GAILIST_IDLE) \ - label(0x32) \ - endloop(0x04) \ - \ - set_ailist(CHR_SELF, GAILIST_IDLE) - -u8 unregistered_function2[] = { - set_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) - glass_explosives_thing(0x23) - endlist -}; - -u8 unregistered_function3[] = { - glass_explosives_thing(0x24) - endlist -}; - -u8 unregistered_function4[] = { - glass_explosives_thing(0x25) - endlist -}; - -u8 unregistered_function5[] = { - glass_explosives_thing(0x26) - endlist -}; - -u8 unregistered_function6[] = { - glass_explosives_thing(0x27) - endlist -}; - -u8 unregistered_function7[] = { - glass_explosives_thing(0x28) - endlist -}; - -u8 unregistered_function8[] = { - glass_explosives_thing(0x29) - endlist -}; - -u8 func1026_ufo_spinning[] = { - enable_object(OBJ_UFO2) - set_object_flag2(OBJ_UFO2, OBJFLAG2_04000000) - set_object_flag3(OBJ_UFO2, OBJFLAG3_00000010) - - label(0x03) - object_do_animation(ANIM_0459, OBJ_UFO2, 0x04, 0xffff) - restart_timer - - beginloop(0x08) - if_timer_gt(184, /*goto*/ 0x32) - endloop(0x08) - - label(0x32) - goto_first(0x03) - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102e_keep_hangar_doors_open[] = { - beginloop(0x67) - if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x0f) - if_stage_flag_eq(STAGEFLAG_HANGAR_X_MUSIC_STARTED, TRUE, /*goto*/ 0x04) - endloop(0x67) - - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_HANGAR_TERMINAL_DESTROYED, TRUE, /*goto*/ 0x0f) - if_door_state(0x2c, DOORSTATE_CLOSING, /*goto*/ 0x08) - if_door_state(0x2e, DOORSTATE_CLOSING, /*goto*/ 0x09) - reloop(0x04) - - // Door 1 closing - label(0x08) - if_stage_flag_eq(STAGEFLAG_INNER_DOOR_OPENING, TRUE, /*goto*/ 0x32) - if_door_state(0x2c, (DOORSTATE_CLOSED | DOORSTATE_CLOSING), /*goto*/ 0x09) - reloop(0x04) - - label(0x32) - open_door(0x2c) - open_door(0x2d) - set_object_flag(0x2c, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2d, OBJFLAG_DOOR_KEEPOPEN) - reloop(0x04) - - // Door 2 closing - label(0x09) - if_stage_flag_eq(STAGEFLAG_OUTER_DOOR_OPENING, TRUE, /*goto*/ 0x32) - reloop(0x04) - - label(0x32) - open_door(0x2e) - open_door(0x2f) - set_object_flag(0x2e, OBJFLAG_DOOR_KEEPOPEN) - set_object_flag(0x2f, OBJFLAG_DOOR_KEEPOPEN) - endloop(0x04) - - // Terminal destroyed - label(0x0f) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func102f_toggle_remotemines[] = { - restart_timer - beginloop(0x08) - if_timer_gt(2400, /*goto*/ 0x32) - if_stage_flag_eq(STAGEFLAG_ELVIS_STASHED, TRUE, /*goto*/ 0x06) - endloop(0x08) - - label(0x32) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x06) - unset_object_flag(OBJ_REMOTEMINES, OBJFLAG_UNCOLLECTABLE) - unset_object_flag2(OBJ_REMOTEMINES, OBJFLAG2_INVISIBLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1030_setup_medpack_glass[] = { - if_difficulty_gt(DIFF_A, /*goto*/ 0x32) - unset_object_flag(OBJ_MEDPACK_GLASS, OBJFLAG_INVINCIBLE) - destroy_object(OBJ_MEDPACK_GLASS) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // SA and PA - label(0x32) - unlock_door(0x3c, 0x40) - unlock_door(0x3d, 0x40) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1031_disable_chambers[] = { - set_object_flag(0x46, OBJFLAG_DEACTIVATED) - set_object_flag(0x47, OBJFLAG_DEACTIVATED) - set_object_flag(0x48, OBJFLAG_DEACTIVATED) - set_object_flag(0x49, OBJFLAG_DEACTIVATED) - set_object_flag(0x4a, OBJFLAG_DEACTIVATED) - set_object_flag(0x4b, OBJFLAG_DEACTIVATED) - set_object_flag(0x4c, OBJFLAG_DEACTIVATED) - set_object_flag(0x4d, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1032_unlock_door_after_hangar[] = { - // Wait for locate hangar objective complete - beginloop(0x04) - if_objective_complete(2, /*goto*/ 0x06) - endloop(0x04) - - label(0x06) - unlock_door(0x0a, 0x02) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -/** - * This is the lift near the wall you blow up in Rescue. - */ -u8 func1433_start_lift[] = { - activate_lift(1, 0x4e) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func101c_setup_rtracker[] = { - yield - set_object_flag3(OBJ_FALCON2SCOPE1, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_FALCON2SCOPE2, OBJFLAG3_RTRACKED_BLUE) - set_object_flag3(OBJ_REMOTEMINES, OBJFLAG3_RTRACKED_BLUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1434_setup_environment[] = { - yield - configure_environment(0x0000, AIENVCMD_00, FALSE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x00d3, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d6, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d8, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00d9, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00da, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00db, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0024, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0025, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0026, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0027, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0028, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0029, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x002f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0030, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0032, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0033, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0034, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0035, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0036, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0037, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0038, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0039, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x003f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x005d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0079, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x007f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0080, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0081, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0082, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x008f, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0090, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0091, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0092, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0093, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0094, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0095, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0096, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0097, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0098, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0099, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x009a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x009b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00aa, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ab, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ac, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ad, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ae, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00af, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00b9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ba, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00be, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00bf, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c7, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c8, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00c9, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ca, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ce, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cf, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00d0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00d1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00d2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00dc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00dd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00de, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00df, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e0, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e1, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e3, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e4, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e5, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00e6, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00f2, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fa, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fc, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fd, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00fe, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00ff, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0100, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0101, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0102, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0103, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0104, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0105, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0106, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0107, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0108, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0109, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010b, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010c, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010d, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x010e, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00cb, AIENVCMD_ROOM_SETAMBIENT, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -struct ailist ailists[] = { - { func1400_setup_counterop, 0x1400 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_intro, 0x1002 }, - { func1004_jon_msgs_gravedanger, 0x1004 }, - { func1005_jon_msgs_meetup, 0x1005 }, - { func1007_check_medpack_collected, 0x1007 }, - { func1008_spawngroup1, 0x1008 }, - { func1009_blow_up_wall, 0x1009 }, - { func100a_check_hangar_accessed, 0x100a }, - { func100b_check_jonathan_dead, 0x100b }, - { func100c_medpack_activation, 0x100c }, - { func100d_check_terminals_destroyed, 0x100d }, - { func100e_check_elvis_dead, 0x100e }, - { func100f_terminals, 0x100f }, - { func1010_check_end_level, 0x1010 }, - { func1011_unlock_doors_when_jo_escaping, 0x1011 }, - { func1012_hoverbike_auto_doors, 0x1012 }, - { func1013_spawngroup2, 0x1013 }, - { func1014_spawngroup3, 0x1014 }, - { func1015_spawngroup4, 0x1015 }, - { func1016_enable_guards_after_meetup, 0x1016 }, - { func1017_check_both_hangar_doors_open, 0x1017 }, - { func1018_unhide_guards_when_jo_escaping, 0x1018 }, - { func1019_enable_biotechs_after_stash, 0x1019 }, - { func101a_medpack_switch, 0x101a }, - { func101b_gas_sound, 0x101b }, - { func101c_setup_rtracker, 0x101c }, - { func101d_msg_medpackaroundhere, 0x101d }, - { func101e_msg_hookup, 0x101e }, - { func101f_msg_oil, 0x101f }, - { func1020_msg_jetbike, 0x1020 }, - { func1021_jo_escaping, 0x1021 }, - { func1022_gas_damage_bond, 0x1022 }, - { func1023_gas_damage_coop, 0x1023 }, - { func1024_wall_immune_to_explosives, 0x1024 }, - { func1026_ufo_spinning, 0x1026 }, - { func102e_keep_hangar_doors_open, 0x102e }, - { func102f_toggle_remotemines, 0x102f }, - { func1030_setup_medpack_glass, 0x1030 }, - { func1031_disable_chambers, 0x1031 }, - { func1032_unlock_door_after_hangar, 0x1032 }, - { func1433_start_lift, 0x1433 }, - { func1434_setup_environment, 0x1434 }, - { func1002_intro, 0x0c00 }, - { func0c01_midcutscene, 0x0c01 }, - { func0c02_outro, 0x0c02 }, - { func0401_gas_damage, 0x0401 }, - { func0402_jonathan_waiting_for_meetup, 0x0402 }, - { func0403_init_jonathan, 0x0403 }, - { func0404_jonathan_following_and_mine, 0x0404 }, - { func0405_jonathan_shot_while_planting, 0x0405 }, - { func0406_unused_0406, 0x0406 }, - { func1008_spawngroup1_guard, 0x0407 }, - { func1013_spawngroup2_guard, 0x0408 }, - { func1014_spawngroup3_guard, 0x0409 }, - { func1015_spawngroup4_guard, 0x040a }, - { func040b_elvis_follow, 0x040b }, - { func040c_hidden_guardtype1, 0x040c }, - { func0413_jonathan_hangar, 0x0413 }, - { func040d_hidden_guardtype2, 0x040d }, - { func040e_hidden_biotech, 0x040e }, - { func040f_warp_jon_to_catwalk, 0x040f }, - { func1002_intro, 0x0410 }, - { func0c01_midcutscene, 0x0411 }, - { func0412_init_elvis, 0x0412 }, - { func0c02_outro, 0x0414 }, - { func0415_ufo_exit, 0x0415 }, - { func0416_spawn_during_follow, 0x0416 }, - { func0417_init_follower_clone, 0x0417 }, - { func0418_follower_clone, 0x0418 }, - { func0419_init_biotech, 0x0419 }, - { func041a_init_superdragon_guard, 0x041a }, - { func041b_jonathan_after_terminals, 0x041b }, - { func041c_elvis_go_to_ufo, 0x041c }, - { NULL, 0 }, -}; - struct path paths[] = { { NULL, 0, 0 }, }; diff --git a/src/setups/setupuff.c b/src/setups/setupuff.c index 843b097b5..58f02bfa8 100644 --- a/src/setups/setupuff.c +++ b/src/setups/setupuff.c @@ -16,7 +16,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; diff --git a/src/setups/setupwax.c b/src/setups/setupwax.c index 60394b049..7928d0b99 100644 --- a/src/setups/setupwax.c +++ b/src/setups/setupwax.c @@ -55,7 +55,7 @@ struct stagesetup setup = { intro, props, paths, - ailists, + NULL, NULL, }; @@ -1025,1227 +1025,3 @@ struct path paths[] = { { path37, 37, 0 }, { NULL, 0, 0 }, }; - -u8 func0401_init_hovercar[] = { - begin_hovercar_path(0x00) - set_vehicle_speed(0x0c00, 120) - - beginloop(0x04) - endloop(0x04) - - // Everything below here in this function is unreachable - label(0x08) - set_vehicle_speed(0x0600, 120) - goto_first(0x04) - - label(0x09) - set_vehicle_speed(0x0700, 120) - goto_first(0x04) - - label(0x0a) - set_vehicle_speed(0x0800, 120) - goto_first(0x04) - - label(0x0b) - set_vehicle_speed(0x0900, 120) - goto_first(0x04) - - label(0x0c) - set_vehicle_speed(0x0a00, 120) - goto_first(0x04) - - label(0x0d) - set_vehicle_speed(0x0b00, 120) - goto_first(0x04) - - label(0x0e) - set_vehicle_speed(0x0d00, 120) - goto_first(0x04) - - endlist -}; - -u8 func0402_start_path26[] = { - assign_path(26) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0403_start_path27[] = { - assign_path(27) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0404_start_path28[] = { - assign_path(28) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0405_start_path29[] = { - assign_path(29) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0406_start_path30[] = { - assign_path(30) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0407_start_path31[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_returnlist(CHR_SELF, 0x0407) - assign_path(31) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0408_start_path32[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - assign_path(32) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func0409_start_path33[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - assign_path(33) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040a_start_path34[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - assign_path(34) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040b_start_path35[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - assign_path(35) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040c_start_path36[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - assign_path(36) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func040d_start_path37[] = { - assign_path(37) - start_patrol - set_ailist(CHR_SELF, GAILIST_UNALERTED_0004) - endlist -}; - -u8 func1002_lightswitch[] = { - // Wait until switch activated - beginloop(0x04) - if_chr_activated_object(CHR_ANY, OBJ_LIGHTSWITCH, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - play_sound(SFX_PRESS_SWITCH, -1) - if_stage_flag_eq(STAGEFLAG_LIGHTS_OFF, TRUE, /*goto*/ 0x06) - - // Turning lights off - set_stage_flag(STAGEFLAG_LIGHTS_OFF) - set_lights_state(0x0044, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_1, 0x00, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_1, 0x00, 0x00, 0x00) - reloop(0x04) - - // Turning lights on - label(0x06) - unset_stage_flag(STAGEFLAG_LIGHTS_OFF) - set_lights_state(0x0044, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0039, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x003c, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x003d, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x003e, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x003b, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0042, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x003f, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x003a, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0041, LIGHTOP_1, 0x64, 0x00, 0x00) - set_lights_state(0x0040, LIGHTOP_1, 0x64, 0x00, 0x00) - endloop(0x04) - - endlist -}; - -u8 func1001_objectives_failed_msg[] = { - set_ailist(CHR_SELF, GAILIST_SHOW_OBJ_FAILED_MSG) - endlist -}; - -u8 func1000_setup_counterop[] = { - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - yield - set_chr_team(CHR_ANTI, TEAM_ENEMY) - give_object_to_chr(OBJ_BOND_BOMB, CHR_BOND) - if_chr_death_animation_finished(CHR_COOP, /*goto*/ 0x2c) - give_object_to_chr(OBJ_COOP_BOMB, CHR_COOP) - label(0x2c) - set_ailist(CHR_SELF, GAILIST_REBUILD_GROUPS) - endlist -}; - -u8 func040e_init_60hp_guard[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func040f_init_40hp_guard[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_ailist(CHR_SELF, GAILIST_UNALERTED) - endlist -}; - -u8 func0410_init_searching_guard[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 40) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_returnlist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - set_ailist(CHR_SELF, GAILIST_SEARCH_FOR_PLAYER) - endlist -}; - -u8 func0412_init_cass[] = { - set_chr_maxdamage(CHR_SELF, 40) -#if VERSION >= VERSION_NTSC_1_0 - set_self_chrflag(CHRCFLAG_PUSHABLE) -#endif - set_ailist(CHR_SELF, AILIST_CASS_IN_OFFICE) - endlist -}; - -u8 func0411_cass_in_office[] = { - if_chr_deadish(CHR_SELF, /*goto*/ 0x2c) - goto_next(0x06) - - // Dying - label(0x2c) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Not dying - label(0x06) - if_has_gun(CHR_SELF, /*goto*/ 0x2c) - set_self_chrflag(CHRCFLAG_INVINCIBLE) - set_stage_flag(STAGEFLAG_TRIGGER_YWSM) - set_shotlist(AILIST_CASS_RUNNING) - restart_timer -#if VERSION >= VERSION_NTSC_1_0 - speak(CHR_TARGET, L_WAX_008, MP3_0523, CHANNEL_6, COLOR_06_WHITE) // "Go to the helipad if you want to live." -#else - speak(CHR_TARGET, L_WAX_008, 0x1523, CHANNEL_6, COLOR_06_WHITE) // "Go to the helipad if you want to live." -#endif - chr_do_animation(ANIM_WALK_BACKWARDS, -1, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - yield - - // Wait 3 seconds - beginloop(0x08) - if_timer_gt(180, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_ailist(CHR_SELF, AILIST_CASS_RUNNING) - - // Waiting for player to enter office - label(0x2c) - if_self_flag_bankx_eq(CHRFLAG0_SKIPSAFETYCHECKS, TRUE, BANK_0, /*goto*/ 0x5a) - set_shotlist(AILIST_CASS_IN_OFFICE) - set_self_chrflag(CHRCFLAG_00040000) - if_chr_dead(CHR_CASS, /*goto*/ 0x06) - if_chr_knockedout(CHR_CASS, /*goto*/ 0x06) - goto_next(0x2c) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - label(0x2c) - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x54) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x55) - endloop(0x54) - - // Player has entered - label(0x55) - stop_chr - yield - try_face_entity(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x56) - - beginloop(0x56) - if_target_in_fov_left(10, /*goto*/ 0x57) - if_target_out_of_fov_left(246, /*goto*/ 0x57) - endloop(0x56) - - // Draw weapon - label(0x57) - set_self_flag_bankx(CHRFLAG0_SKIPSAFETYCHECKS, BANK_0) - chr_do_animation(ANIM_DRAW_PISTOL_0245, 0, -1, CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - try_equip_weapon(MODEL_CHRFALCON2, WEAPON_FALCON2, 0x00000000, /*goto*/ 0x2c) - label(0x2c) - speak(CHR_TARGET, L_WAX_007, SFX_81A3, CHANNEL_6, COLOR_04_ORANGE) // "Get the hell out of my office..." - - beginloop(0x58) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0x58) - - label(0x2c) - set_chr_flag_bankx(0x1e, CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) - set_chr_flag_bankx(0x20, CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) - set_chr_flag_bankx(0x1a, CHRFLAG0_CAN_HEAR_ALARMS, BANK_0) - yield - activate_alarm - - // Wait until player in disarm range - beginloop(0x5a) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_attack_target(/*goto*/ 0x83) - reloop(0x5a) - - label(0x83) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2c) - label(0x2c) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x82) - - // Wait until shooting animation finished - beginloop(0x82) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x82) - - label(0x06) - endloop(0x5a) - - endlist -}; - -u8 func0413_cass_running[] = { - chr_toggle_modelpart(CHR_CASS, MODELPART_CHR_NECKLACE) - unset_self_chrflag(CHRCFLAG_INVINCIBLE) - set_shotlist(AILIST_CASS_RUNNING) - if_chr_deadish(CHR_CASS, /*goto*/ 0x06) - goto_next(0x2c) - - // Dying - label(0x06) - set_shotlist(GAILIST_IDLE) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Not dying - label(0x2c) - if_just_injured(CHR_SELF, /*goto*/ 0xb5) - goto_next(0xb1) - - // Shot/hurt - wait until animation finished - beginloop(0xb5) - if_chr_stopped(/*goto*/ 0xb1) - endloop(0xb5) - - // Wait until Blonde's speech has finished ("go to the helipad") - beginloop(0xb1) - if_sound_finished(CHANNEL_6, /*goto*/ 0x03) - endloop(0xb1) - - label(0x03) - // Jog to roof. Keep looping until roof is reached or player has stopped - // looking at Cass. - restart_timer - jog_to_pad(PAD_WAX_0000) - - beginloop(0x08) - if_can_see_target(/*goto*/ 0x2c) - if_chr_stopped(/*goto*/ 0x0d) - goto_next(0x06) - label(0x2c) - endloop(0x08) - - // Player looked away from Cass. - // While still running to pad, wait 2 seconds... - label(0x06) - restart_timer - - beginloop(0x0a) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x0a) - - // Then stop and wait until in sight of player - label(0x2c) - stop_chr - - beginloop(0x09) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_can_see_target(/*goto*/ 0x2c) - endloop(0x09) - - // Consider saying something - label(0x2c) - do_preset_animation(PRESETANIM_TALKRANDOM) - restart_timer - if_stage_flag_eq(STAGEFLAG_CASS_SAID_YWSM, FALSE, /*goto*/ 0x06) - say_quip(CHR_TARGET, 0x2b, 0xff, 0x00, 0xff, BANK_1, 0x0a, 0x04) - - // And wait 2 seconds for the speech to finish - beginloop(0x0b) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x0b) - - // Return to jogging to the roof - label(0x06) - reloop(0x03) - - // At roof, or stopped for some other reason (eg. dead or maybe injured). - // Check distance to pad repeatedly. - label(0x0d) - stop_chr - -#if VERSION >= VERSION_NTSC_1_0 - beginloop(0x0e) - if_chr_distance_to_pad_gt(CHR_SELF, 200, PAD_WAX_0000, /*goto*/ 0x2c) - endloop(0x0e) - - // Continue jogging - label(0x2c) - goto_first(0x03) -#else - // ntsc-beta doesn't loop here, so once Cass stops running she won't start again? - yield -#endif - - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1004_check_cass_dead[] = { - // Wait until Cass dead - beginloop(0x03) - if_chr_deadish(CHR_CASS, /*goto*/ 0x2c) - endloop(0x03) - - label(0x2c) - show_hudmsg(CHR_BOND, L_WAX_014) // "Cassandra has been immobilized." - set_stage_flag(STAGEFLAG_CASS_DEAD) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1005_check_cass_captured[] = { - // Wait until Cass at helipad - beginloop(0x03) - if_chr_deadish(CHR_CASS, /*goto*/ 0x0d) - if_chr_y(CHR_CASS, 0, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - show_hudmsg(CHR_BOND, L_WAX_015) // "Cassandra has been captured successfully." - set_stage_flag(STAGEFLAG_CASS_CAPTURED) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Cass is not at helipad - label(0x2c) - endloop(0x03) - - // Died - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1006_lift_disabling[] = { - // If not PA, return - if_difficulty_lt(DIFF_PA, /*goto*/ 0x06) - goto_next(0x2c) - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Disable chief's lift - label(0x2c) - lock_door(0x50, 0x40) - set_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) - - // Wait until player Y above -4300 - beginloop(0x03) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -4300, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x03) - - // Disable player's lift - label(0x06) - set_lights_state(0x0082, LIGHTOP_2, 0x00, 0x78, 0x00) - play_sound(SFX_8147, -1) - set_object_flag(OBJ_BLONDE_LIFT, OBJFLAG_DEACTIVATED) - unlock_door(0x50, 0x40) - unset_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) - unset_chr_chrflag(CHR_CHIEF, CHRCFLAG_HIDDEN) - set_ailist(CHR_CHIEF, AILIST_CHIEF) - show_hudmsg(CHR_BOND, L_WAX_025) // "Lift has been disabled." - - // Wait until chief dead - beginloop(0x08) - if_chr_deadish(CHR_CHIEF, /*goto*/ 0x2c) - endloop(0x08) - - label(0x2c) - show_hudmsg(CHR_BOND, L_WAX_016) // "Security chief has been eliminated." - set_stage_flag(STAGEFLAG_CHIEF_DEAD) - restart_timer - - // Wait 2 seconds - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x09) - - // Activate lifts and exit - label(0x2c) - unset_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) - unset_object_flag(OBJ_BLONDE_LIFT, OBJFLAG_DEACTIVATED) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0414_init_chief[] = { - set_accuracy(40) - set_reaction_speed(100) - set_chr_maxdamage(CHR_SELF, 60) - add_health_or_armor(40) - set_recovery_speed(0) - set_shield(0) - set_morale(0) - set_self_chrflag(CHRCFLAG_HIDDEN) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0415_chief[] = { - set_shotlist(AILIST_CHIEF) - - // Check if dying - if_chr_deadish(CHR_CHIEF, /*goto*/ 0x2c) - goto_next(0x03) - label(0x2c) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Wait until player in sight - beginloop(0x03) - chr_toggle_p1p2(CHR_SELF) - set_target_chr(CHR_P1P2) - if_target_outside_my_yvisang(/*goto*/ 0x06) - if_target_in_sight(/*goto*/ 0x2c) - label(0x06) - reloop(0x03) - - // Attack while in sight - label(0x2c) - try_attack_stand(ATTACKFLAG_AIMATTARGET | ATTACKFLAG_AIMONLY, 0, /*goto*/ 0x2c) - label(0x2c) - try_modify_attack(ATTACKFLAG_AIMATTARGET, 0, /*goto*/ 0x82) - - beginloop(0x82) - if_chr_stopped(/*goto*/ 0x06) - endloop(0x82) - - label(0x06) - endloop(0x03) - - endlist -}; - -u8 func100f_disable_chiefs_lift[] = { - // If not PA, return - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - - // Wait until player above -4400 - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -4400, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - reloop(0x04) - - // Wait until chief above -4600 - label(0x06) - if_chr_y(CHR_CHIEF, -4600, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x04) - - // Wait half a second - label(0x06) - restart_timer - - beginloop(0x0a) - if_timer_gt(30, /*goto*/ 0x06) - endloop(0x0a) - - // Disable chief's lift - label(0x06) - set_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) - - // A or SA - return - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1007_bomb_logic[] = { - // Wait until in lab elevator and has bomb equipped - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_in_room(CHR_P1P2, 0x00, 0x002b, /*goto*/ 0x2c) - reloop(0x04) - - label(0x2c) - if_chr_weapon_equipped(CHR_P1P2, WEAPON_SKEDARBOMB, /*goto*/ 0x2c) - endloop(0x04) - - // Plant bomb - label(0x2c) - show_hudmsg(CHR_BOND, L_WAX_022) // "Skedar bomb has been placed successfully." - remove_weapon_from_inventory(WEAPON_SKEDARBOMB) - set_stage_flag(STAGEFLAG_BOMB_PLANTED) - disable_object(OBJ_BOND_BOMB) - disable_object(OBJ_COOP_BOMB) - assign_sound(SFX_8144, CHANNEL_1) - play_sound_from_object(CHANNEL_1, OBJ_PLANTED_BOMB, 1, 600, 1200) - unset_object_flag2(OBJ_PLANTED_BOMB, OBJFLAG2_INVISIBLE) - set_object_image(OBJ_PLANTED_BOMB, 0, TVCMDLIST_0F) - unset_object_flag(OBJ_PLANTED_BOMB, OBJFLAG_INVINCIBLE) - - // Start 4 minute timer - set_countdown_timer(240) - show_countdown_timer - start_countdown_timer - - beginloop(0x08) - if_countdown_timer_gt(0, /*goto*/ 0x2d) - goto_next(0x2c) - label(0x2d) - if_object_in_good_condition(OBJ_PLANTED_BOMB, /*goto*/ 0x06) - goto_next(0xb2) - label(0x06) - endloop(0x08) - - // Timer expired - // @bug: This stage flag should be set when the bomb is exploding. It is not - // set when the bomb is damaged. - label(0x2c) - set_countdown_timer(0) - stop_countdown_timer - set_stage_flag(STAGEFLAG_BOMB_EXPIRED) - show_hudmsg(CHR_BOND, L_WAX_023) // "Skedar bomb has detonated." - - // Wait 2 seconds - restart_timer - beginloop(0x09) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0x09) - - // Bomb exploding - label(0xb2) - label(0x2c) - explosions_around_chr(CHR_BOND) - - // Wait 2 seconds for player to die - restart_timer - - beginloop(0xb4) - if_timer_gt(120, /*goto*/ 0x2c) - endloop(0xb4) - - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1008_check_bomb_unplantable[] = { - // If Agent, return - if_difficulty_lt(DIFF_SA, /*goto*/ 0x0d) - - // Wait until bomb planted or alarm active - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_BOMB_PLANTED, TRUE, /*goto*/ 0x06) - if_alarm_active(/*goto*/ 0x2c) - reloop(0x04) - - // Bomb planted - return - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Alarm active - lock door and wait for door to be closed or bomb planted - label(0x2c) - lock_door(0x2e, 0x40) - lock_door(0x2f, 0x40) - - beginloop(0xb1) - if_stage_flag_eq(STAGEFLAG_BOMB_PLANTED, TRUE, /*goto*/ 0x0d) - if_door_state(0x2e, DOORSTATE_CLOSED, /*goto*/ 0xb2) - reloop(0xb1) - - // Door is closed - label(0xb2) - yield - chr_toggle_p1p2(CHR_SELF) - if_stage_flag_eq(STAGEFLAG_BOMB_PLANTED, TRUE, /*goto*/ 0x0d) - if_chr_in_room(CHR_BOND, 0x00, 0x002b, /*goto*/ 0x06) - if_chr_in_room(CHR_COOP, 0x00, 0x002b, /*goto*/ 0x06) - goto_next(0x2c) - label(0x06) - endloop(0xb1) - - // Fail mission - label(0x2c) - show_hudmsg(CHR_BOND, L_WAX_024) // "Lift doors locked - bomb cannot be placed." - set_stage_flag(STAGEFLAG_BOMB_UNPLANTABLE) - - // Difficulty is agent or bomb has been planted - return - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - - label(0x2c) - endloop(0x04) - - endlist -}; - -u8 func1009_toggle_top_guards[] = { - disable_chr(0x00) - disable_chr(0x0b) - disable_chr(0x09) - disable_chr(0x1e) - disable_chr(0x1f) - disable_chr(0x20) - disable_chr(0x07) - disable_chr(0x0a) - disable_chr(0x0c) - disable_chr(0x18) - disable_chr(0x19) - disable_chr(0x1a) - disable_chr(0x1b) - disable_chr(0x1c) - disable_chr(0x1d) - disable_chr(0x08) - disable_chr(0x0d) - disable_chr(0x17) - disable_chr(0x06) - disable_chr(0x05) - - // Wait until player above -4100 - beginloop(0x04) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, -4100, OPERATOR_LESS_THAN, /*goto*/ 0x2c) - goto_next(0x06) - label(0x2c) - endloop(0x04) - - // Show chrs - label(0x06) - enable_chr(0x00) - yield - enable_chr(0x0b) - yield - enable_chr(0x09) - yield - enable_chr(0x1e) - yield - enable_chr(0x1f) - yield - enable_chr(0x20) - yield - enable_chr(0x07) - yield - enable_chr(0x0a) - yield - enable_chr(0x0c) - yield - enable_chr(0x18) - yield - enable_chr(0x19) - yield - enable_chr(0x1a) - yield - enable_chr(0x1b) - yield - enable_chr(0x1c) - yield - enable_chr(0x1d) - yield - enable_chr(0x08) - yield - enable_chr(0x0d) - yield - enable_chr(0x17) - yield - enable_chr(0x06) - yield - enable_chr(0x05) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100a_check_for_completion[] = { - // Wait until all objectives complete - beginloop(0x04) - if_all_objectives_complete(/*goto*/ 0x2c) - reloop(0x04) - - // Wait until player at helipad - label(0x2c) - chr_toggle_p1p2(CHR_SELF) - if_chr_y(CHR_P1P2, 0, OPERATOR_LESS_THAN, /*goto*/ 0x2d) - - // Wait 1 second - restart_timer - - beginloop(0x08) - if_timer_gt(60, /*goto*/ 0x06) - endloop(0x08) - - // If either player is alive - label(0x06) - if_chr_deadish(CHR_BOND, /*goto*/ 0x2c) - goto_next(0x06) - - label(0x2c) - if_chr_deadish(CHR_COOP, /*goto*/ 0x2c) - goto_next(0x06) - - // Both players dead - label(0x2c) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - - // At least one player is alive - label(0x06) - set_ailist(CHR_SELF, AILIST_OUTRO) - end_level - - set_ailist(CHR_SELF, GAILIST_IDLE) - - // Player not at helipad - label(0x2d) - endloop(0x04) - - endlist -}; - -u8 func100b_start_lifts[] = { - activate_lift(2, 0x55) - activate_lift(1, 0x56) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100c_lift_doors[] = { - // Wait until player activated a lift door - beginloop(0xc1) - chr_toggle_p1p2(CHR_SELF) - if_chr_activated_object(CHR_P1P2, 0x57, /*goto*/ 0xb1) - if_chr_activated_object(CHR_P1P2, 0x58, /*goto*/ 0xb1) - if_chr_activated_object(CHR_P1P2, 0x59, /*goto*/ 0xb1) - if_chr_activated_object(CHR_P1P2, 0x5a, /*goto*/ 0x2d) - if_chr_activated_object(CHR_P1P2, 0x5b, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x5e, /*goto*/ 0x2c) - if_chr_activated_object(CHR_P1P2, 0x5c, /*goto*/ 0x2d) - if_chr_activated_object(CHR_P1P2, 0x5d, /*goto*/ 0x2d) - reloop(0xc1) - - label(0xb1) - if_door_locked(0x50, 0x40, /*goto*/ 0x2d) - goto_next(0x2c) - - label(0x2c) - play_sound(SFX_DOOR_81B0, -1) - goto_next(0x06) - - // Door locked - label(0x2d) - play_sound(SFX_MENU_SELECT, -1) - - // Wait 2 seconds - label(0x06) - restart_timer - - beginloop(0x08) - if_timer_gt(120, /*goto*/ 0x06) - endloop(0x08) - - label(0x06) - endloop(0xc1) - - endlist -}; - -u8 func0416_intro[] = { - set_object_flag2(0x61, OBJFLAG2_INVISIBLE) - set_object_flag2(0x62, OBJFLAG2_INVISIBLE) - unset_object_flag(0x61, OBJFLAG_00000100) - unset_object_flag(0x62, OBJFLAG_00000100) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_INTRO) - camera_movement(ANIM_CUT_WAX_INTRO_CAM) - cmd0175(60) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_WAX_INTRO_MRB, -1, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 4) - restart_timer - fade_to_color(0x000000ff, 0) - fade_to_color(0x00000000, 110) - set_cutscene_weapon(CHR_BOND, WEAPON_NONE, WEAPON_NONE) - yield - set_cutscene_weapon(CHR_BOND, WEAPON_MAULER, WEAPON_NONE) - open_door(OBJ_LOBBYDOOR_LEFT) - open_door(OBJ_LOBBYDOOR_RIGHT) - - #define wait_until(time, loopid) \ - beginloop(loopid) \ - if_controller_button_pressed(/*goto*/ 0xba) \ - if_timer_gt(time, /*goto*/ 0x06) \ - endloop(loopid) \ - \ - label(0x06) - - wait_until(106, 0xb1) - play_sound(SFX_0162, CHANNEL_10) - play_sound(SFX_047A, CHANNEL_10) - - wait_until(107, 0xb3) - open_door(OBJ_LOBBYDOOR_LEFT) - open_door(OBJ_LOBBYDOOR_RIGHT) - - wait_until(170, 0xb2) - play_sound(SFX_0163, CHANNEL_10) - - wait_until(246, 0xb6) - play_sound(SFX_0161, CHANNEL_10) - - wait_until(280, 0xb7) - close_door(OBJ_LOBBYDOOR_LEFT) - close_door(OBJ_LOBBYDOOR_RIGHT) - - wait_until(290, 0xb9) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0xba) - label(0x2c) - if_controller_button_pressed(/*goto*/ 0xba) - label(0x2c) - endloop(0x08) - - // Controller button pressed or cutscene finished - label(0xba) - disable_object(OBJ_LOBBYDOOR_LEFT) - disable_object(OBJ_LOBBYDOOR_RIGHT) - unset_object_flag2(0x61, OBJFLAG2_INVISIBLE) - unset_object_flag2(0x62, OBJFLAG2_INVISIBLE) - set_object_flag(0x61, OBJFLAG_00000100) - set_object_flag(0x62, OBJFLAG_00000100) - mute_channel(CHANNEL_10) - unset_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - unset_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - chr_do_animation(ANIM_CUT_WAX_INTRO_MRB, -2, -1, CHRANIMFLAG_MOVEWHENINVIS | CHRANIMFLAG_PAUSEATEND, 0, CHR_BOND, 2) - stop_cutscene_track - stop_ambient_track - enter_firstperson - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func0417_outro[] = { - set_invincible(CHR_BOND) - disable_object(OBJ_SHUTTLE1) - set_chr_chrflag(CHR_COOP, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_ANTI, CHRCFLAG_HIDDEN) - play_cutscene_track(MUSIC_G5_OUTRO) - camera_movement(ANIM_CUT_WAX_OUTRO_CAM) - set_chr_chrflag(CHR_BOND, CHRCFLAG_UNPLAYABLE) - set_chr_hiddenflag(CHR_BOND, CHRHFLAG_00020000) - set_chr_chrflag(CHR_BOND, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_CASS, CHRCFLAG_HIDDEN) - set_chr_chrflag(CHR_CASS, CHRCFLAG_INVINCIBLE) - enable_object(OBJ_SHUTTLE2) - set_object_flag2(OBJ_SHUTTLE2, OBJFLAG2_04000000) - set_object_flag3(OBJ_SHUTTLE2, OBJFLAG3_00000010) - object_do_animation(ANIM_CUT_WAX_OUTRO_SKSHUTTLE, OBJ_SHUTTLE2, 0x04, 0xffff) - show_nonessential_chrs(FALSE) - restart_timer - object_set_modelpart_visible(OBJ_SHUTTLE2, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - - beginloop(0x08) - if_camera_animating(/*goto*/ 0x2c) - goto_next(0xba) - label(0x2c) - if_controller_button_pressed(/*goto*/ 0xba) - label(0x2c) - endloop(0x08) - - label(0xba) - disable_object(OBJ_SHUTTLE2) - - label(0x06) - end_level - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func100e_cass_speech[] = { - // Wait until trigger - beginloop(0x04) - if_stage_flag_eq(STAGEFLAG_TRIGGER_YWSM, TRUE, /*goto*/ 0x2c) - endloop(0x04) - - // Wait until channel empty - label(0x2c) - yield - - beginloop(0xb1) - if_sound_finished(CHANNEL_6, /*goto*/ 0x2c) - endloop(0xb1) - - // Speak - label(0x2c) - restart_timer -#if VERSION >= VERSION_NTSC_1_0 - speak(CHR_CASS, L_WAX_013, MP3_02F5 | 0x4000 | 0x2000, CHANNEL_6, COLOR_04_ORANGE) // "You won't shoot me!" -#else - speak(CHR_TARGET, L_WAX_013, MP3_02F5, CHANNEL_6, COLOR_04_ORANGE) // "You won't shoot me!" -#endif - chr_do_animation(ANIM_TALKING_00A0, 0, 193, CHRANIMFLAG_COMPLETED | CHRANIMFLAG_SLOWUPDATE, 16, CHR_SELF, 2) - - beginloop(0x09) - if_timer_gt(80, /*goto*/ 0x06) - endloop(0x09) - - label(0x06) - set_stage_flag(STAGEFLAG_CASS_SAID_YWSM) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1010_init_lighting[] = { - yield - configure_environment(0x0000, AIENVCMD_00, TRUE) - configure_environment(0x0000, AIENVCMD_01, FALSE) - configure_environment(0x0000, AIENVCMD_02, FALSE) - configure_environment(0x0000, AIENVCMD_03, FALSE) - configure_environment(0x0000, AIENVCMD_04, FALSE) - configure_environment(0x0002, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0002, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0003, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x0004, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0005, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0006, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0007, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0008, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0009, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000a, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000b, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000c, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000d, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000e, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x000f, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0010, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0011, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0012, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0013, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x0014, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x003a, AIENVCMD_ROOM_SETAMBIENT, TRUE) - configure_environment(0x00a2, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a4, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a5, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - configure_environment(0x00a7, AIENVCMD_ROOM_SETOUTDOORS, TRUE) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -u8 func1011_shuttle_animation[] = { - yield - enable_object(OBJ_SHUTTLE1) - set_object_flag3(OBJ_SHUTTLE1, OBJFLAG3_00000010) - object_set_modelpart_visible(OBJ_SHUTTLE1, MODELPART_SKSHUTTLE_GANGWAY, FALSE) - label(0x09) - restart_timer - - // Some kind of animation on repeat - beginloop(0x08) -#if VERSION >= VERSION_NTSC_1_0 - object_do_animation(ANIM_0489, OBJ_SHUTTLE1, 0x08, 0xffff) -#else - if_all_objectives_complete(/*goto*/ 0x06) - object_do_animation(ANIM_0489, OBJ_SHUTTLE1, 0x04, 0xffff) -#endif - endloop(0x08) - - // Unreachable - label(0x06) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; - -#if VERSION >= VERSION_NTSC_1_0 -u8 func1012_chief_lift[] = { - yield - - // If A or SA, return - if_difficulty_lt(DIFF_PA, /*goto*/ 0x0d) - - // Wait until chief dead - beginloop(0x04) - if_objective_complete(1, /*goto*/ 0x2c) - endloop(0x04) - - // Wait 3 seconds - label(0xc1) - label(0x2c) - restart_timer - - beginloop(0xb1) - if_timer_gt(180, /*goto*/ 0x2c) - endloop(0xb1) - - // Activate chief's lift - label(0x2c) - unset_object_flag(OBJ_CHIEF_LIFT, OBJFLAG_DEACTIVATED) - - // The goto first here means that the lift continues to be activated every - // 3 seconds, but it is never deactivated so this is a no op. - goto_first(0xc1) - - // A or SA - return - label(0x0d) - set_ailist(CHR_SELF, GAILIST_IDLE) - endlist -}; -#endif - -struct ailist ailists[] = { - { func0401_init_hovercar, 0x0401 }, - { func0402_start_path26, 0x0402 }, - { func0403_start_path27, 0x0403 }, - { func0404_start_path28, 0x0404 }, - { func0405_start_path29, 0x0405 }, - { func0406_start_path30, 0x0406 }, - { func0407_start_path31, 0x0407 }, - { func0408_start_path32, 0x0408 }, - { func0409_start_path33, 0x0409 }, - { func040a_start_path34, 0x040a }, - { func040b_start_path35, 0x040b }, - { func040c_start_path36, 0x040c }, - { func040d_start_path37, 0x040d }, - { func040e_init_60hp_guard, 0x040e }, - { func040f_init_40hp_guard, 0x040f }, - { func0410_init_searching_guard, 0x0410 }, - { func0411_cass_in_office, 0x0411 }, - { func0412_init_cass, 0x0412 }, - { func0413_cass_running, 0x0413 }, - { func0414_init_chief, 0x0414 }, - { func0415_chief, 0x0415 }, - { func0416_intro, 0x0416 }, - { func0417_outro, 0x0417 }, - { func1000_setup_counterop, 0x1000 }, - { func1001_objectives_failed_msg, 0x1001 }, - { func1002_lightswitch, 0x1002 }, - { func0416_intro, 0x1003 }, - { func1004_check_cass_dead, 0x1004 }, - { func1005_check_cass_captured, 0x1005 }, - { func1006_lift_disabling, 0x1006 }, - { func1007_bomb_logic, 0x1007 }, - { func1008_check_bomb_unplantable, 0x1008 }, - { func1009_toggle_top_guards, 0x1009 }, - { func100a_check_for_completion, 0x100a }, - { func100b_start_lifts, 0x100b }, - { func100c_lift_doors, 0x100c }, - { func100e_cass_speech, 0x100e }, - { func100f_disable_chiefs_lift, 0x100f }, - { func1010_init_lighting, 0x1010 }, - { func1011_shuttle_animation, 0x1011 }, -#if VERSION >= VERSION_NTSC_1_0 - { func1012_chief_lift, 0x1012 }, -#endif - - { func0416_intro, 0x0c00 }, - { func0417_outro, 0x0c01 }, - { NULL, 0 }, -}; diff --git a/tools/ai2asm/ai2asm.py b/tools/ai2asm/ai2asm.py new file mode 100755 index 000000000..43c283ba0 --- /dev/null +++ b/tools/ai2asm/ai2asm.py @@ -0,0 +1,2008 @@ +#!/usr/bin/env python3 + +import commands +import os +import struct +import sys + +""" +ai2asm - Convert a binary AI data file to assembly. + +Usage: + ai2asm + +Assembly is printed to stdout. +""" + + +class App(): + + def run(self): + self.commands = commands.get_commands() + ailists = self.load_lists() + + self.print_header() + self.next_temp_label_id = 0 + + for offset in ailists: + self.convert_list(ailists[offset]) + + self.print_table(ailists) + + def load_lists(self): + ailists = {} + seen_ids = {} + + fd = open(sys.argv[1], 'rb') + contents = fd.read() + fd.close() + + if 'gailists' in sys.argv[1]: + pos = int.from_bytes(contents[0:4], 'big') + self.stage = 'global' + else: + pos = int.from_bytes(contents[0x18:0x1c], 'big') + self.stage = os.path.basename(sys.argv[1]).replace('setup', '').replace('.bin', '') + + while True: + listoffset = int.from_bytes(contents[pos:pos+4], 'big') + listid = int.from_bytes(contents[pos+4:pos+8], 'big') + pos += 8 + + if listoffset == 0 and len(ailists) > 0: + break + + if listid in seen_ids: + print('Duplicate ID: %04x' % listid, file=sys.stderr) + exit(1) + + seen_ids[listid] = True + + if listoffset not in ailists: + listcmds = self.parse_ailist(contents[listoffset:]) + ailists[listoffset] = {'ids': [], 'cmds': listcmds} + + ailists[listoffset]['ids'].append(listid) + + return ailists + + def parse_ailist(self, data): + listcmds = [] + pos = 0 + + while True: + type = int.from_bytes(data[pos:pos+2], 'big') + length = self.commands[type]['len'] + listcmds.append({'id': type, 'params': data[pos+2:pos+length]}) + pos += length + + if type == 0x0004: + break + + return listcmds + + def print_header(self): + print('#include "macros.inc"') + print('.text') + print('') + + def print_table(self, ailists): + entries = [] + + for offset in ailists: + for id in ailists[offset]['ids']: + entries.append(id) + + entries.sort() + + print('') + print('.data') + + if self.stage == 'global': + print('glabel g_GlobalAilists') + else: + print('glabel g_StageAilists_%s' % self.stage) + + for id in entries: + print('.word %s' % self.ailist_name(id)) + print('.word 0x%04x' % id) + + print('.word 0') + print('.word 0') + + def print_missing(self): + for cmdid in self.missing: + definition = self.commands[cmdid] + + def convert_list(self, ailist): + for id in ailist['ids']: + print('glabel %s' % self.ailist_name(id)) + + self.cur_list_id = ailist['ids'][0] + self.labels = {} + + for cmd in ailist['cmds']: + definition = self.commands[cmd['id']] + callback = getattr(self, 'ai_' + definition['macro']) + try: + callback(cmd['params']) + except NotImplementedError: + print('Not implemented: %04x (%s)' % (cmd['id'], definition['macro']), file=sys.stderr) + print('') + + def s8(self, value): + if value >= 0x80: + value -= 0x100 + return value + + def s16(self, params, offset): + value = self.u16(params, offset) + if value >= 0x8000: + value -= 0x10000 + return value + + def u16(self, params, offset): + return int.from_bytes(params[offset:offset+2], 'big') + + def u32(self, params, offset): + return int.from_bytes(params[offset:offset+4], 'big') + + def temp_label(self): + label = '.Ltemp%d' % self.next_temp_label_id + self.next_temp_label_id += 1 + return label + + def emit(self, instruction, params=[]): + print('\t% -10s%s' % (instruction, ', '.join(map(str, params)))) + + def emit_beqz_label(self, label): + self.emit('beqz', ['$v0', self.label_name(label)]) + + def emit_bnez_label(self, label): + self.emit('bnez', ['$v0', self.label_name(label)]) + + def emit_raw(self, line): + print(line) + + def emit_store_to_stack(self, stackoffset, value): + if value == 0: + self.emit('sw', ['$zero', '0x%x($sp)' % stackoffset]) + else: + self.emit('li', ['$t0', value]) + self.emit('sw', ['$t0', '0x%x($sp)' % stackoffset]) + + def ailist_name(self, ailistid): + if ailistid < 0x100: + return 'ailist_%04x' % ailistid + return 'ailist_%s_%04x' % (self.stage, ailistid) + + def label_name(self, label_id, index=None): + if index is None: + if label_id in self.labels: + index = self.labels[label_id] + 1 + else: + index = 0 + return '.L%04x_%02x_%02x' % (self.cur_list_id, label_id, index) + + def ai_activate_alarm(self, params): + self.emit('jal', ['alarmActivate']) + + def ai_activate_lift(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiActivateLift']) + + def ai_add_health_or_armor(self, params): + self.emit('li.s', ['$f12', self.u16(params, 0) / 10]) + self.emit('jal', ['aiAddHealth']) + + def ai_add_morale(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiAddMorale']) + + def ai_add_motion_blur(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiChrAddMotionBlur']) + + def ai_assign_path(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetPath']) + + def ai_assign_sound(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', self.s8(params[2])]) + self.emit('jal', ['aiAssignSound']) + + def ai_begin_hovercar_path(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiHovercarBeginPath']) + + def ai_call_rng(self, params): + self.emit('jal', ['aiCallRng']) + + def ai_camera_movement(self, params): + # aiSetCameraAnimation returns true if we should yield + # and re-run aiSetCameraAnimation again on the next invocation + start = self.temp_label() + end = self.temp_label() + self.emit_raw('%s:' % start) + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiSetCameraAnimation']) + self.emit('beqz', ['$v0', end]) + self.emit('jal', ['aiYield']) + self.emit('b', [start]) + self.emit_raw('%s:' % end) + + def ai_check_cover_out_of_sight(self, params): + self.emit('jal', ['aiCheckCoverOutOfSight']) + self.emit_bnez_label(params[0]) + + def ai_chopper_arm_weapons(self, params): + self.emit('jal', ['aiHeliArmWeapons']) + + def ai_chr_damage_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', params[2]]) + self.emit('jal', ['aiChrDamageChr']) + + def ai_chr_do_animation(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('li', ['$a2', '0x%04x' % self.u16(params, 4)]) + self.emit('li', ['$a3', '0x%02x' % params[6]]) + self.emit_store_to_stack(0x10, params[7]) + self.emit_store_to_stack(0x14, params[8]) + self.emit_store_to_stack(0x18, params[9]) + self.emit('jal', ['aiChrDoAnimation']) + + def ai_chr_draw_weapon(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiChrDrawWeapon']) + + def ai_chr_draw_weapon_in_cutscene(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiChrDrawWeaponInCutscene']) + + def ai_chr_drop_weapon(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrDropWeapon']) + + def ai_chr_move_to_pad(self, params): + if params[3] == 88: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[2]]) + self.emit('jal', ['aiChrMoveToChr']) + else: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('li', ['$a2', params[3]]) + self.emit('jal', ['aiChrMoveToPad']) + self.emit_bnez_label(params[4]) + + def ai_chr_recover_gun(self, params): + self.emit('jal', ['aiRecoverGun']) + self.emit('b', [self.label_name(params[1])]) + + def ai_chr_toggle_modelpart(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiChrToggleModelPart']) + + def ai_chr_toggle_p1p2(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrToggleP1P2']) + + def ai_clear_inventory(self, params): + self.emit('jal', ['aiClearInventory']) + + def ai_close_door(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiCloseDoor']) + + def ai_cmd012f(self, params): + self.emit('jal', ['aiSetCoverUnused']) + + def ai_cmd0139(self, params): + self.emit('li', ['$a0', self.u32(params, 0)]) + self.emit('li', ['$a1', params[4]]) + self.emit('li', ['$a2', params[5]]) + self.emit('jal', ['ai0139']) + + def ai_cmd0175(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['playerReorientForCutsceneStop']) + + def ai_cmd0176_if_something(self, params): + self.emit('jal', ['ai0176']) + self.emit_bnez_label(params[0]) + + def ai_cmd01b4_if_something(self, params): + self.emit('jal', ['ai01b4']) + self.emit_bnez_label(params[0]) + + def ai_configure_environment(self, params): + if params[2] == 0: + self.emit('li', ['$v0', params[3]]) + self.emit('lui', ['$a0', '%hi(var8006ae18)']) + self.emit('sb', ['$v0', '%lo(var8006ae18)($a0)']) + elif params[2] == 1: + self.emit('li', ['$v0', params[3]]) + self.emit('lui', ['$a0', '%hi(var8006ae1c)']) + self.emit('sb', ['$v0', '%lo(var8006ae1c)($a0)']) + elif params[2] == 2: + self.emit('li', ['$v0', params[3]]) + self.emit('lui', ['$a0', '%hi(var8006ae20)']) + self.emit('sb', ['$v0', '%lo(var8006ae20)($a0)']) + elif params[2] == 3: + self.emit('li', ['$v0', params[3]]) + self.emit('lui', ['$a0', '%hi(var8006ae24)']) + self.emit('sb', ['$v0', '%lo(var8006ae24)($a0)']) + elif params[2] == 4: + self.emit('li', ['$v0', params[3]]) + self.emit('lui', ['$a0', '%hi(var8006ae28)']) + self.emit('sb', ['$v0', '%lo(var8006ae28)($a0)']) + elif params[2] == 5: + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x4000']) + self.emit('jal', ['aiSetRoomFlag' if params[3] else 'aiUnsetRoomFlag']) + elif params[2] == 6: + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x8000']) + self.emit('jal', ['aiSetRoomFlag' if params[3] else 'aiUnsetRoomFlag']) + elif params[2] == 7: + raise NotImplementedError + elif params[2] == 8: + raise NotImplementedError + elif params[2] == 9: + self.emit('jal', ['aiSetAllRoomsAmbient' if params[3] else 'aiUnsetAllRoomsAmbient']) + elif params[2] == 10: + self.emit('li', ['$a0', params[3]]) + self.emit('jal', ['sndPlayNosedive']) + elif params[2] == 11: + self.emit('jal', ['musicTickEvents']) + elif params[2] == 12: + self.emit('li', ['$a0', '0x%04x' % params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['roomSetLightsFaulty']) + elif params[2] == 13: + self.emit('jal', ['sndStopNosedive']) + elif params[2] == 14: + self.emit('li', ['$a0', params[3]]) + self.emit('jal', ['sndPlayUfo']) + elif params[2] == 15: + self.emit('jal', ['sndStopUfo']) + else: + raise NotImplementedError + + def ai_consider_throwing_grenade(self, params): + self.emit('jal', ['aiConsiderGrenadeThrow']) + self.emit_bnez_label(params[4]) + + def ai_control_sound_from_object(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', params[3]]) + self.emit('jal', ['ai00cf']) + + def ai_damage_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', self.s8(params[1])]) + self.emit('li', ['$a2', '0x%08x' % (params[2] << 24)]) + self.emit('jal', ['aiDamageChr']) + + def ai_damage_chr_by_amount(self, params): + if params[2] == 0: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li.s', ['$a1', self.s8(params[1]) / 32]) + self.emit('jal', ['aiDamageChrByAmount']) + elif params[2] == 2: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li.s', ['$a1', self.s8(params[1]) / 32]) + self.emit('jal', ['aiDamageAndPoisonChrByAmount']) + else: + raise NotImplementedError + + def ai_deactivate_alarm(self, params): + self.emit('jal', ['alarmDeactivate']) + + def ai_destroy_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiDestroyObject']) + + def ai_disable_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiDisableChr']) + + def ai_disable_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiDisableObj']) + + def ai_do_gun_command(self, params): + if params[0] == 0: + self.emit('jal', ['aiGoToGun']) + self.emit('b', [self.label_name(params[1])]) + else: + self.emit('jal', ['aiIfGunLanded']) + self.emit_bnez_label(params[1]) + + def ai_do_preset_animation(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiDoPresetAnimation']) + + def ai_drop_concealed_items(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrDropItems']) + + def ai_drop_gun_and_fade_out(self, params): + self.emit('jal', ['aiFadeOut']) + + def ai_emit_sparks(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrEmitSparks']) + + def ai_enable_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiEnableChr']) + + def ai_enable_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiEnableObj']) + + def ai_enable_rain(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['weatherConfigureRain']) + + def ai_enable_snow(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['weatherConfigureSnow']) + + def ai_end_level(self, params): + self.emit('jal', ['aiEndLevel']) + + def ai_endlist(self, params): + pass + + def ai_enter_camera_and_move_to_pad(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['playerPrepareWarpType1']) + + def ai_enter_firstperson(self, params): + self.emit('jal', ['playerEndCutscene']) + + def ai_explosions_around_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrExplosions']) + + def ai_fade_to_color(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + self.emit('li', ['$a1', self.u16(params, 4)]) + self.emit('jal', ['lvConfigureFade']) + + def ai_find_cover(self, params): + self.emit('li', ['$a0', '0x%02x' % self.u16(params, 0)]) + self.emit('jal', ['aiFindCover']) + self.emit_bnez_label(params[2]) + + def ai_force_walk(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('li', ['$a2', params[3]]) + self.emit('li', ['$a3', params[4]]) + self.emit_store_to_stack(0x10, params[5]) + self.emit_store_to_stack(0x14, params[6]) + self.emit('jal', ['aiAutoWalk']) + + def ai_give_object_to_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiGiveObjectToChr']) + + def ai_go_to_cover(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiGoToCover']) + + def ai_go_to_target_pad(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiGoToPadPreset']) + + def ai_goto_first(self, params): + self.emit('b', [self.label_name(params[0], 0)]) + + def ai_goto_next(self, params): + self.emit('b', [self.label_name(params[0])]) + + def ai_grab_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiChrGrabObject']) + + def ai_grant_control(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiGrantControl']) + + def ai_hide_countdown_timer(self, params): + self.emit('li', ['$a0', '1']) + self.emit('li', ['$a1', '0']) + self.emit('jal', ['countdownTimerSetVisible']) + + def ai_hovercopter_fire_rocket(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiHovercopterFireRocket']) + + def ai_if_alarm_active(self, params): + self.emit('lui', ['$a0', '%hi(g_AlarmTimer)']) + self.emit('lw', ['$v0', '%lo(g_AlarmTimer)($a0)']) + self.emit('bgtz', ['$v0', self.label_name(params[0])]) + + def ai_if_alertness(self, params): + self.emit('jal', ['aiGetAlertness']) + self.emit('li', ['$v1', '0x%02x' % params[0]]) + if params[1] == 0: + self.emit('blt', ['$v0', '$v1', self.label_name(params[2])]) + else: + self.emit('bgt', ['$v0', '$v1', self.label_name(params[2])]) + + def ai_if_all_chrs_in_squadron_are_dead(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfSquadronIsDead']) + self.emit_bnez_label(params[1]) + + def ai_if_all_objectives_complete(self, params): + self.emit('jal', ['objectiveIsAllComplete']) + self.emit_bnez_label(params[0]) + + def ai_if_ammo_quantity_lt(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('li', ['$a2', params[2]]) + self.emit('jal', ['aiIfChrAmmoQuantityLessThan']) + self.emit_bnez_label(params[3]) + + def ai_if_calculated_safety2_lt(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfSafety2LessThan']) + self.emit_bnez_label(params[1]) + + def ai_if_camera_animating(self, params): + self.emit('jal', ['aiIfInCutscene']) + self.emit_bnez_label(params[0]) + + def ai_if_can_hear_alarm(self, params): + self.emit('jal', ['aiIfCanHearAlarm']) + self.emit_bnez_label(params[0]) + + def ai_if_can_see_attack_target(self, params): + self.emit('jal', ['aiIfCanSeeAttackTarget']) + self.emit_bnez_label(params[0]) + + def ai_if_can_see_target(self, params): + self.emit('jal', ['aiIfCanSeeTarget']) + self.emit_bnez_label(params[0]) + + def ai_if_chr_activated_object(self, params): + if params[0] == 0xf3: + self.emit('li', ['$a0', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfAnyoneActivatedObject']) + else: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfChrActivatedObject']) + self.emit_bnez_label(params[2]) + + def ai_if_chr_alertness_lt(self, params): + raise NotImplementedError + + def ai_if_chr_dead(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrDead']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_deadish(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrDeadish']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_death_animation_finished(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrDeathAnimationFinished']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_distance_to_pad_gt(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 3)]) + self.emit('li.s', ['$a2', self.u16(params, 1) * 10]) + self.emit('jal', ['aiIfChrDistanceToPadGreaterThan']) + self.emit_bnez_label(params[5]) + + def ai_if_chr_distance_to_pad_lt(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 3)]) + self.emit('li.s', ['$a2', self.u16(params, 1) * 10]) + self.emit('jal', ['aiIfChrDistanceToPadLessThan']) + self.emit_bnez_label(params[5]) + + def ai_if_chr_has_chrflag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiIfChrHasChrflag']) + self.emit_bnez_label(params[5]) + + def ai_if_chr_has_flag_bankx(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('li', ['$a2', params[5]]) + self.emit('jal', ['aiIfChrHasFlag']) + self.emit_bnez_label(params[6]) + + def ai_if_chr_has_hiddenflag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiIfChrHasHiddenFlag']) + self.emit_bnez_label(params[5]) + + def ai_if_chr_has_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfChrHasObject']) + self.emit_bnez_label(params[2]) + + def ai_if_chr_idle(self, params): + self.emit('jal', ['aiIfIdle']) + self.emit_bnez_label(params[0]) + + def ai_if_chr_idle_action_eq(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfNaturalAnim']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_in_room(self, params): + if params[1] == 0: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiIfChrInSameRoomAsPad']) + elif params[1] == 1: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrInSearchRoom']) + else: + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiIfEyespyNearG5Pad']) + self.emit_bnez_label(params[4]) + + def ai_if_chr_in_squadron_doing_action(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrInSquadronDoingAction']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_in_view(self, params): + self.emit('jal', ['aiIfChrCanSeeTarget']) + self.emit_bnez_label(params[0]) + + def ai_if_chr_injured_target(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrInjuredTarget']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_is_skedar(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfSkedar']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_knockedout(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrKnockedOut']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_looking_at_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfPlayerLookingAtObject']) + self.emit_bnez_label(params[2]) + + def ai_if_chr_not_talking(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrNotTalking']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_same_floor_distance_to_pad_lt(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('li.s', ['$a2', self.u16(params, 3) * 10]) + self.emit('jal', ['aiIfChrSameFloorDistanceToPadLessThan']) + self.emit_bnez_label(params[5]) + + def ai_if_chr_shield_damaged(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfShieldDamaged']) + self.emit_bnez_label(params[1]) + + def ai_if_chr_shield_lt(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiGetChrShield']) + self.emit('li.s', ['$f2', self.u16(params, 1) / 10]) + self.emit('c.lt.s', ['$f0', '$f2']) + self.emit('bc1t', [self.label_name(params[3])]) + + def ai_if_chr_soundtimer(self, params): + self.emit('jal', ['aiGetSoundTimer']) + self.emit('li', ['$v1', self.u16(params, 0)]) + if params[2] == 0: + self.emit('bgt', ['$v0', '$v1', self.label_name(params[3])]) + else: + self.emit('blt', ['$v0', '$v1', self.label_name(params[3])]) + + def ai_if_chr_stopped(self, params): + self.emit('jal', ['aiIfStopped']) + self.emit_bnez_label(params[0]) + + def ai_if_chr_target_eq(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfStopped']) + self.emit_bnez_label(params[3]) + + def ai_if_chr_weapon_equipped(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfChrHasWeaponEquipped']) + self.emit_bnez_label(params[2]) + + def ai_if_chr_y(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li.s', ['$a1', self.s16(params, 1)]) + self.emit('jal', ['aiIfChrYGreaterThan' if params[3] else 'aiIfChrYLessThan']) + self.emit_bnez_label(params[4]) + + def ai_if_chrpresets_target_is_different(self, params): + self.emit('jal', ['aiIfPresetsTargetIsNotMyTarget']) + self.emit_bnez_label(params[0]) + + def ai_if_controller_button_pressed(self, params): + self.emit('jal', ['aiIfCutsceneButtonPressed']) + self.emit_bnez_label(params[0]) + + def ai_if_coop_mode(self, params): + self.emit('jal', ['aiIfCoopMode']) + self.emit_bnez_label(params[0]) + + def ai_if_countdown_timer_gt(self, params): + self.emit('jal', ['aiIfCountdownTimerExpired']) + self.emit_beqz_label(params[2]) + + def ai_if_countdown_timer_lt(self, params): + self.emit('jal', ['aiIfCountdownTimerExpired']) + self.emit_bnez_label(params[2]) + + def ai_if_dangerous_object_nearby(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfDangerousObjectNearby']) + self.emit_bnez_label(params[1]) + + def ai_if_detected_chr(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['ai0045']) + self.emit_bnez_label(params[1]) + + def ai_if_difficulty_gt(self, params): + self.emit('lui', ['$a0', '%hi(g_Difficulty)']) + self.emit('lw', ['$v0', '%lo(g_Difficulty)($a0)']) + if params[0] == 0: + self.emit('bnez', ['$v0', self.label_name(params[1])]) + else: + self.emit('li', ['$v1', params[0]]) + self.emit('bgt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_difficulty_lt(self, params): + self.emit('lui', ['$a0', '%hi(g_Difficulty)']) + self.emit('lw', ['$v0', '%lo(g_Difficulty)($a0)']) + if params[0] == 1: + self.emit('beqz', ['$v0', self.label_name(params[1])]) + else: + self.emit('li', ['$v1', params[0]]) + self.emit('blt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_distance_from_target_to_pad_gt(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiGetDistanceFromTargetToPad']) + self.emit('li.s', ['$f2', self.u16(params, 0) * 10]) + self.emit('c.le.s', ['$f0', '$f2']) + self.emit('bc1f', [self.label_name(params[4])]) + + def ai_if_distance_from_target_to_pad_lt(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiGetDistanceFromTargetToPad']) + self.emit('li.s', ['$f2', self.u16(params, 0) * 10]) + self.emit('c.lt.s', ['$f0', '$f2']) + self.emit('bc1t', [self.label_name(params[4])]) + + def ai_if_distance_to_chr_gt(self, params): + self.emit('li', ['$a0', params[2]]) + self.emit('jal', ['aiGetDistanceToChr']) + self.emit('li.s', ['$f2', self.u16(params, 0) * 10]) + self.emit('c.le.s', ['$f0', '$f2']) + self.emit('bc1f', [self.label_name(params[3])]) + + def ai_if_distance_to_chr_lt(self, params): + self.emit('li', ['$a0', params[2]]) + self.emit('jal', ['aiGetDistanceToChr']) + self.emit('li.s', ['$f2', self.u16(params, 0) * 10]) + self.emit('c.lt.s', ['$f0', '$f2']) + self.emit('bc1t', [self.label_name(params[3])]) + + def ai_if_distance_to_gun_lt(self, params): + self.emit('li.s', ['$f12', self.u16(params, 0) * 10]) + self.emit('jal', ['aiIfDistanceToGunLessThan']) + self.emit_bnez_label(params[2]) + + def ai_if_distance_to_target_gt(self, params): + self.emit('jal', ['aiGetDistanceToTarget']) + self.emit('li.s', ['$f2', self.u16(params, 0) * 10]) + self.emit('c.le.s', ['$f0', '$f2']) + self.emit('bc1f', [self.label_name(params[2])]) + + def ai_if_distance_to_target_lt(self, params): + self.emit('jal', ['aiGetDistanceToTarget']) + self.emit('li.s', ['$f2', self.u16(params, 0) * 10]) + self.emit('c.lt.s', ['$f0', '$f2']) + self.emit('bc1t', [self.label_name(params[2])]) + + def ai_if_door_locked(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfDoorLocked']) + self.emit_bnez_label(params[2]) + + def ai_if_door_state(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfDoorState']) + self.emit_bnez_label(params[2]) + + def ai_if_enemy_distance_lt_and_los(self, params): + self.emit('li.s', ['$f12', params[0] * 10]) + self.emit('jal', ['aiDetectEnemy']) + self.emit_bnez_label(params[1]) + + def ai_if_force_walk_finished(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfAutoWalkFinished']) + self.emit_bnez_label(params[1]) + + def ai_if_fov_check_with_target(self, params): + if params[2]: + self.emit('jal', ['aiIfCheckFovWithTarget2']) + elif params[1]: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfCheckFovWithTarget1']) + else: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfCheckFovWithTarget0']) + self.emit_bnez_label(params[3]) + + def ai_if_gun_unclaimed(self, params): + self.emit('jal', ['aiIfGunUnclaimed']) + self.emit_bnez_label(params[2]) # not a wrong index + + def ai_if_has_gun(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfChrHasGun']) + self.emit_bnez_label(params[2]) # not a wrong index + + def ai_if_has_orders(self, params): + self.emit('jal', ['aiIfHasOrders']) + self.emit_bnez_label(params[0]) + + def ai_if_heard_target_recently(self, params): + self.emit('jal', ['aiIfHeardTargetRecently']) + self.emit_bnez_label(params[0]) + + def ai_if_hears_target(self, params): + self.emit('jal', ['aiIfHearsTarget']) + self.emit_bnez_label(params[0]) + + def ai_if_hoverbot_next_step(self, params): + self.emit('jal', ['aiGetHoverbotNextStep']) + self.emit('li', ['$v1', params[1]]) + if params[0] == 1: + self.emit('bgt', ['$v0', '$v1', self.label_name(params[2])]) + else: + self.emit('blt', ['$v0', '$v1', self.label_name(params[2])]) + + def ai_if_just_injured(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfInjured']) + self.emit_bnez_label(params[1]) + + def ai_if_kill_count_gt(self, params): + self.emit('jal', ['aiGetKillCount']) + if params[0] == 0: + self.emit('bgtz', ['$v0', self.label_name(params[1])]) + else: + self.emit('li', ['$v1', params[0]]) + self.emit('bgt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_lift_stationary(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfLiftStationary']) + self.emit_bnez_label(params[1]) + + def ai_if_morale_lt(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfMoraleLessThan']) + self.emit_bnez_label(params[1]) + + def ai_if_music_event_queue_empty(self, params): + self.emit('lui', ['$a0', '%hi(g_MusicEventQueueLength)']) + self.emit('lw', ['$v0', '%lo(g_MusicEventQueueLength)($a0)']) + self.emit_beqz_label(params[1]) + + def ai_if_near_miss(self, params): + self.emit('jal', ['aiIfNearMiss']) + self.emit_bnez_label(params[0]) + + def ai_if_nearly_in_targets_sight(self, params): + self.emit('li', ['$a0', self.u32(params, 0)]) + self.emit('jal', ['aiIfNearlyInTargetsSight']) + self.emit_bnez_label(params[4]) + + def ai_if_never_been_onscreen(self, params): + self.emit('jal', ['aiIfNeverBeenOnScreen']) + self.emit_bnez_label(params[0]) + + def ai_if_num_chrs_in_squadron_gt(self, params): + self.emit('li', ['$a0', params[1]]) + self.emit('jal', ['aiGetNumChrsInSquadron']) + self.emit('li', ['$v1', params[0]]) + self.emit('bgt', ['$v0', '$v1', self.label_name(params[2])]) + + def ai_if_num_human_players_lt(self, params): + self.emit('jal', ['aiGetNumPlayers']) + self.emit('li', ['$v1', params[0]]) + self.emit('blt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_num_subdued(self, params): + self.emit('jal', ['mpstatsGetTotalKnockoutCount']) + if params[0] == 0 and params[1] == 0: # checking if > 0 + self.emit('bnez', ['$v0', self.label_name(params[2])]) + elif params[0] == 1 and params[1] == 1: # checking if < 1 + self.emit('beqz', ['$v0', self.label_name(params[2])]) + else: + raise NotImplementedError + + def ai_if_num_times_shot_gt(self, params): + self.emit('jal', ['aiGetNumTimesShot']) + self.emit('li', ['$v1', params[0]]) + self.emit('bgt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_num_times_shot_lt(self, params): + self.emit('jal', ['aiGetNumTimesShot']) + self.emit('li', ['$v1', params[0]]) + self.emit('blt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_object_distance_to_pad_lt(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 3)]) + self.emit('li.s', ['$a2', self.u16(params, 1) * 10]) + self.emit('jal', ['aiIfObjectDistanceToPadLessThan']) + self.emit_bnez_label(params[5]) + + def ai_if_object_flag2(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiIfObjHasFlag2']) + self.emit_bnez_label(params[5]) + + def ai_if_object_flag3(self, params): + raise NotImplementedError + + def ai_if_object_health_lt(self, params): + # Actually "if object damage taken is less than" + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiGetObjDamage']) + self.emit('li', ['$v1', self.u16(params, 1)]) + self.emit('blt', ['$v0', '$v1', self.label_name(params[3])]) + + def ai_if_object_in_good_condition(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfObjectHealthy']) + self.emit_bnez_label(params[1]) + + def ai_if_object_in_room(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('jal', ['aiIfObjectInRoom']) + self.emit_bnez_label(params[3]) + + def ai_if_objective_complete(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfObjectiveComplete']) + self.emit_bnez_label(params[1]) + + def ai_if_objective_failed(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfObjectiveFailed']) + self.emit_bnez_label(params[1]) + + def ai_if_onscreen(self, params): + self.emit('jal', ['aiIfOnScreen']) + self.emit_bnez_label(params[0]) + + def ai_if_orders_eq(self, params): + self.emit('li', ['$a0', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfOrders']) + self.emit_bnez_label(params[2]) + + def ai_if_patrolling(self, params): + self.emit('jal', ['aiIfPatrolling']) + self.emit_bnez_label(params[0]) + + def ai_if_player_using_cmp150_or_ar34(self, params): + self.emit('jal', ['aiIfPlayerUsingCmpOrAr34']) + self.emit_bnez_label(params[0]) + + def ai_if_player_using_device(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfPlayerUsingDevice']) + self.emit_bnez_label(params[2]) + + def ai_if_rand_gt(self, params): + self.emit('jal', ['aiGetRandom']) + self.emit('li', ['$v1', params[0]]) + self.emit('bgt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_rand_lt(self, params): + self.emit('jal', ['aiGetRandom']) + self.emit('li', ['$v1', params[0]]) + self.emit('blt', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_room_onscreen(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiIfRoomIsOnScreen']) + self.emit_bnez_label(params[2]) + + def ai_if_savefile_flag_is_set(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['gamefileHasFlag']) + self.emit_bnez_label(params[1]) + + def ai_if_savefile_flag_is_unset(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['gamefileHasFlag']) + self.emit_beqz_label(params[1]) + + def ai_if_saw_death(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfSawDeath']) + self.emit_bnez_label(params[1]) + + def ai_if_saw_injury(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIfSawInjury']) + self.emit_bnez_label(params[1]) + + def ai_if_sees_suspicious_item(self, params): + self.emit('jal', ['aiIfSeesSuspiciousItem']) + self.emit_bnez_label(params[0]) + + def ai_if_self_flag_bankx_eq(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + if params[5] == 0: + self.emit('jal', ['aiIfHasFlagBank0']) + else: + self.emit('jal', ['aiIfHasFlagBank1']) + if params[4] == 0: + self.emit_beqz_label(params[6]) + else: + self.emit_bnez_label(params[6]) + + def ai_if_self_has_chrflag(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + self.emit('jal', ['aiIfHasChrflag']) + self.emit_bnez_label(params[4]) + + def ai_if_sound_finished(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['audioIsChannelIdle']) + self.emit_bnez_label(params[1]) + + def ai_if_stage_flag_eq(self, params): + flag = self.u32(params, 0) + self.emit('lui', ['$a0', '%hi(g_StageFlags)']) + self.emit('lw', ['$v0', '%lo(g_StageFlags)($a0)']) + if flag & 0xffff0000: + self.emit('li', ['$v1', '0x%08x' % flag]) + self.emit('and', ['$v0', '$v0', '$v1']) + else: + self.emit('andi', ['$v0', '$v0', '0x%04x' % flag]) + if params[4] == 0: + self.emit_beqz_label(params[5]) + else: + self.emit_bnez_label(params[5]) + + def ai_if_stage_is_not(self, params): + self.emit('jal', ['mainGetStageNum']) + self.emit('li', ['$v1', params[0]]) + self.emit('bne', ['$v0', '$v1', self.label_name(params[1])]) + + def ai_if_target_in_fov(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiIfTargetInFov']) + self.emit_bnez_label(params[1]) + + def ai_if_target_in_fov_left(self, params): + self.emit('jal', ['aiGetAngleToTarget']) + self.emit('li.s', ['$f2', params[0] * 3.141092641 * 2 * 0.00390625]) + self.emit('c.lt.s', ['$f0', '$f2']) + self.emit('bc1t', [self.label_name(params[1])]) + + def ai_if_target_in_sight(self, params): + self.emit('jal', ['aiIfTargetInSight']) + self.emit_bnez_label(params[0]) + + def ai_if_target_is_player(self, params): + self.emit('jal', ['aiIfTargetIsPlayer']) + self.emit_bnez_label(params[0]) + + def ai_if_target_moving_away(self, params): + self.emit('jal', ['aiIfTargetMovingAway']) + self.emit_bnez_label(params[0]) + + def ai_if_target_moving_closer(self, params): + self.emit('jal', ['aiIfTargetMovingCloser']) + self.emit_bnez_label(params[0]) + + def ai_if_target_moving_slowly(self, params): + self.emit('jal', ['aiIfTargetMovingSlowly']) + self.emit_bnez_label(params[1]) + + def ai_if_target_out_of_fov_left(self, params): + self.emit('jal', ['aiGetAngleToTarget']) + self.emit('li.s', ['$f2', params[0] * 3.141092641 * 2 * 0.00390625]) + self.emit('c.le.s', ['$f0', '$f2']) + self.emit('bc1f', [self.label_name(params[1])]) + + def ai_if_teleport_full_white(self, params): + self.emit('li', ['$a0', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfChrTeleportFullWhite']) + self.emit_bnez_label(params[0]) + + def ai_if_timer_gt(self, params): + self.emit('jal', ['aiGetTimer']) + self.emit('li', ['$v1', self.u16(params, 1)]) + self.emit('bgt', ['$v0', '$v1', self.label_name(params[3])]) + + def ai_if_timer_lt(self, params): + self.emit('jal', ['aiGetTimer']) + self.emit('li', ['$v1', self.u16(params, 1)]) + self.emit('blt', ['$v0', '$v1', self.label_name(params[3])]) + + def ai_if_training_pc_holographed(self, params): + self.emit('jal', ['aiIfTrainingPcHolographed']) + self.emit_bnez_label(params[0]) + + def ai_if_weapon_thrown(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['weaponFindLanded']) + self.emit_bnez_label(params[1]) + + def ai_if_weapon_thrown_on_object(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiIfWeaponThrownOnObject']) + self.emit_bnez_label(params[2]) + + def ai_increase_chr_alertness(self, params): + self.emit('li', ['$a0', '0x%02x' % params[1]]) + self.emit('li', ['$a1', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrAddAlertness']) + + def ai_increase_self_alertness(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiAddAlertness']) + + def ai_increase_squadron_alertness(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiIncreaseSquadronAlertness']) + + def ai_infloop(self, params): + self.emit_raw('.infloop:') + self.emit('b', ['.infloop']) + + def ai_jog_to_pad(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiJogToPad']) + + def ai_kill(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiChrKill']) + + def ai_kneel(self, params): + self.emit('jal', ['aiKneel']) + + def ai_label(self, params): + label_id = params[0] + if label_id not in self.labels: + self.labels[label_id] = -1 + self.labels[label_id] += 1 + index = self.labels[label_id] + self.emit_raw('%s:' % self.label_name(label_id, index)) + + def ai_lock_door(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiLockDoor']) + + def ai_miniskedar_try_pounce(self, params): + self.emit('jal', ['aiMiniSkedarTryPounce']) + self.emit_bnez_label(params[4]) + + def ai_move_object_to_pad(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('jal', ['aiObjectMoveToPad']) + + def ai_mp_init_simulants(self, params): + self.emit('jal', ['botSpawnAll']) + + def ai_mute_channel(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('jal', ['audioMuteChannel']) + + def ai_object_do_animation(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%02x' % params[2]]) + self.emit('li', ['$a2', self.s8(params[3])]) + self.emit('li', ['$a3', '0x%04x' % self.u16(params, 4)]) + self.emit('jal', ['aiObjectDoAnimation']) + + def ai_object_set_modelpart_visible(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', '0x%02x' % params[2]]) + self.emit('jal', ['aiObjSetModelPartVisible']) + + def ai_open_door(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiOpenDoor']) + + def ai_passive_mode(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['bgunSetPassiveMode']) + + def ai_pause_timer(self, params): + self.emit('jal', ['aiPauseTimer']) + + def ai_play_cistaff_quip(self, params): + self.emit('li', ['$a0', str(params[0])]) + self.emit('li', ['$a1', str(self.s8(params[1]))]) + self.emit('jal', ['aiSayCiStaffQuip']) + + def ai_play_cutscene_track(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['musicStartCutscene']) + + def ai_play_default_tracks(self, params): + self.emit('jal', ['musicPlayDefaultTracks']) + + def ai_play_music_continuously(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['musicStartTemporaryPrimary']) + + def ai_play_sound(self, params): + self.emit('li', ['$a0', self.s8(params[2])]) + self.emit('li', ['$a1', self.u16(params, 0)]) + self.emit('li', ['$a2', '0']) + self.emit('li', ['$a3', '0']) + self.emit_store_to_stack(0x10, 0) + self.emit_store_to_stack(0x14, 0) + self.emit('jal', ['audioPlayFromProp']) + + def ai_play_sound_from_entity(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('li', ['$a1', params[1]]) + self.emit('li', ['$a2', '0x%04x' % self.u16(params, 4)]) + self.emit('li', ['$a3', '0x%04x' % self.u16(params, 6)]) + self.emit('jal', ['aiPlaySoundFromObj' if params[8] == 0 else 'aiPlaySoundFromChr']) + + def ai_play_sound_from_object(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', '0x%04x' % self.u16(params, 2)]) + self.emit('li', ['$a3', '0x%04x' % self.u16(params, 4)]) + self.emit_store_to_stack(0x10, self.u16(params, 6)) + self.emit('jal', ['ai016b']) + + def ai_play_sound_from_object2(self, params): + # We use params[8] twice because that's what the original game does + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', '0x%04x' % self.u16(params, 2)]) + self.emit('li', ['$a3', params[6]]) + self.emit_store_to_stack(0x10, (params[8] << 8) | params[8]) + self.emit('jal', ['aiPlaySoundFromProp']) + + def ai_play_sound_from_pad(self, params): + self.emit('li', ['$a0', self.u16(params, 1)]) + self.emit('li', ['$a1', self.u16(params, 3)]) + self.emit('jal', ['ai00d0']) + + def ai_play_temporary_track(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['musicStartTemporaryAmbient']) + + def ai_play_track_isolated(self, params): + if params[0] == 101: # MUSIC_CI_TRAINING + self.emit('jal', ['optionsGetMusicVolume']) + self.emit('sw', ['$v0', '0x10($sp)']) + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['musicPlayTrackIsolated']) + self.emit('lw', ['$a0', '0x10($sp)']) + self.emit('jal', ['optionsSetMusicVolume']) + else: + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['musicPlayTrackIsolated']) + + def ai_play_x_track(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('li', ['$a2', params[2]]) + self.emit('jal', ['musicSetXReason']) + + def ai_rebuild_squadrons(self, params): + self.emit('jal', ['rebuildSquadrons']) + + def ai_rebuild_teams(self, params): + self.emit('jal', ['rebuildTeams']) + + def ai_release_grabbed_object(self, params): + self.emit('move', ['$a0', '$zero']) + self.emit('jal', ['bmoveSetModeForAllPlayers']) + + def ai_remove_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiRemoveChr']) + + def ai_remove_references_to_chr(self, params): + self.emit('jal', ['aiRemoveReferencesToChr']) + + def ai_remove_weapon_from_inventory(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['invRemoveItemByNum']) + + def ai_reset_timer(self, params): + self.emit('jal', ['aiResetTimer']) + + def ai_restart_timer(self, params): + self.emit('jal', ['aiRestartTimer']) + + def ai_resume_timer(self, params): + self.emit('jal', ['aiResumeTimer']) + + def ai_retreat(self, params): + if params[1] == 1: + self.emit('jal', ['aiRetreatFromTarget']) + else: + self.emit('jal', ['aiRetreatToCover']) + + def ai_return(self, params): + # If aiReturn returns a pointer (common case) then follow it, otherwise terminate + label = self.temp_label() + self.emit('jal', ['aiReturn']) + self.emit('beqz', ['$v0', label]) + self.emit('jr', ['$v0']) + self.emit_raw('%s:' % label) + self.emit('jal', ['aiTerminate']) + + def ai_revoke_control(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiRevokeControl']) + + def ai_run_from_grenade(self, params): + self.emit('jal', ['ai013e']) + + def ai_run_to_pad(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiRunToPad']) + + def ai_say_quip(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', '0x%02x' % params[2]]) + self.emit('li', ['$a3', '0x%02x' % params[3]]) + self.emit_store_to_stack(0x10, params[4]) + self.emit_store_to_stack(0x14, params[5]) + self.emit_store_to_stack(0x18, params[6]) + self.emit_store_to_stack(0x1c, params[7]) + self.emit('jal', ['aiSayQuip']) + + def ai_set_accuracy(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('jal', ['aiSetAccuracy']) + + def ai_set_action(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiSetAction']) + + def ai_set_ailist(self, params): + if params[0] == 0xfd: + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 1)]) + self.emit('jal', ['aiSetMyList']) + self.emit('jr', ['$v0']) + else: + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('jal', ['aiSetChrList']) + + def ai_set_aishootingatmelist(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiSetShootingAtMeList']) + + def ai_set_alertness(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetAlertness']) + + def ai_set_autogun_target_team(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiSetAutogunTargetTeam']) + + def ai_set_chr_chrflag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiChrSetChrflag']) + + def ai_set_chr_cloaked(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('li', ['$a2', params[2]]) + self.emit('jal', ['aiChrSetCloaked']) + + def ai_set_chr_dodge_rating(self, params): + self.emit('li', ['$a0', params[0]]) + if params[1] == 0: + self.emit('jal', ['aiSetDodgeRatingOnly']) + elif params[1] == 1: + self.emit('jal', ['aiSetDodgeRatingMax']) + else: + self.emit('jal', ['aiSetDodgeRatingBoth']) + + def ai_set_chr_flag_bankx(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', self.u32(params, 5)]) + self.emit('li', ['$a2', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiChrSetFlag']) + + def ai_set_chr_hiddenflag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiChrSetHiddenFlag']) + + def ai_set_chr_hudpiece_visible(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiSetChrHudpieceVisible']) + + def ai_set_chr_id(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiSetChrnum']) + + def ai_set_chr_maxdamage(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li.s', ['$a1', self.u16(params, 1) / 10]) + self.emit('jal', ['aiSetMaxDamage']) + + def ai_set_chr_roomtosearch(self, params): + self.emit('jal', ['aiSetRoomToSearch']) + + def ai_set_chr_shooting_in_cutscene(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiChrSetFiringInCutscene']) + + def ai_set_chr_special_death_animation(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiSetChrSpecialDeathAnimation']) + + def ai_set_chr_target_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiSetChrTarget']) + + def ai_set_chr_team(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiChrSetTeam']) + + def ai_set_chrpreset(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiSetChrPreset']) + + def ai_set_countdown_timer(self, params): + self.emit('li.s', ['$f12', self.u16(params, 0) * 60]) + self.emit('jal', ['countdownTimerSetValue60']) + + def ai_set_cutscene_weapon(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', '0x%02x' % params[2]]) + self.emit('jal', ['aiChrSetCutsceneWeapon']) + + def ai_set_darkroomlist(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiSetDarkRoomList']) + + def ai_set_door_open(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiSetDoorOpen']) + + def ai_set_drcaroll_images(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('li', ['$a2', params[2]]) + self.emit('jal', ['aiSetDrCarollImages']) + + def ai_set_grenade_probability_out_of_255(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetGrenadeProbability']) + + def ai_set_hear_distance(self, params): + self.emit('li.s', ['$f12', self.u16(params, 0) / 1000]) + self.emit('jal', ['aiSetHearDistance']) + + def ai_set_invincible(self, params): + self.emit('li', ['$v0', '1']) + self.emit('lui', ['$a0', '%hi(g_PlayerInvincible)']) + self.emit('sw', ['$v0', '%lo(g_PlayerInvincible)($a0)']) + + def ai_set_lights_state(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', params[2]]) + self.emit('li', ['$a2', params[3]]) + self.emit('li', ['$a3', params[4]]) + self.emit_store_to_stack(0x10, params[5]) + self.emit('jal', ['aiSetLights']) + + def ai_set_morale(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetMorale']) + + def ai_set_object_flag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiSetObjFlag']) + + def ai_set_object_flag2(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiSetObjFlag2']) + + def ai_set_object_flag3(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiSetObjFlag3']) + + def ai_set_object_health(self, params): + # Actually "set object damage" + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', self.u16(params, 1)]) + self.emit('jal', ['aiSetObjDamage']) + + def ai_set_object_image(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('li', ['$a2', '0x%02x' % params[2]]) + self.emit('jal', ['aiSetObjImage']) + + def ai_set_pad_preset_to_investigation_terminal(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiSetPadPresetToInvestigationTerminal']) + + def ai_set_padpreset(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiSetPadPreset']) + + def ai_set_portal_flag(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%02x' % params[2]]) + self.emit('jal', ['aiSetPortalFlag']) + + def ai_set_reaction_speed(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('jal', ['aiSetReactionSpeed']) + + def ai_set_recovery_speed(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('jal', ['aiSetRecoverySpeed']) + + def ai_set_returnlist(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('jal', ['aiSetReturnList']) + + def ai_set_room_flag(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiSetRoomFlag']) + + def ai_set_rotor_speed(self, params): + raise NotImplementedError + + def ai_set_savefile_flag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['gamefileSetFlag']) + + def ai_set_self_chrflag(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + self.emit('jal', ['aiSetChrflag']) + + def ai_set_self_flag_bankx(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + if params[4] == 0: + self.emit('jal', ['aiSetFlagBank0']) + else: + self.emit('jal', ['aiSetFlagBank1']) + + def ai_set_shield(self, params): + self.emit('li.s', ['$f12', self.u16(params, 0) / 10]) + self.emit('jal', ['aiSetShield']) + + def ai_set_shotlist(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiSetShotList']) + + def ai_set_squadron(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetSquadron']) + + def ai_set_stage_flag(self, params): + flag = self.u32(params, 0) + self.emit('lui', ['$a0', '%hi(g_StageFlags)']) + self.emit('lw', ['$v0', '%lo(g_StageFlags)($a0)']) + if flag & 0xffff0000: + self.emit('li', ['$v1', '0x%08x' % flag]) + self.emit('or', ['$v0', '$v0', '$v1']) + else: + self.emit('ori', ['$v0', '$v0', '0x%04x' % flag]) + self.emit('sw', ['$v0', '%lo(g_StageFlags)($a0)']) + + def ai_set_target_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiSetTargetChr']) + + def ai_set_target_to_camspy_if_in_sight(self, params): + self.emit('jal', ['aiSetTargetToEyespyIfInSight']) + self.emit_bnez_label(params[0]) + + def ai_set_target_to_enemy_on_same_floor(self, params): + self.emit('jal', ['aiDetectEnemyOnSameFloor']) + self.emit_bnez_label(params[0]) + + def ai_set_team_orders(self, params): + self.emit('jal', ['aiSetTeamOrders']) + + def ai_set_tinted_glass_enabled(self, params): + self.emit('li', ['$v0', params[0]]) + self.emit('lui', ['$a0', '%hi(g_TintedGlassEnabled)']) + self.emit('sw', ['$v0', '%lo(g_TintedGlassEnabled)($a0)']) + + def ai_set_unarmeddodgerating(self, params): + self.emit('li', ['$a0', self.s8(params[0])]) + self.emit('jal', ['aiSetUnarmedDodgeRating']) + + def ai_set_vehicle_speed(self, params): + speedaim = self.u16(params, 0) * 100 / 15360 + speedtime = self.u16(params, 2) + self.emit('li.s', ['$f12', speedaim]) + self.emit('li.s', ['$f14', speedtime]) + self.emit('jal', ['aiSetVehicleSpeed']) + + def ai_set_view_distance(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetViewDistance']) + + def ai_set_wind_speed(self, params): + self.emit('li.s', ['$f2', self.s8(params[0]) / 10]) + self.emit('lui', ['$a0', '%hi(g_SkyWindSpeed)']) + self.emit('swc1', ['$f2', '%lo(g_SkyWindSpeed)($a0)']) + + def ai_show_countdown_timer(self, params): + self.emit('li', ['$a0', '1']) + self.emit('li', ['$a1', '1']) + self.emit('jal', ['countdownTimerSetVisible']) + + def ai_show_hudmsg(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('jal', ['aiShowHudmsg']) + + def ai_show_hudmsg_middle(self, params): + if params[0] == 0: + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['langGet']) + self.emit('move', ['$a0', '$v0']) + self.emit('li', ['$a1', '7']) + self.emit('li', ['$a2', params[1]]) + self.emit('jal', ['hudmsgCreateWithColour']) + elif params[0] == 1: + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['langGet']) + self.emit('move', ['$a0', '$v0']) + self.emit('li', ['$a1', '8']) + self.emit('li', ['$a2', params[1]]) + self.emit('jal', ['hudmsgCreateWithColour']) + elif params[0] == 2: + self.emit('jal', ['hudmsgRemoveAll']) + + def ai_show_hudmsg_top_middle(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('li', ['$a2', params[3]]) + self.emit('jal', ['aiShowHudmsgTopMiddle']) + + def ai_show_nonessential_chrs(self, params): + self.emit('jal', ['aiShowCutsceneChrs' if params[0] else 'aiHideCutsceneChrs']) + + def ai_shuffle_investigation_terminals(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('li', ['$a2', params[2]]) + self.emit('li', ['$a3', params[3]]) + self.emit_store_to_stack(0x10, params[4]) + self.emit('jal', ['aiShuffleInvestigationTerminals']) + + def ai_shuffle_pelagic_switches(self, params): + self.emit('jal', ['aiShufflePelagicSwitches']) + + def ai_shuffle_ruins_pillars(self, params): + self.emit('jal', ['aiShuffleRuinsPillars']) + + def ai_speak(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.s16(params, 1)]) + self.emit('li', ['$a2', '0x%04x' % self.u16(params, 3)]) + self.emit('li', ['$a3', params[5]]) + self.emit_store_to_stack(0x10, params[6]) + self.emit('jal', ['aiSpeak']) + + def ai_start_countdown_timer(self, params): + self.emit('li', ['$a0', '1']) + self.emit('jal', ['countdownTimerSetRunning']) + + def ai_start_patrol(self, params): + self.emit('jal', ['aiStartPatrol']) + + def ai_stop(self, params): + self.emit('jal', ['aiStop']) + + def ai_stop_ambient_track(self, params): + self.emit('jal', ['musicEndTemporaryAmbient']) + + def ai_stop_countdown_timer(self, params): + self.emit('li', ['$a0', '0']) + self.emit('jal', ['countdownTimerSetRunning']) + + def ai_stop_cutscene_track(self, params): + self.emit('jal', ['musicEndCutscene']) + + def ai_stop_x_track(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['musicUnsetXReason']) + + def ai_subtract_morale(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSubtractMorale']) + + def ai_surrender(self, params): + self.emit('jal', ['aiSurrender']) + + def ai_teleport_to_pad(self, params): + pad = self.u16(params, 0) + if pad: + self.emit('li', ['$a0', params[2]]) + self.emit('li', ['$a1', pad]) + self.emit('jal', ['aiChrBeginTeleport']) + else: + self.emit('li', ['$a0', params[2]]) + self.emit('jal', ['aiChrEndTeleport']) + + def ai_try_attack_amount(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', params[1]]) + self.emit('jal', ['aiAttackAmount']) + + def ai_try_attack_kneel(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiTryAttackKneel']) + self.emit_bnez_label(params[4]) + + def ai_try_attack_lie(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiTryAttackLie']) + self.emit_bnez_label(params[4]) + + def ai_try_attack_roll(self, params): + self.emit('jal', ['aiTryAttackRoll']) + self.emit_bnez_label(params[0]) + + def ai_try_attack_stand(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiTryAttackStand']) + self.emit_bnez_label(params[4]) + + def ai_try_attack_walk(self, params): + self.emit('jal', ['aiTryAttackWalk']) + self.emit_bnez_label(params[0]) + + def ai_try_equip_weapon(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%02x' % params[2]]) + self.emit('li', ['$a2', '0x%08x' % self.u32(params, 3)]) + self.emit('jal', ['aiTryEquipWeapon']) + self.emit_bnez_label(params[7]) + + def ai_try_face_entity(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiTryFaceEntity']) + self.emit_bnez_label(params[4]) + + def ai_try_inherit_properties(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiChrCopyProperties']) + self.emit_bnez_label(params[1]) + + def ai_try_jog_to_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiTryJogToChr']) + self.emit_bnez_label(params[1]) + + def ai_try_jog_to_target(self, params): + self.emit('jal', ['aiTryJogToTarget']) + self.emit_bnez_label(params[0]) + + def ai_try_jumpout(self, params): + self.emit('jal', ['aiTryJumpOut']) + self.emit_bnez_label(params[0]) + + def ai_try_modify_attack(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 2)]) + self.emit('jal', ['aiTryModifyAttack']) + self.emit_bnez_label(params[4]) + + def ai_try_punch_or_kick(self, params): + self.emit('jal', ['aiTryMelee']) + self.emit_bnez_label(params[1]) + + def ai_try_run_sideways(self, params): + self.emit('jal', ['aiTryRunSideways']) + self.emit_bnez_label(params[0]) + + def ai_try_run_to_chr(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['aiTryRunToChr']) + self.emit_bnez_label(params[1]) + + def ai_try_run_to_target(self, params): + self.emit('jal', ['aiTryRunToTarget']) + self.emit_bnez_label(params[0]) + + def ai_try_set_chrpreset_to_unalerted_teammate(self, params): + self.emit('jal', ['aiSetChrPresetToUnalertedTeammate']) + self.emit_bnez_label(params[2]) + + def ai_try_set_padpreset_to_target_quadrant(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['aiSetPadPresetToTargetQuadrant']) + self.emit_bnez_label(params[1]) + + def ai_try_set_target_pad_to_something(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('jal', ['ai0075']) + self.emit_bnez_label(params[1]) + + def ai_try_sidestep(self, params): + self.emit('jal', ['aiTrySidestep']) + self.emit_bnez_label(params[0]) + + def ai_try_spawn_chr_at_chr(self, params): + raise NotImplementedError + + def ai_try_spawn_chr_at_pad(self, params): + self.emit('li', ['$a0', params[0]]) + self.emit('li', ['$a1', self.s8(params[1])]) + self.emit('li', ['$a2', '0x%04x' % self.u16(params, 2)]) + self.emit('li', ['$a3', '0x%04x' % self.u16(params, 4)]) + self.emit_store_to_stack(0x10, self.u32(params, 6)) + self.emit('jal', ['aiSpawnChrAtPad']) + self.emit_bnez_label(params[10]) + + def ai_try_spawn_clone2(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%04x' % self.u16(params, 1)]) + self.emit('li', ['$a2', '0x%08x' % self.u32(params, 3)]) + self.emit('jal', ['aiDuplicateChr']) + self.emit_bnez_label(params[7]) + + def ai_try_walk_to_target(self, params): + self.emit('jal', ['aiTryWalkToTarget']) + self.emit_bnez_label(params[0]) + + def ai_unlock_door(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%02x' % params[1]]) + self.emit('jal', ['aiUnlockDoor']) + + def ai_unset_chr_chrflag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiChrUnsetChrflag']) + + def ai_unset_chr_flag_bankx(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('li', ['$a2', params[5]]) + self.emit('jal', ['aiChrUnsetFlag']) + + def ai_unset_chr_hiddenflag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiChrUnsetHiddenFlag']) + + def ai_unset_object_flag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiUnsetObjFlag']) + + def ai_unset_object_flag2(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiUnsetObjFlag2']) + + def ai_unset_object_flag3(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('li', ['$a1', '0x%08x' % self.u32(params, 1)]) + self.emit('jal', ['aiUnsetObjFlag3']) + + def ai_unset_savefile_flag(self, params): + self.emit('li', ['$a0', '0x%02x' % params[0]]) + self.emit('jal', ['gamefileUnsetFlag']) + + def ai_unset_self_chrflag(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + self.emit('jal', ['aiUnsetChrflag']) + + def ai_unset_self_flag_bankx(self, params): + self.emit('li', ['$a0', '0x%08x' % self.u32(params, 0)]) + if params[4] == 0: + self.emit('jal', ['aiUnsetFlagBank0']) + else: + self.emit('jal', ['aiUnsetFlagBank1']) + + def ai_unset_stage_flag(self, params): + flag = self.u32(params, 0) + self.emit('lui', ['$a0', '%hi(g_StageFlags)']) + self.emit('lw', ['$v0', '%lo(g_StageFlags)($a0)']) + self.emit('li', ['$v1', '0x%08x' % (~flag & 0xffffffff)]) + self.emit('and', ['$v0', '$v0', '$v1']) + self.emit('sw', ['$v0', '%lo(g_StageFlags)($a0)']) + + def ai_walk_to_pad(self, params): + self.emit('li', ['$a0', '0x%04x' % self.u16(params, 0)]) + self.emit('jal', ['aiWalkToPad']) + + def ai_yield(self, params=[]): + self.emit('jal', ['aiYield']) + +app = App() +app.run() diff --git a/tools/ai2asm/commands.py b/tools/ai2asm/commands.py new file mode 100644 index 000000000..66bef326c --- /dev/null +++ b/tools/ai2asm/commands.py @@ -0,0 +1,345 @@ +def get_commands(): + commands = {} + commands[0x0000] = {'macro': 'goto_next', 'len': 3} + commands[0x0001] = {'macro': 'goto_first', 'len': 3} + commands[0x0002] = {'macro': 'label', 'len': 3} + commands[0x0003] = {'macro': 'yield', 'len': 2} + commands[0x0004] = {'macro': 'endlist', 'len': 2} + commands[0x0005] = {'macro': 'set_ailist', 'len': 5} + commands[0x0006] = {'macro': 'set_returnlist', 'len': 5} + commands[0x0007] = {'macro': 'set_shotlist', 'len': 4} + commands[0x0008] = {'macro': 'return', 'len': 2} + commands[0x0009] = {'macro': 'stop', 'len': 2} + commands[0x000a] = {'macro': 'kneel', 'len': 2} + commands[0x000b] = {'macro': 'chr_do_animation', 'len': 12} + commands[0x000c] = {'macro': 'if_chr_idle', 'len': 3} + commands[0x000d] = {'macro': 'if_chr_deadish', 'len': 4} + commands[0x000f] = {'macro': 'try_sidestep', 'len': 3} + commands[0x0010] = {'macro': 'try_jumpout', 'len': 3} + commands[0x0011] = {'macro': 'try_run_sideways', 'len': 3} + commands[0x0012] = {'macro': 'try_attack_walk', 'len': 3} + commands[0x0014] = {'macro': 'try_attack_roll', 'len': 3} + commands[0x0015] = {'macro': 'try_attack_stand', 'len': 7} + commands[0x0016] = {'macro': 'try_attack_kneel', 'len': 7} + commands[0x0017] = {'macro': 'try_modify_attack', 'len': 7} + commands[0x0018] = {'macro': 'try_face_entity', 'len': 7} + commands[0x0019] = {'macro': 'damage_chr', 'len': 8} + commands[0x001a] = {'macro': 'chr_damage_chr', 'len': 5} + commands[0x001b] = {'macro': 'consider_throwing_grenade', 'len': 7} + commands[0x001d] = {'macro': 'jog_to_pad', 'len': 4} + commands[0x001e] = {'macro': 'go_to_target_pad', 'len': 3} + commands[0x001f] = {'macro': 'walk_to_pad', 'len': 4} + commands[0x0020] = {'macro': 'run_to_pad', 'len': 4} + commands[0x0021] = {'macro': 'assign_path', 'len': 3} + commands[0x0022] = {'macro': 'start_patrol', 'len': 2} + commands[0x0023] = {'macro': 'if_patrolling', 'len': 3} + commands[0x0024] = {'macro': 'surrender', 'len': 2} + commands[0x0025] = {'macro': 'drop_gun_and_fade_out', 'len': 2} + commands[0x0026] = {'macro': 'remove_chr', 'len': 3} + commands[0x0028] = {'macro': 'activate_alarm', 'len': 2} + commands[0x0029] = {'macro': 'deactivate_alarm', 'len': 2} + commands[0x002b] = {'macro': 'try_jog_to_target', 'len': 3} + commands[0x002c] = {'macro': 'try_walk_to_target', 'len': 3} + commands[0x002d] = {'macro': 'try_run_to_target', 'len': 3} + commands[0x002f] = {'macro': 'try_jog_to_chr', 'len': 4} + commands[0x0031] = {'macro': 'try_run_to_chr', 'len': 4} + commands[0x0032] = {'macro': 'if_chr_stopped', 'len': 3} + commands[0x0033] = {'macro': 'if_chr_dead', 'len': 4} + commands[0x0034] = {'macro': 'if_chr_death_animation_finished', 'len': 4} + commands[0x0035] = {'macro': 'if_target_in_sight', 'len': 3} + commands[0x0036] = {'macro': 'call_rng', 'len': 2} + commands[0x0037] = {'macro': 'if_rand_lt', 'len': 4} + commands[0x0038] = {'macro': 'if_rand_gt', 'len': 4} + commands[0x0039] = {'macro': 'if_can_hear_alarm', 'len': 3} + commands[0x003a] = {'macro': 'if_alarm_active', 'len': 3} + commands[0x003c] = {'macro': 'if_hears_target', 'len': 3} + commands[0x003d] = {'macro': 'if_saw_injury', 'len': 4} + commands[0x003e] = {'macro': 'if_saw_death', 'len': 4} + commands[0x003f] = {'macro': 'if_can_see_target', 'len': 3} + commands[0x0041] = {'macro': 'if_nearly_in_targets_sight', 'len': 7} + commands[0x0044] = {'macro': 'if_heard_target_recently', 'len': 3} + commands[0x0045] = {'macro': 'if_detected_chr', 'len': 4} + commands[0x0046] = {'macro': 'if_never_been_onscreen', 'len': 3} + commands[0x0047] = {'macro': 'if_onscreen', 'len': 3} + commands[0x0049] = {'macro': 'if_room_onscreen', 'len': 5} + commands[0x004a] = {'macro': 'if_chr_in_view', 'len': 3} + commands[0x004b] = {'macro': 'if_near_miss', 'len': 3} + commands[0x004c] = {'macro': 'if_sees_suspicious_item', 'len': 3} + commands[0x004d] = {'macro': 'if_target_in_fov_left', 'len': 4} + commands[0x004e] = {'macro': 'if_fov_check_with_target', 'len': 6} + commands[0x004f] = {'macro': 'if_target_out_of_fov_left', 'len': 4} + commands[0x0050] = {'macro': 'if_target_in_fov', 'len': 4} + commands[0x0052] = {'macro': 'if_distance_to_target_lt', 'len': 5} + commands[0x0053] = {'macro': 'if_distance_to_target_gt', 'len': 5} + commands[0x0054] = {'macro': 'if_chr_distance_to_pad_lt', 'len': 8} + commands[0x0055] = {'macro': 'if_chr_distance_to_pad_gt', 'len': 8} + commands[0x0056] = {'macro': 'if_distance_to_chr_lt', 'len': 6} + commands[0x0057] = {'macro': 'if_distance_to_chr_gt', 'len': 6} + commands[0x0059] = {'macro': 'if_distance_from_target_to_pad_lt', 'len': 7} + commands[0x005b] = {'macro': 'if_chr_in_room', 'len': 7} + commands[0x005d] = {'macro': 'if_chr_has_object', 'len': 5} + commands[0x005e] = {'macro': 'if_weapon_thrown', 'len': 4} + commands[0x005f] = {'macro': 'if_weapon_thrown_on_object', 'len': 5} + commands[0x0060] = {'macro': 'if_chr_weapon_equipped', 'len': 5} + commands[0x0061] = {'macro': 'if_gun_unclaimed', 'len': 5} + commands[0x0062] = {'macro': 'if_object_in_good_condition', 'len': 4} + commands[0x0063] = {'macro': 'if_chr_activated_object', 'len': 5} + commands[0x0066] = {'macro': 'destroy_object', 'len': 3} + commands[0x0068] = {'macro': 'drop_concealed_items', 'len': 3} + commands[0x0069] = {'macro': 'chr_drop_weapon', 'len': 3} + commands[0x006a] = {'macro': 'give_object_to_chr', 'len': 4} + commands[0x006b] = {'macro': 'move_object_to_pad', 'len': 5} + commands[0x006c] = {'macro': 'open_door', 'len': 3} + commands[0x006d] = {'macro': 'close_door', 'len': 3} + commands[0x006e] = {'macro': 'if_door_state', 'len': 5} + commands[0x0070] = {'macro': 'lock_door', 'len': 4} + commands[0x0071] = {'macro': 'unlock_door', 'len': 4} + commands[0x0072] = {'macro': 'if_door_locked', 'len': 5} + commands[0x0073] = {'macro': 'if_objective_complete', 'len': 4} + commands[0x0074] = {'macro': 'if_objective_failed', 'len': 4} + commands[0x0075] = {'macro': 'try_set_target_pad_to_something', 'len': 4} + commands[0x0076] = {'macro': 'try_set_padpreset_to_target_quadrant', 'len': 4} + commands[0x0077] = {'macro': 'if_difficulty_lt', 'len': 4} + commands[0x0078] = {'macro': 'if_difficulty_gt', 'len': 4} + commands[0x007b] = {'macro': 'if_stage_is_not', 'len': 4} + commands[0x007d] = {'macro': 'if_num_times_shot_lt', 'len': 4} + commands[0x007e] = {'macro': 'if_num_times_shot_gt', 'len': 4} + commands[0x0083] = {'macro': 'if_just_injured', 'len': 4} + commands[0x0084] = {'macro': 'set_morale', 'len': 3} + commands[0x0085] = {'macro': 'add_morale', 'len': 3} + commands[0x0087] = {'macro': 'subtract_morale', 'len': 3} + commands[0x0088] = {'macro': 'if_morale_lt', 'len': 4} + commands[0x008a] = {'macro': 'set_alertness', 'len': 3} + commands[0x008b] = {'macro': 'increase_self_alertness', 'len': 3} + commands[0x008c] = {'macro': 'increase_chr_alertness', 'len': 4} + commands[0x008e] = {'macro': 'if_alertness', 'len': 5} + commands[0x008f] = {'macro': 'if_chr_alertness_lt', 'len': 5} + commands[0x0092] = {'macro': 'set_hear_distance', 'len': 4} + commands[0x0093] = {'macro': 'set_view_distance', 'len': 3} + commands[0x0094] = {'macro': 'set_grenade_probability_out_of_255', 'len': 3} + commands[0x0095] = {'macro': 'set_chr_id', 'len': 3} + commands[0x0096] = {'macro': 'set_chr_maxdamage', 'len': 5} + commands[0x0097] = {'macro': 'add_health_or_armor', 'len': 4} + commands[0x0098] = {'macro': 'set_reaction_speed', 'len': 3} + commands[0x0099] = {'macro': 'set_recovery_speed', 'len': 3} + commands[0x009a] = {'macro': 'set_accuracy', 'len': 3} + commands[0x009b] = {'macro': 'set_self_flag_bankx', 'len': 7} + commands[0x009c] = {'macro': 'unset_self_flag_bankx', 'len': 7} + commands[0x009d] = {'macro': 'if_self_flag_bankx_eq', 'len': 9} + commands[0x009e] = {'macro': 'set_chr_flag_bankx', 'len': 8} + commands[0x009f] = {'macro': 'unset_chr_flag_bankx', 'len': 8} + commands[0x00a0] = {'macro': 'if_chr_has_flag_bankx', 'len': 9} + commands[0x00a1] = {'macro': 'set_stage_flag', 'len': 6} + commands[0x00a2] = {'macro': 'unset_stage_flag', 'len': 6} + commands[0x00a3] = {'macro': 'if_stage_flag_eq', 'len': 8} + commands[0x00a4] = {'macro': 'set_self_chrflag', 'len': 6} + commands[0x00a5] = {'macro': 'unset_self_chrflag', 'len': 6} + commands[0x00a6] = {'macro': 'if_self_has_chrflag', 'len': 7} + commands[0x00a7] = {'macro': 'set_chr_chrflag', 'len': 7} + commands[0x00a8] = {'macro': 'unset_chr_chrflag', 'len': 7} + commands[0x00a9] = {'macro': 'if_chr_has_chrflag', 'len': 8} + commands[0x00aa] = {'macro': 'set_object_flag', 'len': 7} + commands[0x00ab] = {'macro': 'unset_object_flag', 'len': 7} + commands[0x00ad] = {'macro': 'set_object_flag2', 'len': 7} + commands[0x00ae] = {'macro': 'unset_object_flag2', 'len': 7} + commands[0x00af] = {'macro': 'if_object_flag2', 'len': 8} + commands[0x00b0] = {'macro': 'set_chrpreset', 'len': 3} + commands[0x00b1] = {'macro': 'set_chr_target_chr', 'len': 4} + commands[0x00b2] = {'macro': 'set_padpreset', 'len': 4} + commands[0x00b6] = {'macro': 'restart_timer', 'len': 2} + commands[0x00b7] = {'macro': 'reset_timer', 'len': 2} + commands[0x00b8] = {'macro': 'pause_timer', 'len': 2} + commands[0x00b9] = {'macro': 'resume_timer', 'len': 2} + commands[0x00bc] = {'macro': 'if_timer_lt', 'len': 6} + commands[0x00bd] = {'macro': 'if_timer_gt', 'len': 6} + commands[0x00be] = {'macro': 'show_countdown_timer', 'len': 2} + commands[0x00bf] = {'macro': 'hide_countdown_timer', 'len': 2} + commands[0x00c0] = {'macro': 'set_countdown_timer', 'len': 4} + commands[0x00c1] = {'macro': 'stop_countdown_timer', 'len': 2} + commands[0x00c2] = {'macro': 'start_countdown_timer', 'len': 2} + commands[0x00c4] = {'macro': 'if_countdown_timer_lt', 'len': 5} + commands[0x00c5] = {'macro': 'if_countdown_timer_gt', 'len': 5} + commands[0x00c6] = {'macro': 'try_spawn_chr_at_pad', 'len': 13} + commands[0x00c7] = {'macro': 'try_spawn_chr_at_chr', 'len': 12} + commands[0x00c8] = {'macro': 'try_equip_weapon', 'len': 10} + commands[0x00ca] = {'macro': 'try_spawn_clone2', 'len': 10} + commands[0x00cb] = {'macro': 'show_hudmsg', 'len': 5} + commands[0x00cc] = {'macro': 'show_hudmsg_top_middle', 'len': 6} + commands[0x00cd] = {'macro': 'speak', 'len': 9} + commands[0x00ce] = {'macro': 'play_sound', 'len': 5} + commands[0x00cf] = {'macro': 'control_sound_from_object', 'len': 6} + commands[0x00d0] = {'macro': 'play_sound_from_pad', 'len': 7} + commands[0x00d3] = {'macro': 'mute_channel', 'len': 3} + commands[0x00d5] = {'macro': 'begin_hovercar_path', 'len': 3} + commands[0x00d6] = {'macro': 'set_vehicle_speed', 'len': 6} + commands[0x00d7] = {'macro': 'set_rotor_speed', 'len': 6} + commands[0x00da] = {'macro': 'set_object_image', 'len': 5} + commands[0x00dc] = {'macro': 'end_level', 'len': 2} + commands[0x00dd] = {'macro': 'enter_firstperson', 'len': 2} + commands[0x00de] = {'macro': 'enter_camera_and_move_to_pad', 'len': 4} + commands[0x00e0] = {'macro': 'revoke_control', 'len': 4} + commands[0x00e1] = {'macro': 'grant_control', 'len': 3} + commands[0x00e2] = {'macro': 'chr_move_to_pad', 'len': 7} + commands[0x00e8] = {'macro': 'set_door_open', 'len': 3} + commands[0x00ea] = {'macro': 'if_num_human_players_lt', 'len': 4} + commands[0x00eb] = {'macro': 'if_ammo_quantity_lt', 'len': 6} + commands[0x00ec] = {'macro': 'chr_draw_weapon', 'len': 4} + commands[0x00ed] = {'macro': 'chr_draw_weapon_in_cutscene', 'len': 4} + commands[0x00ef] = {'macro': 'if_object_in_room', 'len': 6} + commands[0x00f3] = {'macro': 'set_invincible', 'len': 3} + commands[0x00f7] = {'macro': 'if_all_objectives_complete', 'len': 3} + commands[0x00f9] = {'macro': 'play_x_track', 'len': 5} + commands[0x00fa] = {'macro': 'stop_x_track', 'len': 3} + commands[0x00fb] = {'macro': 'explosions_around_chr', 'len': 3} + commands[0x00fc] = {'macro': 'if_kill_count_gt', 'len': 4} + commands[0x0102] = {'macro': 'set_lights_state', 'len': 11} + commands[0x0106] = {'macro': 'set_target_chr', 'len': 5} + commands[0x0107] = {'macro': 'if_chrpresets_target_is_different', 'len': 3} + commands[0x0108] = {'macro': 'if_chr_target_eq', 'len': 6} + commands[0x010b] = {'macro': 'set_chr_team', 'len': 4} + commands[0x010e] = {'macro': 'set_shield', 'len': 4} + commands[0x010f] = {'macro': 'if_chr_shield_lt', 'len': 6} + commands[0x0111] = {'macro': 'camera_movement', 'len': 4} + commands[0x0112] = {'macro': 'object_do_animation', 'len': 8} + commands[0x0113] = {'macro': 'if_camera_animating', 'len': 3} + commands[0x0114] = {'macro': 'enable_chr', 'len': 3} + commands[0x0115] = {'macro': 'disable_chr', 'len': 3} + commands[0x0116] = {'macro': 'enable_object', 'len': 3} + commands[0x0117] = {'macro': 'disable_object', 'len': 3} + commands[0x0118] = {'macro': 'set_object_flag3', 'len': 7} + commands[0x0119] = {'macro': 'unset_object_flag3', 'len': 7} + commands[0x011a] = {'macro': 'if_object_flag3', 'len': 8} + commands[0x011b] = {'macro': 'set_chr_hiddenflag', 'len': 7} + commands[0x011c] = {'macro': 'unset_chr_hiddenflag', 'len': 7} + commands[0x011d] = {'macro': 'if_chr_has_hiddenflag', 'len': 8} + commands[0x011f] = {'macro': 'if_chr_is_skedar', 'len': 4} + commands[0x0120] = {'macro': 'if_calculated_safety2_lt', 'len': 4} + commands[0x0121] = {'macro': 'find_cover', 'len': 5} + commands[0x0124] = {'macro': 'go_to_cover', 'len': 3} + commands[0x0125] = {'macro': 'check_cover_out_of_sight', 'len': 3} + commands[0x0126] = {'macro': 'if_player_using_cmp150_or_ar34', 'len': 3} + commands[0x0127] = {'macro': 'set_target_to_enemy_on_same_floor', 'len': 3} + commands[0x0128] = {'macro': 'if_enemy_distance_lt_and_los', 'len': 4} + commands[0x012a] = {'macro': 'if_target_moving_slowly', 'len': 4} + commands[0x012b] = {'macro': 'if_target_moving_closer', 'len': 3} + commands[0x012c] = {'macro': 'if_target_moving_away', 'len': 3} + commands[0x012f] = {'macro': 'cmd012f', 'len': 2} + commands[0x0130] = {'macro': 'say_quip', 'len': 10} + commands[0x0131] = {'macro': 'increase_squadron_alertness', 'len': 3} + commands[0x0132] = {'macro': 'set_action', 'len': 4} + commands[0x0133] = {'macro': 'set_team_orders', 'len': 4} + commands[0x0134] = {'macro': 'if_orders_eq', 'len': 5} + commands[0x0135] = {'macro': 'if_has_orders', 'len': 3} + commands[0x0136] = {'macro': 'retreat', 'len': 4} + commands[0x0137] = {'macro': 'if_chr_in_squadron_doing_action', 'len': 4} + commands[0x0138] = {'macro': 'if_sound_finished', 'len': 4} + commands[0x0139] = {'macro': 'cmd0139', 'len': 8} + commands[0x013a] = {'macro': 'try_set_chrpreset_to_unalerted_teammate', 'len': 5} + commands[0x013b] = {'macro': 'set_squadron', 'len': 3} + commands[0x013d] = {'macro': 'if_dangerous_object_nearby', 'len': 4} + commands[0x013e] = {'macro': 'run_from_grenade', 'len': 2} + commands[0x0140] = {'macro': 'if_hoverbot_next_step', 'len': 5} + commands[0x0141] = {'macro': 'shuffle_investigation_terminals', 'len': 9} + commands[0x0142] = {'macro': 'set_pad_preset_to_investigation_terminal', 'len': 4} + commands[0x0143] = {'macro': 'chopper_arm_weapons', 'len': 2} + commands[0x0145] = {'macro': 'rebuild_teams', 'len': 2} + commands[0x0146] = {'macro': 'rebuild_squadrons', 'len': 2} + commands[0x0147] = {'macro': 'if_all_chrs_in_squadron_are_dead', 'len': 4} + commands[0x0152] = {'macro': 'if_num_chrs_in_squadron_gt', 'len': 5} + commands[0x0157] = {'macro': 'set_tinted_glass_enabled', 'len': 3} + commands[0x015b] = {'macro': 'play_track_isolated', 'len': 3} + commands[0x015c] = {'macro': 'play_default_tracks', 'len': 2} + commands[0x0165] = {'macro': 'if_chr_injured_target', 'len': 4} + commands[0x0167] = {'macro': 'hovercopter_fire_rocket', 'len': 3} + commands[0x0168] = {'macro': 'if_chr_shield_damaged', 'len': 4} + commands[0x0169] = {'macro': 'if_chr_idle_action_eq', 'len': 4} + commands[0x016a] = {'macro': 'if_chr_y', 'len': 7} + commands[0x016b] = {'macro': 'play_sound_from_object', 'len': 10} + commands[0x016d] = {'macro': 'add_motion_blur', 'len': 5} + commands[0x016e] = {'macro': 'damage_chr_by_amount', 'len': 5} + commands[0x016f] = {'macro': 'if_has_gun', 'len': 5} + commands[0x0170] = {'macro': 'do_gun_command', 'len': 4} + commands[0x0171] = {'macro': 'if_distance_to_gun_lt', 'len': 5} + commands[0x0172] = {'macro': 'chr_recover_gun', 'len': 4} + commands[0x0173] = {'macro': 'try_inherit_properties', 'len': 4} + commands[0x0174] = {'macro': 'if_controller_button_pressed', 'len': 3} + commands[0x0175] = {'macro': 'cmd0175', 'len': 3} + commands[0x0176] = {'macro': 'cmd0176_if_something', 'len': 3} + commands[0x0177] = {'macro': 'force_walk', 'len': 9} + commands[0x0178] = {'macro': 'if_force_walk_finished', 'len': 4} + commands[0x0179] = {'macro': 'play_sound_from_entity', 'len': 11} + commands[0x017a] = {'macro': 'if_can_see_attack_target', 'len': 3} + commands[0x017b] = {'macro': 'if_chr_knockedout', 'len': 4} + commands[0x017c] = {'macro': 'assign_sound', 'len': 5} + commands[0x017d] = {'macro': 'play_cutscene_track', 'len': 3} + commands[0x017e] = {'macro': 'stop_cutscene_track', 'len': 2} + commands[0x017f] = {'macro': 'play_temporary_track', 'len': 3} + commands[0x0180] = {'macro': 'stop_ambient_track', 'len': 2} + commands[0x0181] = {'macro': 'if_chr_looking_at_object', 'len': 5} + commands[0x0182] = {'macro': 'try_punch_or_kick', 'len': 4} + commands[0x0183] = {'macro': 'if_target_is_player', 'len': 3} + commands[0x0184] = {'macro': 'try_attack_amount', 'len': 4} + commands[0x0185] = {'macro': 'mp_init_simulants', 'len': 2} + commands[0x0186] = {'macro': 'if_chr_soundtimer', 'len': 6} + commands[0x0187] = {'macro': 'set_target_to_camspy_if_in_sight', 'len': 3} + commands[0x0188] = {'macro': 'if_lift_stationary', 'len': 4} + commands[0x018b] = {'macro': 'enable_rain', 'len': 3} + commands[0x018c] = {'macro': 'chr_toggle_modelpart', 'len': 4} + commands[0x018d] = {'macro': 'activate_lift', 'len': 4} + commands[0x018e] = {'macro': 'miniskedar_try_pounce', 'len': 7} + commands[0x018f] = {'macro': 'if_object_distance_to_pad_lt', 'len': 8} + commands[0x0190] = {'macro': 'set_savefile_flag', 'len': 3} + commands[0x0191] = {'macro': 'unset_savefile_flag', 'len': 3} + commands[0x0192] = {'macro': 'if_savefile_flag_is_set', 'len': 4} + commands[0x0193] = {'macro': 'if_savefile_flag_is_unset', 'len': 4} + commands[0x019e] = {'macro': 'if_object_health_lt', 'len': 6} + commands[0x019f] = {'macro': 'set_object_health', 'len': 5} + commands[0x01a0] = {'macro': 'set_chr_special_death_animation', 'len': 4} + commands[0x01a1] = {'macro': 'set_chr_roomtosearch', 'len': 2} + commands[0x01a2] = {'macro': 'play_cistaff_quip', 'len': 4} + commands[0x01a3] = {'macro': 'do_preset_animation', 'len': 3} + commands[0x01a4] = {'macro': 'show_hudmsg_middle', 'len': 6} + commands[0x01a7] = {'macro': 'if_chr_not_talking', 'len': 4} + commands[0x01ab] = {'macro': 'if_num_subdued', 'len': 5} + commands[0x01ad] = {'macro': 'release_grabbed_object', 'len': 3} + commands[0x01ae] = {'macro': 'clear_inventory', 'len': 3} + commands[0x01af] = {'macro': 'grab_object', 'len': 4} + commands[0x01b1] = {'macro': 'shuffle_ruins_pillars', 'len': 18} + commands[0x01b2] = {'macro': 'set_wind_speed', 'len': 3} + commands[0x01b3] = {'macro': 'chr_toggle_p1p2', 'len': 3} + commands[0x01b4] = {'macro': 'cmd01b4_if_something', 'len': 3} + commands[0x01b6] = {'macro': 'enable_snow', 'len': 3} + commands[0x01b7] = {'macro': 'set_chr_cloaked', 'len': 5} + commands[0x01b8] = {'macro': 'set_autogun_target_team', 'len': 4} + commands[0x01b9] = {'macro': 'shuffle_pelagic_switches', 'len': 2} + commands[0x01ba] = {'macro': 'try_attack_lie', 'len': 7} + commands[0x01bd] = {'macro': 'if_training_pc_holographed', 'len': 3} + commands[0x01be] = {'macro': 'if_player_using_device', 'len': 5} + commands[0x01bf] = {'macro': 'teleport_to_pad', 'len': 5} + commands[0x01c0] = {'macro': 'if_teleport_full_white', 'len': 4} + commands[0x01c2] = {'macro': 'set_aishootingatmelist', 'len': 4} + commands[0x01c3] = {'macro': 'set_darkroomlist', 'len': 4} + commands[0x01c6] = {'macro': 'set_chr_dodge_rating', 'len': 4} + commands[0x01c7] = {'macro': 'set_unarmeddodgerating', 'len': 3} + commands[0x01ca] = {'macro': 'set_cutscene_weapon', 'len': 5} + commands[0x01cb] = {'macro': 'fade_to_color', 'len': 8} + commands[0x01cd] = {'macro': 'set_chr_hudpiece_visible', 'len': 4} + commands[0x01ce] = {'macro': 'passive_mode', 'len': 3} + commands[0x01cf] = {'macro': 'set_chr_shooting_in_cutscene', 'len': 4} + commands[0x01d0] = {'macro': 'set_portal_flag', 'len': 5} + commands[0x01d1] = {'macro': 'object_set_modelpart_visible', 'len': 5} + commands[0x01d2] = {'macro': 'emit_sparks', 'len': 3} + commands[0x01d3] = {'macro': 'set_drcaroll_images', 'len': 5} + commands[0x01d4] = {'macro': 'set_room_flag', 'len': 6} + commands[0x01d5] = {'macro': 'show_nonessential_chrs', 'len': 3} + commands[0x01d6] = {'macro': 'configure_environment', 'len': 6} + commands[0x01d9] = {'macro': 'play_sound_from_object2', 'len': 11} + commands[0x01da] = {'macro': 'play_music_continuously', 'len': 3} + commands[0x01db] = {'macro': 'kill', 'len': 3} + commands[0x01dc] = {'macro': 'remove_weapon_from_inventory', 'len': 3} + commands[0x01dd] = {'macro': 'if_music_event_queue_empty', 'len': 4} + commands[0x01de] = {'macro': 'if_coop_mode', 'len': 3} + commands[0x01df] = {'macro': 'if_chr_same_floor_distance_to_pad_lt', 'len': 8} + commands[0x01e0] = {'macro': 'remove_references_to_chr', 'len': 2} + commands[0xdead] = {'macro': 'infloop', 'len': 2} + return commands